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

如何在Pytest测试中共享Python函数get_requests内的corr_value变量到另一个测试函数

如何在Pytest测试中共享Python函数get_requests内的corr_value变量到另一个测试函数

嘿,我来帮你搞定这个问题~要在不同的Pytest测试函数之间共享get_requests里的corr_value,有几个实用的方案,我一个个给你拆解:

方案1:修改get_requests返回值 + Pytest Fixture(推荐)

首先调整原函数,让它同时返回响应和corr_value,还要处理KeyError场景避免变量未定义:

def get_requests(t, endpoint):
   response = requests.get(f'{base_url}{endpoint}',
                        headers={"Authorization": f'Bearer {t}', "Content-Type": 'application/json'})
   corr_value = None  # 初始化默认值,防止报错
   try:
       corr_value = response.json()[0]["powerPlant"]["id"]
   except KeyError:
       print("Unable to get powerPlant id")
   print("Powerplant ID: ", corr_value)
   return response, corr_value  # 同时返回响应和目标变量

接着用Pytest的fixture缓存这个数据,让所有需要的测试都能复用:

import pytest

@pytest.fixture(scope="module")  # 模块级作用域,整个测试模块只执行一次请求
def powerplant_info(token):
    response, corr_value = get_requests(token, '/powerplant/all')
    assert response.status_code == 200  # 提前验证请求成功
    return {"response": response, "corr_value": corr_value}

# 原测试函数可以简化成这样
def test_get_powerplants(powerplant_info):
    print("Response: ", powerplant_info["response"].text)

# 新测试直接引用fixture拿到corr_value
def test_bids_generate(powerplant_info, token):
    # 用corr_value构造请求payload
    payload = {
        "powerplant_id": powerplant_info["corr_value"],
        # 其他payload字段...
    }
    response = post_requests(token, '/bids/generate', payload)
    # 后续断言逻辑...

方案2:用Pytest缓存机制共享数据

如果不想修改原函数,也可以用Pytest自带的缓存把值存起来:

def test_get_powerplants(token):
    response = get_requests(token, '/powerplant/all')
    assert response.status_code == 200
    # 重新解析一次corr_value并存入缓存
    try:
        corr_value = response.json()[0]["powerPlant"]["id"]
        pytest.cache.set("powerplant_id", corr_value)
    except KeyError:
        pytest.fail("Failed to extract powerplant ID")
    print("Response: ", response.text)

def test_bids_generate(token):
    # 从缓存取出corr_value
    corr_value = pytest.cache.get("powerplant_id", None)
    assert corr_value is not None, "Powerplant ID not found in cache"
    # 构造请求并执行
    payload = {"powerplant_id": corr_value}
    response = post_requests(token, '/bids/generate', payload)
    # 断言逻辑...

方案3:用测试类共享状态(适合关联测试分组)

如果两个测试是强关联的,可以放到同一个测试类里,用类属性共享数据:

class TestPowerplantBids:
    corr_value = None

    def test_get_powerplants(self, token):
        response = get_requests(token, '/powerplant/all')
        assert response.status_code == 200
        # 解析值并存到类属性
        try:
            self.__class__.corr_value = response.json()[0]["powerPlant"]["id"]
        except KeyError:
            pytest.fail("Failed to get powerplant ID")
        print("Response: ", response.text)

    def test_bids_generate(self, token):
        assert self.corr_value is not None, "Powerplant ID not initialized"
        payload = {"powerplant_id": self.corr_value}
        response = post_requests(token, '/bids/generate', payload)
        # 断言逻辑...

小提示:

优先选方案1+Fixture的组合,这是Pytest官方推荐的最佳实践,逻辑清晰、可维护性高,还能避免重复请求API浪费资源。

备注:内容来源于stack exchange,提问作者Magnus Jensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:09:52