You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在模块级pytest fixture中访问测试用例的pytest.mark标记

问题原因与解决方案

错误原因

当你给fixture设置scope="module"时,request.node对应的是整个测试模块(比如test_my_code.py对应的模块对象),而你的@pytest.mark.mymark标记是加在单个测试函数上的——模块本身没有这个标记,所以request.node.get_closest_marker("mymark")返回None,调用.args自然触发AttributeError: 'NoneType' object has no attribute 'args'。

而移除scope="module"后,fixture默认是function级作用域,此时request.node指向当前执行的测试函数对象,刚好带有你定义的mymark标记,所以能正常获取.args参数。

解决方案

方案1:使用默认的function级fixture(推荐)

如果你的标记是针对单个测试用例的,直接保持fixture的默认作用域即可,不需要显式声明scope:

# conftest.py
import pytest

@pytest.fixture
def my_fixture(request):
    my_mark = request.node.get_closest_marker("mymark").args
    return my_mark

方案2:必须用module级fixture时的处理

如果业务需求必须使用module级fixture,同时要获取测试用例上的标记,可以遍历模块内的测试项来查找:

# conftest.py
import pytest

@pytest.fixture(scope="module")
def my_fixture(request):
    # 遍历模块下的所有测试用例,查找带mymark标记的项
    my_mark_args = None
    for test_item in request.node.items:
        mark = test_item.get_closest_marker("mymark")
        if mark:
            my_mark_args = mark.args
            break  # 取第一个匹配的标记,可根据需求调整逻辑
    return my_mark_args

注意:如果模块内有多个带mymark的测试用例,上述代码只会取第一个的标记参数,可根据实际需求修改遍历逻辑。

方案3:给模块添加标记

如果希望整个模块的测试用例都共享该标记,可以直接给模块添加标记,这样module级fixture就能直接获取:

# test_my_code.py
import pytest

# 给整个模块添加标记
pytestmark = pytest.mark.mymark("test", "mark")

def test_the_code():
    assert 1 == 1

此时conftest.py中的module级fixture就能正常获取标记参数:

# conftest.py
import pytest

@pytest.fixture(scope="module")
def my_fixture(request):
    my_mark = request.node.get_closest_marker("mymark").args
    return my_mark

内容的提问来源于stack exchange,提问作者NPatel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:58:13