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

时间:2015-07-06 09:23:06

标签: python pytest

import pytest
class TestSomething(object):

    @pytest.mark.somethinga
    def test_something(self):

在函数 test_something 中,我想检查我给函数标记的是什么,如果函数的行为不同于例如某事物。

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

3 个答案:

答案 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)