import pytest
class TestSomething(object):
@pytest.mark.somethinga
def test_something(self):
在函数 test_something 中,我想检查我给函数标记的是什么,如果函数的行为不同于例如某事物。
我想我应该使用inspect.py(内省),但我还没有找到如何做到这一点。非常感谢你们!
答案 0 :(得分:5)
此处无需使用inspect
;装饰器向函数对象添加属性,它不包装对象。来自source code:
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)]
或者你可以只测试属性名称并假设它是一个标记实例:
if hasattr(TestSomething.test_something, 'somethinga'):
# the somethinga mark is set
演示:
>>> 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={}>
答案 1 :(得分:1)
所以基本上当你致电pytest.mark.<attribute>
时,它会将<attribute>
设置为您已装饰/标记的功能的_pytest.mark.Markinfo()
实例。
示例:
<强>代码:强>
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")
<强>输出:强>
$ 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 =====================================
“商标”的“名称”也存储在MarkInfo()
作为属性name
:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 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'
答案 2 :(得分:0)
测试功能标记:
import pytest
@pytest.mark.major_test
def test_foo():
print("Marker:")
print(test_foo.pytestmark[0].name)
assert(True)
Pytest输入标记:
import pytest
@pytest.mark.major_test
def test_bar():
print("Marker:")
print(pytest.config.option.markexpr)
assert(True)