当前位置: 首页 > news >正文

Python接口自动化测试:断言封装详解

在进行API接口测试时,断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中,我们可以利用一些库来实现断言功能。

1. 安装必要的库

在Python中,我们主要会使用两个库:requests和jsonpath。requests库用于发送HTTP请求,而jsonpath库则用于解析JSON数据。

首先,我们需要安装这两个库。打开命令行,输入以下命令:

pip install requests
pip install jsonpath

2. 封装断言函数

接下来,我们需要编写一个断言函数。该函数负责读取接口返回的信息,并根据预先设定的条件进行断言。以下是一个基本的断言函数示例:

import requests
import jsonpathdef assert_response(response, assertions):for assertion in assertions:actual_value = jsonpath.jsonpath(response.json(), assertion["jsonpath"])expected_value = assertion["expected_value"]assert actual_value[0] == expected_value, f"断言失败。期望值为 {expected_value},实际值为 {actual_value[0]}"

在这个函数中,我们首先使用jsonpath从JSON数据中提取实际值。然后,我们使用assert语句来进行断言,判断实际值是否等于预期值。

3. 使用断言函数

现在,我们可以在接口测试中使用这个断言函数了。

首先,我们需要发送一个HTTP请求,并获取返回的响应。然后,我们可以使用断言函数来检查响应是否符合预期。

以下是一个示例:

# 发送HTTP请求
url = "<http://example.com/api>"
response = requests.get(url)# 定义断言
assertions = [{"jsonpath": "$.status","expected_value": "success"},{"jsonpath": "$.data[0].id","expected_value": 1}
]# 使用断言函数
assert_response(response, assertions)

在这个示例中,我们首先发送一个GET请求到http://example.com/api。然后,我们定义了两个断言:一个是检查status是否为success,另一个是检查第一条数据的id是否为1。最后,我们调用assert_response函数进行断言。

4. 高级断言示例

除了基本的断言功能之外,我们还可以进行更多的断言操作。以下是一些高级断言示例:

检查列表长度

有时候,我们需要检查返回结果中某个列表的长度是否符合预期。可以通过以下方式进行断言:

assert len(response.json()["data"]) == expected_length

例如,假设我们期望返回的数据列表长度为10,我们可以使用上述断言来验证。

检查关键字存在

有时候,我们需要检查返回结果中是否包含某个关键字。可以通过以下方式进行断言:

assert keyword in response.json()["data"]

例如,假设我们期望返回的数据中包含关键字"example",我们可以使用上述断言来验证。

检查响应时间

有时候,我们需要检查接口的响应时间是否在预期范围内。可以通过以下方式进行断言:

assert response.elapsed.total_seconds() <= expected_time

例如,假设我们期望接口的响应时间不超过5秒,我们可以使用上述断言来验证。

检查状态码

在接口测试中,我们经常需要检查返回的状态码是否符合预期。可以通过以下方式进行断言:

assert response.status_code == expected_status_code

例如,假设我们期望返回的状态码为200,我们可以使用上述断言来验证。

通过这些高级断言操作,我们可以更加灵活地进行接口测试和结果验证。

5. 完全封装的断言方法

除了逐个断言检查外,我们还可以将所有断言封装到一个方法中,以便更方便地进行结果验证。以下是一个完全封装的断言方法示例:

import requests
import jsonpathdef assert_responses(responses, assertions):for index, response in enumerate(responses):for assertion in assertions[index]:actual_value = jsonpath.jsonpath(response.json(), assertion["jsonpath"])expected_value = assertion["expected_value"]assert actual_value[0] == expected_value, f"断言失败。期望值为 {expected_value},实际值为 {actual_value[0]}"

在这个方法中,我们接受一个包含多个响应的列表和一个包含多个断言的列表。我们使用嵌套循环来遍历每个响应和断言,并进行断言检查。

以下是一个示例:

# 发送HTTP请求
urls = ["<http://example.com/api1>", "<http://example.com/api2>", "<http://example.com/api3>"]
responses = [requests.get(url) for url in urls]# 定义断言
assertions = [[{"jsonpath": "$.status","expected_value": "success"},{"jsonpath": "$.data[0].id","expected_value": 1}],[{"jsonpath": "$.status","expected_value": "success"},{"jsonpath": "$.data[0].name","expected_value": "example"}],[{"jsonpath": "$.status","expected_value": "success"}]
]# 使用断言函数
assert_responses(responses, assertions)

在这个示例中,我们发送了三个GET请求到不同的URL,并获得了三个响应。然后,我们定义了三个断言列表,每个列表对应一个响应。我们可以通过调整断言列表来适应不同的测试场景。

通过完全封装的断言方法,我们可以更加灵活地进行多个响应的结果验证。

总结

Python中的断言封装主要涉及到了requests和jsonpath两个库的使用。通过这两个库,我们可以方便地发送HTTP请求,解析JSON数据,以及进行断言。希望这篇文章对于Python中断言封装的理解有所帮助。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OPC UA遇见chatGPT
  • Git(8)之分支间同步特定提交
  • c++ Constraints 和 concepts介绍
  • 蓝桥杯算法题:卡片换位
  • WPS二次开发系列:WPS SDK初始化
  • Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发
  • 蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ
  • LC 226.翻转二叉树
  • 怀俄明探空站数据解算PWV和Tm
  • 什么是软件测试?5分钟带你快速了解!
  • JavaEE初阶-线程3
  • CentOS7:Python版本回退
  • Linux下Qt生成程序崩溃文件
  • 24双非考研哈尔滨工程大学计算机(@程程笔记)
  • hydra九头蛇
  • 【Leetcode】104. 二叉树的最大深度
  • 4个实用的微服务测试策略
  • canvas 高仿 Apple Watch 表盘
  • ES6 学习笔记(一)let,const和解构赋值
  • JavaScript-Array类型
  • JavaScript类型识别
  • JavaScript设计模式系列一:工厂模式
  • python docx文档转html页面
  • Redash本地开发环境搭建
  • Vue2.0 实现互斥
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 关于Java中分层中遇到的一些问题
  • 两列自适应布局方案整理
  • 微信小程序开发问题汇总
  • 微信小程序设置上一页数据
  • ## 1.3.Git命令
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (void) (_x == _y)的作用
  • (多级缓存)多级缓存
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (顺序)容器的好伴侣 --- 容器适配器
  • ***通过什么方式***网吧
  • ./configure,make,make install的作用
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net dataexcel winform控件 更新 日志
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • 。Net下Windows服务程序开发疑惑
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RestControllerAdvice异常统一处理类失效原因
  • [Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
  • [Android]使用Retrofit进行网络请求