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