Python 从模块运行unittest.main()吗?
我编写了一个动态定义unittest.TestCase类的小函数(下面是一个普通版本) 当我将它从同一个源文件移到它自己的模块中时,我不知道如何让unittest发现新的类。从任一文件调用unittest.main()都不会执行任何测试Python 从模块运行unittest.main()吗?,python,unit-testing,Python,Unit Testing,我编写了一个动态定义unittest.TestCase类的小函数(下面是一个普通版本) 当我将它从同一个源文件移到它自己的模块中时,我不知道如何让unittest发现新的类。从任一文件调用unittest.main()都不会执行任何测试 factory.py: import unittest _testnum = 0 def test_factory(a, b): global _testnum testname = 'dyntest' + str(_testnum)
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()
from factory import test_factory, finish
test_factory(1, 1)
test_factory(1, 2)
if __name__ == '__main__':
finish()
someotherfile.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()
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)
产出(如预期):
.F
======================================================================
失败:testme(\uuuu main\uuuu.dyntest1)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“partb.py”,第11行,在
globals()[testname]=type(testname,(unittest.TestCase,),{'testme':lambda self:self.assertEqual(a,b)})
断言错误:1!=2.
----------------------------------------------------------------------
在0.008s内运行了2次测试
失败(失败=1)
如何使用test_factory()函数,以便从单独的源文件中执行它定义的所有TestCase对象?总体思路(unittest.main为您所做的)是:
根据。通过test\u factory
函数,您的测试用例隐藏在globals()
中,因此只需执行dir()
,找到属于unittest.TestCase
(或名称以'dyntest'
开头的globals实例,然后以这种方式构建套件并运行即可。默认情况下,unittest.main()在主模块中查找单元测试用例对象。测试工厂在自己的模块中创建TestCase对象。这就是为什么将其移出主模块会导致您看到的行为
尝试: