我正在使用 py.test 构建功能测试框架,因此我需要能够指定要运行的确切测试。我了解动态测试集合的美妙之处,但我希望能够先运行我的测试环境健康检查,然后再运行我的回归测试;该分类并不排除将这些集合中的测试用于其他目的。
测试套件将与 Jenkins 构建项目相关联。我正在使用 osx、python 2.7.3、py.test 2.3.4。
所以我有一个如下的测试用例:
# sample_unittest.py
import unittest, pytest
class TestClass(unittest.TestCase):
def setUp(self):
self.testdata = ['apple', 'pear', 'berry']
def test_first(self):
assert 'apple' in self.testdata
def test_second(self):
assert 'pear' in self.testdata
def tearDown(self):
self.testdata = []
def suite():
suite = unittest.TestSuite()
suite.addTest(TestClass('test_first'))
return suite
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite())
我有一个这样的测试套件:
# suite_regression.py
import unittest, pytest
import functionaltests.sample_unittest as sample_unittest
# set up the imported tests
suite_sample_unittest = sample_unittest.suite()
# create this test suite
suite = unittest.TestSuite()
suite.addTest(suite_sample_unittest)
# run the suite
unittest.TextTestRunner(verbosity=2).run(suite)
如果我从命令行对套件运行以下命令,test_first 会运行(但我没有得到 py.test 将提供的附加信息):
python 功能测试/suite_regression.py -v
如果我对套件运行以下命令,则会收集 0 个测试:
py.test 功能测试/suite_regression.py
如果我对测试用例运行以下命令,则 test_first 和 test_second 运行:
py.test 功能测试/sample_unittest.py -v
我看不出用关键字做 py.test 将如何帮助将测试组织成套件。将测试用例放入文件夹结构并使用文件夹选项运行 py.test 不会让我按功能区域组织测试。
所以我的问题:
- 是否有 py.test 机制以可重用格式指定任意测试分组?
- 有没有办法使用 py.test 中的 unittest.TestSuite?
编辑:所以我尝试了 py.test 标记,它可以让我用任意标签标记测试函数和测试方法,然后在运行时过滤该标签。
# conftest.py
import pytest
# set up custom markers
regression = pytest.mark.NAME
health = pytest.mark.NAME
我更新的测试用例:
# sample_unittest.py
import unittest, pytest
class TestClass(unittest.TestCase):
def setUp(self):
self.testdata = ['apple', 'pear', 'berry']
@pytest.mark.healthcheck
@pytest.mark.regression
def test_first(self):
assert 'apple' in self.testdata
@pytest.mark.regression
def test_second(self):
assert 'pear' in self.testdata
def tearDown(self):
self.testdata = []
def suite():
suite = unittest.TestSuite()
suite.addTest(TestClass('test_first'))
return suite
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite())
因此,运行以下命令会收集并运行 test_first:
py.test 功能测试/sample_unittest.py -v -m healthcheck
这会收集并运行 test_first 和 test_second:
py.test 功能测试/sample_unittest.py -v -m 回归
所以回到我的问题:标记是一个部分解决方案,但我仍然没有办法控制收集的标记测试的执行。