Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从模块运行unittest.main()吗?_Python_Unit Testing - Fatal编程技术网

Python 从模块运行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)

我编写了一个动态定义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()
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对象。这就是为什么将其移出主模块会导致您看到的行为

尝试: