有没有办法在py文件中添加元数据以进行分组测试?

时间:2013-04-11 06:12:24

标签: python metadata unittest2

假设我在不同的文件中有以下测试用例

  • TestOne.py {tags:One,Two}
  • TestTwo.py {tags:Two}
  • TestThree.py {tags:Three}

每个都继承自unittest.TestCase。 python中是否有能力在这些文件中嵌入元数据信息,以便我可以使用main.py脚本来搜索这些标记并仅执行那些测试用例?

对于例如:如果我想用{tags:Two}执行测试用例,则只应执行测试用例TestOne.py和TestTwo.py。

2 个答案:

答案 0 :(得分:3)

py.test测试框架通过他们所谓的markers支持元数据。

对于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

答案 1 :(得分:2)

当然,在主模块中定义标签更容易,但是如果用测试文件保存它们很重要,那么在这样的测试文件中定义它可能是一个很好的解决方案:

在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 ...