2

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

  • TestOne.py {标签:一,二}
  • TestTwo.py {标签:两个}
  • TestThree.py {标签:三}

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

例如:如果我想用 {tags: Two} 执行测试用例,那么只有测试用例 TestOne.py 和 TestTwo.py 应该被执行。

4

2 回答 2

3

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
于 2013-04-11T06:34:36.667 回答
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 ...
于 2013-04-11T06:19:22.837 回答