当我发现一个我不理解的怪异行为时,我试图动态创建测试函数。为了简化理解,我将代码简化为此代码。我正在python 3.6.7上运行它
代码:
import unittest
class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('SET UP')
def test_x(self):
print('hi')
x = MyTestCase # <-This causes the test function to run twice, Why???
if __name__ == "__main__":
print('test start')
unittest.main()
print('test end') # <- This does not get printed
输出:
test start
SET UP
hi
.hi
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
如您所见,测试功能test_x被运行两次,并且最后一个print语句未执行
所以我的问题是:
答案 0 :(得分:1)
1。为什么测试功能运行两次?
因为unittest
代码在模块的命名空间中找到两个对象,它们是unittest.TestCase
类,MyTestCase
和x
。它不会检查这些对象实际上是 same 对象。 (嗯,它对此有些了解,因为它不会将x
当作要测试的新类,因此不会再次调用setUpClass
;参见"Class and Module Fixtures"。)
2。为什么不执行打印语句print('test end')?
默认情况下,unittest.main()
在运行测试后会调用sys.exit()
。您可以通过添加参数exit=False
来禁用此功能:
if __name__ == "__main__":
print('test start')
unittest.main(exit=False)
print('test end')