当前位置: 首页> 汽车> 维修 > 西安市建设网_平面设计培训班哪里有_广州网络推广平台_怎么做好公司官网推广

西安市建设网_平面设计培训班哪里有_广州网络推广平台_怎么做好公司官网推广

时间:2025/7/11 7:50:16来源:https://blog.csdn.net/weixin_49364648/article/details/144973581 浏览次数: 0次
西安市建设网_平面设计培训班哪里有_广州网络推广平台_怎么做好公司官网推广

在接口自动化测试中,接口之间通常存在关联关系,比如前一个接口返回的数据需要传递给后续接口使用。以下是 Pytest 中实现接口关联的方法和详细讲解。


1. 什么是接口关联?

接口关联指的是一个接口的输出作为另一个接口的输入。常见的场景包括:

  • 登录接口返回的 token 需要传递给后续的接口。
  • 查询接口返回的 ID 用于更新或删除操作。
  • 多接口之间的数据依赖,比如依赖创建的资源进行操作。

2. 实现接口关联的常见方法

方法一:使用全局变量

直接使用全局变量存储接口返回值,供其他接口使用。

示例代码:

import pytest
import requests# 全局变量
global_data = {}def test_login():url = "http://example.com/api/login"data = {"username": "user", "password": "pass"}response = requests.post(url, json=data)assert response.status_code == 200# 提取 token 并存储在全局变量中global_data["token"] = response.json().get("token")def test_get_user_info():url = "http://example.com/api/user"headers = {"Authorization": f"Bearer {global_data['token']}"}response = requests.get(url, headers=headers)assert response.status_code == 200

优点:

  • 简单易用,适合小型测试场景。

缺点:

  • 全局变量可能导致测试数据污染,尤其在并发测试时。

方法二:使用 Fixture

通过 Pytest 的 Fixture 动态传递数据,避免全局变量的污染问题。

示例代码:

import pytest
import requests@pytest.fixture
def login():url = "http://example.com/api/login"data = {"username": "user", "password": "pass"}response = requests.post(url, json=data)assert response.status_code == 200# 返回 tokenreturn response.json().get("token")def test_get_user_info(login):url = "http://example.com/api/user"headers = {"Authorization": f"Bearer {login}"}response = requests.get(url, headers=headers)assert response.status_code == 200

优点:

  • Fixture 的作用域可以控制数据的生命周期,适合中小型测试。
  • 代码结构清晰,易于维护。

缺点:

  • Fixture 的嵌套复杂性可能增加。

方法三:上下文管理(Context)

通过上下文类集中管理接口之间的关联数据,适合复杂项目。

示例代码:

import pytest
import requestsclass Context:def __init__(self):self.data = {}def set(self, key, value):self.data[key] = valuedef get(self, key):return self.data.get(key)@pytest.fixture(scope="session")
def context():return Context()def test_login(context):url = "http://example.com/api/login"data = {"username": "user", "password": "pass"}response = requests.post(url, json=data)assert response.status_code == 200# 存储 tokencontext.set("token", response.json().get("token"))def test_get_user_info(context):url = "http://example.com/api/user"headers = {"Authorization": f"Bearer {context.get('token')}"}response = requests.get(url, headers=headers)assert response.status_code == 200

优点:

  • 数据管理集中化,适合大型测试项目。
  • 支持复杂的关联数据。

缺点:

  • 代码稍微复杂,需要额外维护上下文类。

方法四:参数化动态传递数据

通过参数化结合接口调用动态传递数据。

示例代码:

import pytest
import requestsdef login():url = "http://example.com/api/login"data = {"username": "user", "password": "pass"}response = requests.post(url, json=data)assert response.status_code == 200return response.json().get("token")@pytest.mark.parametrize("token", [login()])
def test_get_user_info(token):url = "http://example.com/api/user"headers = {"Authorization": f"Bearer {token}"}response = requests.get(url, headers=headers)assert response.status_code == 200

优点:

  • 简洁,适合测试用例数量少的场景。

缺点:

  • 需要提前调用依赖接口,无法动态更新参数。

方法五:测试用例之间共享数据

通过 request.node 实现测试用例之间的数据共享。

示例代码:

import pytest
import requests@pytest.fixture(scope="module")
def shared_data(request):request.node.shared_data = {}return request.node.shared_datadef test_login(shared_data):url = "http://example.com/api/login"data = {"username": "user", "password": "pass"}response = requests.post(url, json=data)assert response.status_code == 200# 存储 tokenshared_data["token"] = response.json().get("token")def test_get_user_info(shared_data):url = "http://example.com/api/user"headers = {"Authorization": f"Bearer {shared_data['token']}"}response = requests.get(url, headers=headers)assert response.status_code == 200

优点:

  • 测试用例之间可以共享数据。
  • 避免全局变量污染。

缺点:

  • 不支持多线程并发测试。

3. 各方法适用场景对比

方法适用场景优点缺点
全局变量简单的测试场景实现简单快速容易污染全局数据,线程不安全
Fixture中小型测试项目数据隔离性好,生命周期可控嵌套复杂时维护困难
上下文管理大型复杂测试项目数据管理集中化,适合复杂数据共享增加额外代码复杂性
参数化传递数据测试用例较少的简单场景代码简洁,适合批量测试无法动态更新
用例之间共享数据依赖较强的测试用例避免全局变量污染,模块化强不适合并发测试
关键字:西安市建设网_平面设计培训班哪里有_广州网络推广平台_怎么做好公司官网推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: