假设我有这两个鼻子测试ExampleTest1.py和ExampleTest2.py
ExampleTest1.py class ExampleTest1(TestBase): """ """ def testExampleTest1(self): ----- ----- if __name__ == "__main__": import nose nose.run() --------------- ExampleTest2.py class ExampleTest2(TestBase): """ """ def testExampleTest2(self): ----- ----- if __name__ == "__main__": import nose nose.run()
现在,我想从一个套件中运行数百个测试文件。
我正在寻找类似TestNG功能的东西,例如testng.xml,在这里我可以添加所有应该逐个运行的测试文件
<suite name="Suite1"> <test name="ExampleTest1"> <classes> <class name="ExampleTest1" /> </classes> </test> <test name="ExampleTest2"> <classes> <class name="ExampleTest2" /> </classes> </test> </suite>
如果python中没有testng.xml之类的功能,那么创建测试套件并在其中包含我所有的python测试的其他选择是什么?谢谢
鉴于您可能要构建测试套件的原因可能有多种,我将提供几种选择。
假设有mytests目录:
mytests
mytests/ ├── test_something_else.py └── test_thing.py
从该目录运行所有测试很容易
$> nosetests mytests/
例如,您可以将烟雾测试,单元测试和集成测试放入不同的目录中,但仍然可以运行“所有测试”:
$> nosetests functional/ unit/ other/
nose.有属性选择器插件。用这样的测试:
import unittest from nose.plugins.attrib import attr class Thing1Test(unittest.TestCase): @attr(platform=("windows", "linux")) def test_me(self): self.assertNotEqual(1, 0 - 1) @attr(platform=("linux", )) def test_me_also(self): self.assertFalse(2 == 1)
您将能够运行具有特定标签的测试:
$> nosetests -a platform=linux tests/ $> nosetests -a platform=windows tests/
最后,nose.main支持suite参数:如果传递了,则 发现不会完成。在这里,我为您提供了有关如何手动构造测试套件然后使用Nose运行它的基本示例:
nose.main
suite
#!/usr/bin/env python import unittest import nose def get_cases(): from test_thing import Thing1Test return [Thing1Test] def get_suite(cases): suite = unittest.TestSuite() for case in cases: tests = unittest.defaultTestLoader.loadTestsFromTestCase(case) suite.addTests(tests) return suite if __name__ == "__main__": nose.main(suite=get_suite(get_cases()))
如您所见,nose.main获得unittest由构造并返回的常规测试套件get_suite。该get_cases功能是您选择的测试用例被“加载”的地方(例如,上面的案例类仅被导入)。
unittest
get_suite
get_cases
如果您确实需要XML,get_cases则可以在这里返回从通过解析的XML文件获得的模块(通过__import__或 导入importlib.import_module)获得的案例类。在nose.main通话附近,您可以argparse用来获取XML文件的路径。
__import__
importlib.import_module
argparse