nose2:从导入的模块运行测试

时间:2015-07-28 10:23:59

标签: python unit-testing python-unittest nose2

我生成并导入了一个包含我想用nose2运行的测试的模块。以下是创建和导入模块的代码:

import sys
import imp
import nose2


def import_code(code, name):
    module = imp.new_module(name)
    exec code in module.__dict__
    sys.modules[name] = module
    return module

code_to_test = ("""
def test_foo():
    print "hello test_foo"
""")

module_to_test = import_code(code_to_test, 'moduletotest')

# now how can I tell nose2 to run the test?

编辑:我通过使用临时文件解决了这个问题。它适用于我,但我仍然对如何通过动态生成模块感到好奇。以下是使用临时文件执行此操作的代码:

import tempfile
import nose2
import os


def run_test_from_temp_file():
    (_, temp_file) = tempfile.mkstemp(prefix='test_', suffix='.py')
    code = ("""
def test_foo():
    print 'hello foo'
""")
    with open(temp_file, 'w') as f:
        f.write(code)
    path_to_temp_file = os.path.dirname(temp_file)
    module = os.path.splitext(os.path.basename(temp_file))[0]
    nose2_args = ['fake_arg_to_fool_nose', module, '--verbose', '-s',
                  path_to_temp_file]
    nose2.discover(argv=nose2_args, exit=False)

2 个答案:

答案 0 :(得分:0)

如果有人对如何用鼻子做这件事感兴趣(不是鼻子2——我没试过),这里是:

from nose.loader import TestLoader
from nose import run

modules_to_test = [module_to_test]

test_loader = TestLoader()
context_suites = list(map(test_loader.loadTestsFromModule, modules_to_test))
run(suite=context_suites, argv=['-s', '-v'])

其中 module_to_test 是问题中提到的包含测试的模块。我已经使用 -s-v 参数来演示如何像在命令行上一样传递其他参数,但它们不是必需的。上述解决方案还可以通过在 modules_to_test 列表中放置其他模块来处理多个模块。

答案 1 :(得分:-1)

有两种方法可以执行鼻子。有一个名为nosetests的发行版附带的独立程序。您可以将单元测试作为选项传递给您的文件:

  

nosetests unittests.py

或指定一个模块:

  

nosetests mymodule.test

或者在您的测试模块中,您可以通过在程序中调用nose.main()或nose.run()来调用nose库并让它运行。