请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

UnitTest 通过继承获取失败

在通过多继承获取属性和方法时
图片描述

代码在执行过程中走到了 __getattr__ 方法是怎么回事?
图片描述

报错提示没有 __unittest_expecting_failure__ 这个方法,然后在__getattr__ 方法被拦截下来。
但是在代码中直接实例化这个对象就可以正常运行
图片描述

正在回答

2回答

同学,把报错截一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_Brilliantsun_0 #1
    我用的是第二种定位方法。
    回复 有任何疑惑可以回复我~ 2021-04-20 22:41:49
  • 托尼老师 回复 提问者 qq_Brilliantsun_0 #2
    注意,使用第二种定位策略编写PO,在执行测试时,必须要使用实例化PO的方式,在测试类中进行测试,不能使用测试类继承PO的方式。
    
    原因:
    
    PO中定义了__getattr__特殊方法后,继承了PO和TestCase的子类在使用self访问实例属性时,会自动执行父类PO的__getattr__方法,而测试类在执行开始时,首先会实例化,然后unittest会进行测试初始化的一系列操作,这些操作中会以self.attr的方式访问测试类实例的实例属性,这时候就会执行__getattr__方法,所以当unittest源码执行到这一句:
     expecting_failure_method = getattr(testMethod,
                                               "__unittest_expecting_failure__", False)
            expecting_failure_class = getattr(self,
                                              "__unittest_expecting_failure__", False)
    必然报错,因为要访问的实例属性__unittest_expecting_failure__肯定不在PO的locators中。
    同学,理解了吗?
    
    相对应的,如果是第一种方式编写的PO,除了使用继承的方式进行测试外,是否能用PO实例化的方式来测试?同学可以实践一下,两相对比,可以加深理解。
    回复 有任何疑惑可以回复我~ 2021-04-21 10:02:37
  • 提问者 qq_Brilliantsun_0 回复 托尼老师 #3
    原来是这样的,谢谢老师的讲解。
    回复 有任何疑惑可以回复我~ 2021-05-04 11:55:45
提问者 qq_Brilliantsun_0 2021-04-20 22:08:09

Traceback (most recent call last):

  File "D:\Development\PyCharm 2021.1\plugins\python\helpers\pycharm\_jb_unittest_runner.py", line 35, in <module>

    sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not JB_DISABLE_BUFFERING))


https://img1.sycdn.imooc.com//szimg/607ee07e091fa2c811650607.jpg

  File "D:\Development\Python\lib\unittest\main.py", line 101, in __init__

    self.runTests()

  File "D:\Development\Python\lib\unittest\main.py", line 271, in runTests

    self.result = testRunner.run(self.test)

  File "D:\Development\PyCharm 2021.1\plugins\python\helpers\pycharm\teamcity\unittestpy.py", line 310, in run

    return super(TeamcityTestRunner, self).run(test)

  File "D:\Development\Python\lib\unittest\runner.py", line 176, in run

    test(result)

  File "D:\Development\Python\lib\unittest\suite.py", line 84, in __call__

    return self.run(*args, **kwds)

  File "D:\Development\Python\lib\unittest\suite.py", line 122, in run

    test(result)

  File "D:\Development\Python\lib\unittest\suite.py", line 84, in __call__

    return self.run(*args, **kwds)

  File "D:\Development\Python\lib\unittest\suite.py", line 122, in run

    test(result)

  File "D:\Development\Python\lib\unittest\case.py", line 676, in __call__

    return self.run(*args, **kwds)

  File "D:\Development\Python\lib\unittest\case.py", line 617, in run

    "__unittest_expecting_failure__", False)

  File "E:\封装页面基类-方法一\page\po.py", line 37, in __getattr__

    raise UnPositioningElement(loc)

error.UnPositioningElement: Page 中 __getattr__ 参数错误:在当前locators找不到元素__unittest_expecting_failure__, 请将要定位的元素添加到 locators 中!


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信