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

Python py.test:可以在测试功能级别应用多个标记吗?,python,pytest,markers,Python,Pytest,Markers,我从中看到,我们可以在类或模块级别一次应用多个标记。我没有找到在测试功能级别执行此操作的文档。以前有人成功地做到了这一点吗 理想情况下,我希望将其作为一个标记列表来完成,就像在上述文档中为类所做的那样,例如(引用文档): 因此,pytest文档讨论了使用pytestmark在类和模块级别指定标记。然而,它并没有提到在测试功能级别有类似的功能。我必须在测试函数的顶部单独指定标记,以便用每个标记对它们进行标记。随着测试函数顶部标记数量的增加,这使得测试代码看起来有点笨拙 test_example.p

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

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

因此,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

我自己没试过。然而,快速看一下,我认为class
MarkDecorator
就是您想要的。尝试:

mark_names=["marker1", "marker2", "marker3"]
my_marks = pytest.MarkDecorator(*mark_names)
marked_test_function = my_marks(test_function)
*mark\u names
只是将
mark\u names
解压到
MarkDecorator
的构造函数参数中。然后将存储的标记(
self.args
)应用于参数,此处为
test\u function
,以提供标记的测试功能

您还可以使用
def unmarked_test_function()…
test_function=my_marks(unmarked_test_function)
这样就不必更改名称


添加了解释:我是从
pytest.mark
得到的,它是一个
MarkGenerator
singleton
MarkGenerator
创建
MarkDecorator
类,然后将这些类作为decorator应用。上面的代码手动模拟该过程,填充多个标记。

对于函数,您只需重复decorator:

@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(...):
    ...
或者您可以使用“我的图书馆”等通用作文:

from funcy import compose

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

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

可能会用一些简单的测试函数声明一些代码,然后重试;-)?我还不清楚的是,你指的是关于类的标记列表。。。也许还有一个简短的示例,以便人们可以在他们的提案中添加此内容?谢谢,我已编辑了此问题。现在让我知道它是否有意义?
from funcy import compose

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