python nosetests相当于测试文件中的unittest Testsuite

时间:2013-04-28 22:27:35

标签: python nosetests

在nosetests中,我知道您可以通过nosetests配置文件指定要运行的测试:

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

然而,上面的内容看起来很混乱,并且在添加大量测试时变得更难维护,尤其是无法使用换行符。我发现能够使用单元测试TestSuite功能指定我想要运行的测试更方便。 e.g。

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())

问题:如何指定我的.py文件中的nosetests 应该运行哪些测试?
感谢。
 附:如果有一种通过nosetest配置文件指定测试的方法,该文件不强制所有测试都写在一行上,我也会对它开放,作为第二种选择

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

希望有所帮助。