如何写接口自动化测试断言?

news2024/11/15 6:59:21

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快  

你真的会写自动化测试断言吗?

在接口测试中,断言是一项非常重要的操作,它是用来校验接口返回结果是否符合预期的一种手段。一般来说,接口测试断言大致可以分为以下几类:

  1. 状态码断言:这是最基本也是最常用的一种断言方式。大部分情况下,接口返回的HTTP状态码可以用来判断接口请求是否成功。

  2. 响应体断言:基于接口的响应数据进行校验。

  3. 响应时间断言:接口响应时间是否在可接受的范围之内。

  4. 数据库断言:接口调用后,数据是否有相应的变化。

这种使用断言来进行接口测试的方法,在测试框架中的具体实现可能各不相同。

下文将以Python的requests模块来做一个简单的例子。

首先,我们需要构造一个基本的GET请求,并获取响应:


import requests

response = requests.get('http://api.example.com/data')

在得到了响应后,我们可以使用Python的assert关键字来进行断言。比如我们可以断言状态码是200:

assert response.status_code == 200

如果状态码不是200,那么这个语句会抛出AssertionError

我们也可以断言响应的JSON数据中包含了某个特定的键:

data = response.json()
assert 'key' in data

同样,如果'key'不在data中,那么这个语句也会抛出AssertionError。对于更复杂的断言,我们可能需要使用一些第三方库来帮助我们。比如我们可以使用jsonschema库来断言响应数据符合某个JSON Schema:


from jsonschema import validate

schema = {
    "type" : "object",
    "properties" : {
        "key" : {"type" : "string"},
    },
    "required": ["key"]
}

validate(data, schema)

那么,对于更复杂的断言,我们该怎么做呢?

图片

对于JSON响应断言,主要是确认返回的JSON对象中的某个或者某些元素是否和预期的一致。这种断言的方式,最常见的就是比对键值对是否相符了。举个例子,假设我们期待的JSON响应如下

{
    "title": "foo",
    "body": "bar",
    "userId": 1
}

我们可以使用Python来做一个简单的断言操作:

expected_json = {
    "title": "foo",
    "body": "bar",
    "userId": 1
}

response_json = response.json()

assert response_json == expected_json

在上述代码中,response.json()用来从响应中获取JSON数据,然后使用assert语句来断言这个JSON数据和我们期待的JSON数据是否相同。

如果我们只关心返回结果中的某一部分,例如,我们只关心返回结果中的title字段,那么我们可以做如下断言:

assert response_json['title'] == expected_json['title']

对于更复杂的JSON响应断言,比如,JSON响应为嵌套结构,或者是JSON数组,我们可能需要进行递归或者遍历等操作来进行断言,这种情况下可以使用一些第三方的断言库来提升我们的效率。比如Python的jsonpath库,可以帮助我们快速的定位JSON中的某一段数据,并进行断言

JsonPah是一种信息检索语言,可以让你用一个类似XPath的语法快速定位JSON结构中的部分内容处理嵌套结构的JSON响应时,JsonPath提供了一种简单有效的方法。重要的是理解JsonPath的语法,比如 '$' 表示根节点,'.' 或 '[]' 用于访问子节点,'*' 用于通配等。

下面举个例子来说明如何使用JsonPath:假定我们有一个如下的复杂JSON:

response_json = {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
}

如果我们需要取出所有书的标题(title),可以使用如下语句:


from jsonpath import jsonpath

titles = jsonpath(response_json, '$.store.book[*].title')

print(titles) #输出:['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

如果我们需要取出价格大于10的书的标题,可以使用如下语句:


titles = jsonpath(response_json, "$.store.book[?(@.price > 10)].title")

print(titles) # 输出:['Sword of Honour', 'The Lord of the Rings']

JsonPath非常简洁高效,能让我们的断言操作更简单,代码更清晰,既然这么强大的话,这不得有个使用方法

不着急,下面给你列出了常用的通配符的解析说明

JsonPath表达式中的通配符通常有以下几种:

  1. *:通配符,匹配所有的对象或元素。比如 $..book[*].author 可获取所有作者的名字。
  2. ..:深度操作符,无论深度多少层,都可以匹配到路径。比如 $..author 可获取所有的作者信息。
  3. . 或 []:逐层向下遍历,. 针对于名字,[] 针对于数组下标或者名称。比如 $['store']['book'][0]['price'] 获取第一本书的价格。
  4. @:现行节点信息,常在过滤器中使用,比如 $..book[?(@.price<10)] 意思是获取所有价格小于10的书。
  5. ():表达式组,用于根据自定义表达式过滤。比如 $..book[(@.length-1)] 获取最后一本书。
  6. ?():过滤操作符,用于查找符合条件的元素。比如 $..book[?(@.isbn)] 获取所有包含ISBN的书。

以上这些通配符让我们在使用JsonPath时有更大的灵活性,可以在大型或者嵌套较深的JSON数据中准确地定位我们所需要的数据。

那么,面试会怎么问呢

举个例子:

面试官:JsonPath表达式中的深度操作符..可以匹配到多少层的路径?

YOU:在JsonPath中,深度操作符 .. 在不知道精确路径或者需要查询多层嵌套数据时非常有用。.. 不关心元素在JSON数据中的精确位置,它会「深度搜索」,也就是说,无论数据嵌套在JSON结构的多深,只要符合你的查询条件,它都能找到。

可以用任何的名字或者通配符 * 来配合深度操作符一起使用,它们的组合可以匹配到任何级别的元素。例如,假设我们有一个JSON对象:

{
    "level_1": {
        "level_2": {
            "level_3": {
                "item": "value"
            }
        }
    }
}

如果你不知道 "item" 的精确路径,但你知道它的名字,并且你想从JSON数据中找到它,你可以使用 .. 操作符加上名字进行深度搜索,如:$..item,这将返回所有名为 "item" 的元素,无论它们处在哪一层级。

总的来说,深度操作符 .. 可以匹配到无限多层的路径,这对于处理深层嵌套的数据结构非常有用。

面试官:除了深度搜索,JsonPath还有其他什么功能可以处理深层嵌套的数据结构?

YOU:除了深度搜索外,JsonPath还提供了一些其他功能来处理深层嵌套的数据结构:

  1. 数组索引:JsonPath允许你使用数组索引来访问特定位置的元素。例如,表达式$.store.book[0]将返回图书数组的第一本书。

  2. 多个索引:JsonPath还允许你在同一层级上访问多个元素。例如,$.store.book[0,1]将返回图书数组的前两本书。

  3. 切片操作:JsonPath支持Python风格的切片操作,允许你访问一个连续的元素序列,而不仅仅是单个元素。例如, $.store.book[1:3]将返回图书数组的第二和第三本书。

  4. 过滤表达式:JsonPath支持过滤表达式,允许你使用逻辑运算符和比较运算符来过滤返回的元素。例如,$.store.book[?(@.price < 10)]将返回图书数组中价格低于10的所有书。

  5. 通配符:正如我们前面讨论的,*通配符可以用来匹配任意元素,不论位置。

总的来说,断言是接口测试中的一个重要部分,合理、充分地使用断言,不仅可以提升我们的测试质量,也能帮助我们快速定位问题。同时,塑造良好的断言策略,对于维护和持续提升一个测试框架也是尤为关键的。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OLED显示屏详解(IIC协议0.96寸 STM32)

目录 一、介绍 二、模块原理 1.原理图 2.工作原理&#xff1a;SSD1306显存与命令 三、程序设计 main.c文件 oled.h文件 oled.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 OLED是有机发光二极管&#xff0c;又称为有机电激光显示&#xff08;Organic Electrol…

惊人发现:clickhouse的cpu暴增之谜

点/击/蓝/字 关/注/我/们 一、背景 前段时间&#xff0c;公司的生产环境的clickhouse的cpu突然持续高压&#xff0c;持续时间大约5个小时&#xff0c;特写此文记录&#xff0c;深挖clickhouse的原理&#xff0c;持续学习。 题主所在的公司的一些历史数据会保存到clickhouse中…

基于php的公司员工管理系统—计算机毕业设计源码25190

摘 要 公司公司员工管理系统除了具有共享系统的全部功能以外&#xff0c;能通过对数据的分析对决策做出解释是其主要的新特点。其体系结构&#xff0c;将由专用的服务器/客户方式向广域网发展&#xff0c;使更多的系统间能够互相交流数据&#xff0c;带动整个行业、领域知识和效…

如何解决前端跨域问题:从CORS到JSONP

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介如何解决前端跨域问题&#xff1a;从CORS到JSONP1. 引言2. 什么是跨域问题&#xff1f;2.1 同源策略&#xff08;Same-Origin Policy&#xff09;2.2 跨域请求的场景 3. 解决跨域问题的常见方法3.1 使用CORS&#xff08;Cross-Orig…

实在智能联合案例入选中国信通院2024年度高质量数字化转型案例集

为推动数字化转型相关产业发展&#xff0c;培育数据要素市场&#xff0c;为数字化双方提供行业实践标杆参考&#xff0c;中国信通院铸基计划于2024年4月初启动高质量数字化转型典型案例征集工作&#xff0c;旨在遴选一批具有产业引领与推广应用效应的企业数字化转型典型案例。实…

【MySQL】Explain执行计划(十七)

&#x1f697;MySQL学习十七站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️每章节附章节思维导图&#xff0c;文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ ⭐学习汇总贴&#xff0c;超详细思维导图&#xff1a;【MySQL】学习汇总(完整思维导图) 一.…

[python]面向对象示例:学生管理系统

python面向对象 python基础知识整理 主要界面 建议跟着框架自行完成功能需求,最下面有完整带注释版本,学生信息会存到当前目录下data.txt文本中,没有则会自行创建 涉及到的知识点 面向对象列表, 字典for, if, input…文件操作 需求分析 开始 -> 循环调用主程序 ->不…

盲盒小程序开发,探索市场发展优势

随着潮玩市场的火热&#xff0c;盲盒已经成为了一种集娱乐、社交、消费为一体的模式&#xff0c;越来越多的消费者被盲盒所吸引&#xff0c;盲盒市场也迎来了巨大的发展空间&#xff0c;带来了各种商业机遇&#xff0c;同时为创业者提供新的创业渠道。本文将探讨盲盒小程序的开…

deepin-wine8-stable为某个windows应用设置环境变量

1 环境说明 deepin v23wine 8.16 2 操作步骤 2.1 在终端指定应用打开注册表编辑 WINEPREFIX~/.deepinwine/com.allroundautomations/ deepin-wine8-stable regeditWINEPREFIX:windows应用在wine容器中的路径&#xff0c;一般为~/.deepinwine/你的应用名称包regedit:注册表编…

类型组TYPE-POOL

文章目录 创建类型组使用类型组运行结果 创建类型组 使用类型组 *&---------------------------------------------------------------------* *& Report Z_TEST_TYPEPOOL *&---------------------------------------------------------------------* *& *&…

ClimODE——使用神经网络ODE 进行天气预报

概述 论文地址&#xff1a;https://arxiv.org/abs/2404.10024 源码地址&#xff1a;https://github.com/Aalto-QuML/ClimODE.git 这项研究提出了用于天气预报的神经 ODE 系统 ClimODE&#xff0c;该系统的设计特点是通过局部卷积运算获取局部依赖关系&#xff0c;通过全局关注…

Pycharm虚拟环境中使用pip命令报错ModuleNotFoundError解决办法

Pycharm虚拟环境中输入pip 相关命令时报错ModuleNotFoundError,记录一下。 软件版本&#xff1a; windows:win11 Python:3.11.4 PyCharm:转业版 2024.1.3 报错如下&#xff1a; 在虚拟环境中输入pip 相关命令时报错"ModuleNotFoundError: No module named pip._internal…

基于yolov8的绝缘子缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的绝缘子缺陷检测系统是一种利用先进深度学习技术的高效解决方案&#xff0c;旨在提升电力行业中输电线路的维护和监控水平。YOLOv8作为YOLO系列算法的最新版本&#xff0c;具备更高的检测速度和精度&#xff0c;特别适用于实时物体检测任务。 该系统…

【Spring Boot-IDEA创建spring boot项目方法】

1. 使用Spring Initializr 的 Web页面创建项目 2. 使用 IDEA 直接创建项目&#xff0c;其中有两种不同的搭建路径 3. 使用 IDEA 创建Maven项目并改造为springBoot 最常使用的两种方法其实就是一种&#xff0c;这里介绍在ieda中如何搭建 SpringBoot项目。 1.new Project--> 2…

kafka快速上手

一、kafka介绍 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。 kafka官网&#xff1a;http://kafka.apach e.org/ 二、kafka入门 生产者发送消息&#xff0c;多个消费者只能有一个消费者接收到消息生产者发送消息&#xff0c;多个消费者都可以接收到消息 …

HarmonyOS开发实战( Beta5版)多线程能力场景化示例最佳实践

在介绍Worker和TaskPool的详细使用方法前&#xff0c;我们先简单介绍并发模型的相关概念&#xff0c;以便于大家的理解。 并发模型概述 并发的意思是多个任务同时执行。并发模型分为两大类&#xff1a;基于内存共享的并发模型和基于消息传递的并发模型。 在基于内存共享的并…

手撕Python之序列类型

1.列表---list 索引的使用 当我们有一个数据的时候&#xff0c;我们怎么将这个数据存储到程序呢&#xff1f; 我们定义一个变量&#xff0c;将数据存储在变量中 那么如果有100个数据呢&#xff1f;要定义100个变量吗&#xff1f; 我们是可以用列表这个东西进行多个数据的存…

单元测试 Mock不Mock?

文章目录 前言单元测试没必要?Mock不Mock?什么是Mock?Mock的意义何在? 如何Mock&#xff1f;应该Mock什么&#xff1f;Mock 编写示例 总结 前言 前段时间&#xff0c;我们团队就单元测试是否采用 Mock 进行了一番交流&#xff0c;各有各的说法。本文就单元测试 Mock不Mock…

11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)

文章目录 前言一、Java接口之函数式编程 --- 接口知识补充1 Function<T,R>泛型接口2 BiFunction<T, U, R>泛型接口3 自定义泛型函数式编程接口4 使用lambda表达式、方法引用进行函数式编程 二、方法引用1 方法引用初体验&#xff08;以Array.sort()方法为例&#x…