调用 TestCase class 导致函数 运行 两次

Calling TestCase class cause functions to run twice

当我注意到一个我不理解的奇怪行为时,我正在尝试动态创建测试函数。为了便于理解,我已将代码简化为这样。我 运行 在 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被运行两次,最后的打印语句没有被执行

所以我的问题是:

  1. 为什么测试函数 运行 两次?
  2. 为什么打印语句print('test end')没有执行?

1.为什么测试函数 运行 两次?

因为 unittest 代码在模块的命名空间中找到 两个 对象,它们是 unittest.TestCase classes,MyTestCasex。它不会检查这些实际上是 相同的 对象。 (好吧,它有 一些 对此的认识,因为它不会将 x 视为要测试的新 class,因此它不会调用再次 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')