2013-04-28 108 views
2

在nosetests,我知道,你可以指定你想通过nosetests运行配置文件,这样在此进行测试:蟒蛇nosetests相当于单元测试测试工具的测试文件

[nosetests] 
tests=testIWT_AVW.py:testIWT_AVW.tst_bynd1,testIWT_AVW.py:testIWT_AVW.tst_bynd3 

然而,上述只是看起来凌乱并且在添加大量测试时变得更难以维护,特别是不能使用换行符。我发现使用unittests TestSuite功能能够指定要运行哪些测试更方便。例如

def custom_suite(): 

    suite = unittest.TestSuite() 
    suite.addTest(testIWT_AVW('tst_bynd1')) 
    suite.addTest(testIWT_AVW('tst_bynd3')) 
    return suite 
if __name__=="__main__": 

    runner = unittest.TextTestRunner() 
    runner.run(custom_suite()) 

问题:我如何指定测试应该由nosetests 我.py文件运行?
谢谢。
P.S.如果有一种方法可以通过一个不需要强制所有测试写在一行上的nosetest配置文件来指定测试,我也可以开放它作为第二个替代方案

回答

4

我不完全确定是否要以编程方式或从命令行运行测试。无论哪种方式,这应该涵盖:

import itertools 

from nose.loader import TestLoader 
from nose import run 
from nose.suite import LazySuite 

paths = ("/path/to/my/project/module_a", 
     "/path/to/my/project/module_b", 
     "/path/to/my/project/module_c") 

def run_my_tests(): 
    all_tests =() 
    for path in paths: 
     all_tests = itertools.chain(all_tests, TestLoader().loadTestsFromDir(path)) 
    suite = LazySuite(all_tests) 
    run(suite=suite) 

if __name__ == '__main__': 
    run_my_tests() 

注意,nose.suite.TestLoader对象有许多可供加载测试不同的方法。

您可以从其他代码调用run_my_tests方法,也可以使用python解释器从命令行运行此命令,而不是通过鼻子运行。如果你有其他鼻子配置,你可能需要以编程方式传递它。

1

如果我正确理解你的的问题,你有几种选择在这里:

  • 您可以用特殊的鼻子装饰标记你的测试:istestnottest。见docs
  • 你可以标记测试与tags
  • ,您可以加入测试用例test suites。我自己并没有使用它,但似乎你必须覆盖鼻子的默认测试发现,以尊重你的测试套件(见docs

希望有所帮助。

+0

谢谢,但不幸的不是。我可以通过将方法名称从tstXXXX更改为testXXXX来完成类似的操作,并且它们会自动运行。我希望能够创建自定义套件:因为这将是一种更有效的方式来运行某个测试组,而不是运行另一组测试。 – gorbysbm 2013-04-28 23:39:28

+0

对,谢谢。我添加了更多选项,请检查它是否有帮助。 – alecxe 2013-04-29 05:30:35

+0

谢谢,测试套件看起来很有希望。如果有人能够提供一个将是盛大的工作示例 – gorbysbm 2013-05-04 02:05:59