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

调用含Pytest Fixture的类方法时参数缺失,如何正确调用?

问题原因及解决方法

问题原因

  • 你直接调用了类实例方法subscriber_groups_ID(),但这个方法需要三个必要参数:self(类的实例对象)、init_http_session和init_util这两个pytest fixture。
  • 类级别代码执行时,pytest还未启动测试流程,fixture还没初始化,没法直接获取;同时你也没有创建TestSubscribers类的实例,自然传不了self参数,所以触发了参数缺失的错误。
  • 移到Utils类后,如果还是直接调用实例方法(未创建Utils实例),或者Utils的方法依然依赖fixture,同样会因为fixture无法在类/模块级别注入而失败。

正确调用方式

方式1:用fixture封装逻辑+间接参数化

把获取ID的逻辑封装成fixture,再通过间接参数化在parametrize中使用:

import pytest

class TestSubscribers:
    @pytest.fixture
    def subscriber_group_id(self, init_http_session, init_util):
        response = init_http_session.get("/api/subscriberGroups", headers={"Authorization": init_util.auth_main_token()})
        return response.json()["subscriberGroups"][0]["subscriberGroupID"]

    @pytest.fixture
    def test_data(self, subscriber_group_id):
        return [
            {"subscriberGroupID": subscriber_group_id, "subscriberTariffTypeID": "0"},
            {"subscriberGroupID": subscriber_group_id, "subscriberTariffTypeID": Util.generate_tariff(Util)}
        ]

    @pytest.mark.parametrize("data", indirect=["data"])
    def test_subscriber_logic(self, data):
        # 这里直接使用data即可,已包含正确的subscriberGroupID
        print(data)

方式2:用pytest-lazy-fixture延迟获取fixture值

先安装插件:pip install pytest-lazy-fixture
再修改代码:

import pytest
from pytest_lazyfixture import lazy_fixture

class TestSubscribers:
    @pytest.fixture
    def subscriber_group_id(self, init_http_session, init_util):
        response = init_http_session.get("/api/subscriberGroups", headers={"Authorization": init_util.auth_main_token()})
        return response.json()["subscriberGroups"][0]["subscriberGroupID"]

    @pytest.mark.parametrize("data", [
        {"subscriberGroupID": lazy_fixture("subscriber_group_id"), "subscriberTariffTypeID": "0"},
        {"subscriberGroupID": lazy_fixture("subscriber_group_id"), "subscriberTariffTypeID": Util.generate_tariff(Util)}
    ])
    def test_subscriber_logic(self, data):
        # data中的subscriberGroupID已被替换为fixture的返回值
        print(data)

方式3:测试方法内生成数据

如果不想用插件,可把测试数据生成逻辑放到测试方法内部:

class TestSubscribers:
    def subscriber_groups_ID(self, init_http_session, init_util):
        response = init_http_session.get("/api/subscriberGroups", headers={"Authorization": init_util.auth_main_token()})
        return response.json()["subscriberGroups"][0]["subscriberGroupID"]

    def test_subscriber_logic(self, init_http_session, init_util):
        subscriberGroupID = self.subscriber_groups_ID(init_http_session, init_util)
        test_data = [
            {"subscriberGroupID": subscriberGroupID, "subscriberTariffTypeID": "0"},
            {"subscriberGroupID": subscriberGroupID, "subscriberTariffTypeID": Util.generate_tariff(Util)}
        ]
        for data in test_data:
            # 在这里执行你的测试逻辑
            print(data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:27