我编写了一个动态定义unittest.TestCase类的小函数(下面的普通版本)。
当我将它从同一个源文件中移出到自己的模块中时,我无法弄清楚如何通过unittest来发现新类。从任一文件调用unittest.main()都不会执行任何测试。
factory.py
:
import unittest
_testnum = 0
def test_factory(a, b):
global _testnum
testname = 'dyntest' + str(_testnum)
globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})
_testnum += 1
def finish():
unittest.main()
someotherfile.py
:
from factory import test_factory, finish
test_factory(1, 1)
test_factory(1, 2)
if __name__ == '__main__':
finish()
输出:
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
所以它不会执行任何测试。
请注意,将所有内容保存在同一个文件中的工作方式如下:
import unittest
_testnum = 0
def test_factory(a, b):
global _testnum
testname = 'dyntest' + str(_testnum)
globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})
_testnum += 1
test_factory(1, 1)
test_factory(1, 2)
if __name__ == '__main__':
unittest.main()
输出(如预期):
.F
======================================================================
FAIL: testme (__main__.dyntest1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "partb.py", line 11, in <lambda>
globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})
AssertionError: 1 != 2
----------------------------------------------------------------------
Ran 2 tests in 0.008s
FAILED (failures=1)
我如何使用我的test_factory()函数,以便我可以从单独的源文件中执行它定义的所有TestCase对象?
答案 0 :(得分:9)
一般的想法(unittest.main为你做的)是:
suite = unittest.TestLoader().loadTestsFromTestCase(SomeTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)
根据http://docs.python.org/library/unittest.html?highlight=unittest#module-unittest。您的测试用例被globals()
函数隐藏在test_factory
中,因此只需执行dir()
,找到unittest.TestCase
实例的全局变量(或名称以{开头的名称) {1}}等等,只需按照这种方式构建你的套件并运行它。
答案 1 :(得分:7)
默认情况下,unittest.main()在主模块中查找单元TestCase对象。 test_factory在自己的模块中创建TestCase对象。这就是为什么将它移出主模块会导致你看到的行为。
尝试:
def finish():
unittest.main(module=__name__)