py.test :可以在测试功能级别应用多个标记吗?

Posted

技术标签:

【中文标题】py.test :可以在测试功能级别应用多个标记吗?【英文标题】:py.test : Can multiple markers be applied at the test function level? 【发布时间】:2016-11-15 02:11:52 【问题描述】:

我从the pytest docs 看到我们可以在类或模块级别上一次应用多个标记。我没有找到在测试功能级别执行此操作的文档。有没有人成功地做到过这一点?

理想情况下,我希望将其作为标记列表,如在上述文档中为类所做的那样,例如(引用自文档):

class TestClass:
    pytestmark = [pytest.mark.webtest, pytest.mark.slowtest]

因此,pytest 文档讨论了使用pytestmark 在类和模块级别指定标记。但是,它并没有谈到在测试功能级别有类似的东西。我必须在测试函数的顶部单独指定标记,以便用它们中的每一个标记它们。随着测试函数顶部标记数量的增加,这使得测试代码看起来有点笨拙。

test_example.py:

pytestmark = [class1, class2]

class TestFeature(TestCase):

    @pytest.mark.marker1
    @pytest.mark.marker2
    @pytest.mark.marker3
    def test_function(self):
        assert True

【问题讨论】:

也许用简单的测试功能说明一些代码并尝试;-)?我还不清楚的是,你所指的是与类有关的标记列表......也许也是一个简短的样本,所以人们可以在他们的提案中添加这个? 谢谢,我已经编辑了这个问题。让我知道现在是否有意义? 【参考方案1】:

对于函数,您只需重复装饰器:

@pytest.mark.webtest
@pytest.mark.slowtest
def test_something(...):
    ...

如果你想在多个测试中重复使用它,你应该记住装饰器只是返回装饰物的函数,所以几个装饰器只是一个组合:

def compose_decos(decos):
    def composition(func):
        for deco in reversed(decos):
            func = deco(func)
        return func
    return composition

all_marks = compose_decos(pytest.mark.webtest, pytest.mark.slowtest)

@all_marks
def test_something(...):
    ...

或者您可以使用通用组合,例如我的 funcy 库有:

from funcy import compose

all_marks = compose(pytest.mark.webtest, pytest.mark.slowtest)

请注意,通过这种方式,您可以编写任何装饰器,而不仅仅是 pytest 标记。

【讨论】:

【参考方案2】:

我自己没试过。但是,快速浏览一下the source,我认为MarkDecorator 是你想要的。试试:

mark_names=["marker1", "marker2", "marker3"]
my_marks = pytest.MarkDecorator(*mark_names)
marked_test_function = my_marks(test_function)

*mark_names 只是将mark_names 解包到MarkDecorator 的构造函数参数中。 MarkDecorator.__call__ 然后将存储的标记 (self.args) 应用于参数,此处为 test_function,以提供标记的测试功能。

您也可以使用def unmarked_test_function() ...test_function=my_marks(unmarked_test_function),这样您就不必更改名称。

补充说明:我是从pytest.mark 那里得到的,其中turns out to be 是MarkGenerator 单例。 MarkGenerator 创建 MarkDecorator 类,然后将其用作装饰器。上面的代码手动模拟了这个过程,填充了多个标记。

【讨论】:

已弃用:github.com/pytest-dev/pytest/blob/…

以上是关于py.test :可以在测试功能级别应用多个标记吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在伪造查看器中添加一次选择多个标记的功能吗

pytest之标记mark

pytest文档31-allure标记用例级别severity

在测试中创建和导入辅助函数,而不使用 py.test 在测试目录中创建包

我可以跨同一个 python 包的模块重用导入吗?

您可以在 SpecFlow 的场景大纲中标记各个示例吗?