从模块运行unittest.main()?

ʞɔı*_*ɔıu 2 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)

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})

    _testnum += 1


def finish():
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

someotherfile.py:

from factory import test_factory, finish


test_factory(1, 1)
test_factory(1, 2)


if __name__ == '__main__':
    finish()
Run Code Online (Sandbox Code Playgroud)

输出:

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Run Code Online (Sandbox Code Playgroud)

所以它不执行任何测试.

请注意,将它们全部保存在同一个文件中可以正常工作:

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()
Run Code Online (Sandbox Code Playgroud)

输出(如预期):

.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)
Run Code Online (Sandbox Code Playgroud)

我如何使用我的test_factory()函数,以便我可以从一个单独的源文件中执行它定义的所有TestCase对象?

Ale*_*lli 9

一般的想法(unittest.main为你做的)是:

suite = unittest.TestLoader().loadTestsFromTestCase(SomeTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)
Run Code Online (Sandbox Code Playgroud)

根据http://docs.python.org/library/unittest.html?highlight=unittest#module-unittest.你的测试用例被函数隐藏globals()test_factory,所以只需要做一个dir(),找到作为实例的全局变量unittest.TestCase(或者以名称开头的'dyntest'等等),然后以这种方式构建你的套件并运行它.


小智 8

默认情况下,unittest.main()在主模块中查找单元TestCase对象.test_factory在自己的模块中创建TestCase对象.这就是为什么将它移出主模块会导致你看到的行为.

尝试:

def finish():
    unittest.main(module=__name__)
Run Code Online (Sandbox Code Playgroud)