繁体   English   中英

python pytest - 如何在其夹具方法中获取测试标记?

[英]python pytest - How can I get a test markers inside its fixture methods?

我在 pytest 中进行了测试,并添加了一些标记,例如:' @pytest.mark.xfail ',测试有几种固定方法。 如何使用夹具方法获得某些测试的所有标记?

可以使用iter_markers从夹具请求node属性中获取标记,如以下(无意义的)示例所示:

import pytest


@pytest.fixture
def get_marks(request):
    marks = [m.name for m in request.node.iter_markers()]
    if request.node.parent:
        marks += [m.name for m in request.node.parent.iter_markers()]
    yield marks


@pytest.mark.parametrize('number', [1, 2, 3])
@pytest.mark.foo
@pytest.mark.xfail
def test_marks(get_marks, number):
    print(get_marks)
    assert 'xfail' in get_marks
    assert number == 42

这给出了 output:

...
xfail                                      [100%]['parametrize', 'xfail', 'foo']

get_marks = ['parametrize', 'xfail', 'foo'], number = 3

    @pytest.mark.parametrize('number', [1, 2, 3])
    @pytest.mark.foo
    @pytest.mark.xfail
    def test_marks(get_marks, number):
        print(get_marks)
        assert 'xfail' in get_marks
>       assert number == 42
E       assert 3 == 42

更新:使用正确的公开调用来获取@hoefling 建议的标记。

@MrBean 已经描述了一种方法,这是在conftest.py中使用pytest_runtest_setup的另一种方法。 通过全局变量和pytest_runtest_setup自己的方法 pytest_runtest_setup 的组合,您可以获得当前的测试标记。

这种方法将为您提供 class 级别和 function 级别的标记。

conftest.py

import pytest

marker_name = [] #Global variable so you can use it everywhere

def pytest_runtest_setup(item):
    global marker_name
    marker_name.clear() #If you would not clear this, it would append every test's marker, test by test. 
    for mark in item.iter_markers():
        marker_name.append(mark.name)


@pytest.fixture(scope='function', autouse=True) #Note here, autouse=true.
def my_fixture(request):
    request.instance.test_marker=marker_name #assign it to request's session so you can use it in other fixture and in tests as well

@pytest.fixture
def some_other_fixture(request):
    test_marker=request.instance.test_marker #access marker in fixture

test_file.py (使用 request.instance.test_marker 在测试中访问该标记变量。)

import pytest


@pytest.mark.class_marker
class TestClass:
    @pytest.mark.my_test
    @pytest.mark.xfail
    def test_foo(self,request):
        print(request.instance.test_marker) #output :  ['xfail', 'my_test', 'class_marker']

    @pytest.mark.my_test_two
    @pytest.mark.xfail
    def test_foo_two(self,request):
        print(request.instance.test_marker) #output :  ['xfail', 'my_test_two', 'class_marker']

希望它会有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM