调用 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被运行两次,最后的打印语句没有被执行
所以我的问题是:
- 为什么测试函数 运行 两次?
- 为什么打印语句print('test end')没有执行?
1.为什么测试函数 运行 两次?
因为 unittest
代码在模块的命名空间中找到 两个 对象,它们是 unittest.TestCase
classes,MyTestCase
和x
。它不会检查这些实际上是 相同的 对象。 (好吧,它有 一些 对此的认识,因为它不会将 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')
当我注意到一个我不理解的奇怪行为时,我正在尝试动态创建测试函数。为了便于理解,我已将代码简化为这样。我 运行 在 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('test end')没有执行?
1.为什么测试函数 运行 两次?
因为 unittest
代码在模块的命名空间中找到 两个 对象,它们是 unittest.TestCase
classes,MyTestCase
和x
。它不会检查这些实际上是 相同的 对象。 (好吧,它有 一些 对此的认识,因为它不会将 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')