Python 如何获取测试函数的pytest标记的名称?

Python 如何获取测试函数的pytest标记的名称?,python,pytest,Python,Pytest,在函数测试\u something中,我想检查我给函数做了什么标记,如果它是某个东西,那么函数的行为就不同于,例如某个东西 我想我应该使用inspect.py(内省),但我还没有找到如何做到这一点。非常感谢大家 此处无需使用inspect;装饰器向函数对象添加属性,但不包装对象。从: 您可以通过迭代函数属性来检测设置了哪些名称: holder = getattr(func, self.name, None) if holder is None: holder = MarkInfo(

在函数测试\u something中,我想检查我给函数做了什么标记,如果它是某个东西,那么函数的行为就不同于,例如某个东西


我想我应该使用inspect.py(内省),但我还没有找到如何做到这一点。非常感谢大家

此处无需使用
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)
或者,您可以只测试属性名称,并假设它是一个标记实例:

from _pytest.mark import MarkInfo

def function_marks(func):
    return [name for name, ob in vars(func).items() if isinstance(ob, MarkInfo)]
演示:

导入pytest >>>从_pytest.mark导入MarkInfo >>>@pytest.mark.foo ... @pytest.mark.bar ... def demo():通过 ... >>>[名称表示名称,变量中的ob(演示).items()如果是instance(ob,MarkInfo)] ['foo','bar'] >>>demo.foo >>>demo.bar
因此,基本上当您调用
pytest.mark.
时,它将
设置为您修饰/标记的函数上的
\u pytest.mark.Markinfo()
的实例

例如:

代码:

>>> 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={}>
import pytest
from _pytest.mark import MarkInfo


@pytest.mark.foo
def test_foo():
    assert hasattr(test_foo, "foo")
    assert isinstance(test_foo.foo, MarkInfo)


def test_bar():
    assert not hasattr(test_bar, "foo")
输出:

>>> 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={}>
import pytest
from _pytest.mark import MarkInfo


@pytest.mark.foo
def test_foo():
    assert hasattr(test_foo, "foo")
    assert isinstance(test_foo.foo, MarkInfo)


def test_bar():
    assert not hasattr(test_bar, "foo")

“标记”的“名称”也存储在
MarkInfo()
中,作为属性
name

$ py.test -x -s -v test_foo.py 
======================================= test session starts ========================================
platform linux2 -- Python 2.7.9 -- py-1.4.20 -- pytest-2.5.2 -- /home/prologic/bin/python
cachedir: /home/prologic/tmp/.cache
plugins: pylama, cov, cache, pep8, flakes
collected 2 items 

test_foo.py:5: test_foo PASSED
test_foo.py:11: test_bar PASSED

===================================== 2 passed in 0.01 seconds =====================================
测试功能标记:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /home/prologic/tmp/test_foo.py(8)test_foo()
-> assert hasattr(test_foo, "foo")
(Pdb) dir(test_foo.foo)
['__doc__', '__init__', '__iter__', '__module__', '__repr__', '_arglist', 'add', 'args', 'kwargs', 'name']
(Pdb) test_foo.foo.name
'foo'
Pytest输入标记:

import pytest

@pytest.mark.major_test
def test_foo():
        print("Marker:")
        print(test_foo.pytestmark[0].name)
        assert(True)


decorator应该改变函数的行为,而不是相反(函数本身根据decorator而改变)。。。
import pytest

@pytest.mark.major_test
def test_bar():
        print("Marker:")
        print(pytest.config.option.markexpr)
        assert(True)