调用TestCase类会使函数运行两次

时间:2018-11-29 02:46:34

标签: python python-3.x python-unittest

当我发现一个我不理解的怪异行为时,我试图动态创建测试函数。为了简化理解,我将代码简化为此代码。我正在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语句未执行

所以我的问题是:

  1. 为什么测试功能运行两次?
  2. 为什么不执行打印语句print('test end')?

1 个答案:

答案 0 :(得分:1)

1。为什么测试功能运行两次?

因为unittest代码在模块的命名空间中找到两个对象,它们是unittest.TestCase类,MyTestCasex。它不会检查这些对象实际上是 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')