如何获得测试功能的pytest标记的名称?

Jim*_*nts 2 python pytest

import pytest
class TestSomething(object):

    @pytest.mark.somethinga
    def test_something(self):
Run Code Online (Sandbox Code Playgroud)

在函数test_something中,我要检查给函数赋予的标记,如果是某某,则该函数的行为与某某不同(例如,某某b)

我认为我应该使用inspect.py(自省),但是我还没有找到如何做的方法。非常感谢你们!

Mar*_*ers 5

这里不需要使用inspect;装饰器将一个属性添加到函数对象,但不包装该对象。从源代码

holder = getattr(func, self.name, None)
if holder is None:
    holder = MarkInfo(
        self.name, self.args, self.kwargs
    )
    setattr(func, self.name, holder)
else:
    holder.add(self.args, self.kwargs)
Run Code Online (Sandbox Code Playgroud)

您可以通过遍历函数属性来检测设置了哪些名称:

from _pytest.mark import MarkInfo

def function_marks(func):
    return [name for name, ob in vars(func).items() if isinstance(ob, MarkInfo)]
Run Code Online (Sandbox Code Playgroud)

或者您可以仅测试属性名称并假定它是标记实例:

if hasattr(TestSomething.test_something, 'somethinga'):
    # the somethinga mark is set
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import pytest
>>> from _pytest.mark import MarkInfo
>>> @pytest.mark.foo
... @pytest.mark.bar
... def demo(): pass
... 
>>> [name for name, ob in vars(demo).items() if isinstance(ob, MarkInfo)]
['foo', 'bar']
>>> demo.foo
<MarkInfo 'foo' args=() kwargs={}>
>>> demo.bar
<MarkInfo 'bar' args=() kwargs={}>
Run Code Online (Sandbox Code Playgroud)