调用含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
相关产品推荐
相关产品推荐

