假设我在不同的文件中有以下测试用例
- TestOne.py {tags: One, Two}
- TestTwo.py {tags: Two}
- TestThree.py {tags: Three}
每一个都继承自unittest.TestCase。python中是否有能力在这些文件中嵌入元数据信息,以便我可以使用main.py脚本来搜索这些标记并仅执行这些测试用例?
For example:如果我想执行带有{tags: Two}的testcases,那么只应该执行TestOne.py和TestTwo.py。
py.test
测试框架支持元数据,通过他们所谓的标记。
对于py.test
,测试用例是名称以"test"开头的函数,并且位于名称以"test"开头的模块中。测试本身是简单的assert
语句。py.test
还可以运行unittest
库的测试和IIRC Nose测试。
元数据由测试函数动态生成的装饰器组成。装饰器的形式是:@pytest.mark.my_meta_name
。您可以为my_meta_name
选择任何内容。您可以在py.test --markers
中看到一些预定义的标记。
以下是他们文档中的一个改编片段:
# content of test_server.py
import pytest
@pytest.mark.webtest
def test_send_http():
pass # perform some webtest test for your app
def test_always_succeeds():
assert 2 == 3 - 1
def test_will_always_fail():
assert 4 == 5
使用测试运行器的-m
命令行选项选择已标记的测试。要选择性地运行test_send_http()
,请在shell中输入以下命令:
py.test -v -m webtest
当然,在主模块中定义标签更容易,但如果将它们与测试文件一起保存对您来说很重要,那么在测试文件中定义它可能是一个很好的解决方案,如下所示:
在TestOne.py:test_tags = ['One', 'Two']
...
那么你就可以用这种方式读取主模块initialize
函数中的所有标签:
test_modules = ['TestOne', 'TestTwo', 'TestThree']
test_tags_dict = {}
def initialize():
for module_name in test_modules:
module = import_string(module)
if hasattr(module, 'test_tags'):
for tag in module.test_tags:
if tag not in test_tags_dict:
test_tags_dict[tag] = []
test_tags_dict[tag].append(module)
因此,您可以实现run_test_with_tag
函数来运行特定标记的所有测试:
def run_test_with_tag(tag):
for module in test_tags_dict.get(tag, []):
# Run module tests here ...