pytest-yaml-sanmu(二):使用hook自定义yaml用例的执行方式

前言

本文抛砖引玉,通过以下几个测试框架的封装示例,一步步引导你实现属于自己的 yaml 测试框架:

  • 加法测试

  • 计算测试

  • 接口测试

  • Web 测试

使用本插件需要对 Python 和 Pytest 较为熟练的应用经验,本文认为你已经具备这些条件。

关于本插件的基本介绍这里不再赘述,请参见前文《pytest-yaml-sanmu(一):把yaml作为测试文件的pytest插件》。

实现 yaml 加法测试

yaml 加法测试是指:

在 yaml 中编写加法的测试用例,并由 pytest 加载、执行、判断

01.设计用例

假设在进行加法测试时,需要 3 个值:

  • num1: 第一个数字

  • num2 : 第二个数字

  • expected_results:预期的计算结果

则在 yaml 中可以这样表示

num1: 111num2: 222expected_results: 333

为符合插件要求,需要加上必填字段,即为​​​​​​​

test_name: 加法测试steps:  - num1: 111    num2: 222    expected_results: 333

如果在测试用例需要包含多个步骤,或多组断言,可以在 steps 中继续增加内容

test_name: 加法测试steps:  - num1: 111    num2: 222    expected_results: 333 # 成功的用例  - num1: 111    num2: 999    expected_results: 333 # 失败的用例  - num1: 111    expected_results: 333 # 不符合要求的用例

至此, yaml 用例已设计完毕,pytest 执行结果如下:

图片

实现 hook 前执行用例

02.实现 hook

此时 pytest 虽然可以正确地识别、加载用例内容,却没有根据用例步骤进行具体动作的执行。

既没有进行加法运算,也没有对结果进行断言。

接下来通过实现 hook 将 yaml 用例步骤变为具体的用例动作

图片

实现 yaml 加法测试

实现 hook 后重新启动 pytest

图片

yaml 用例执行结果

首先看到的是,这个用例执行失败了

再细看失败原因,正是由于第二个测试步骤断言失败了

- num1: 111  num2: 999  expected_results: 333 # 失败的用例

和普通的 pytest 测试用例一样的是:当某个测试步骤执行失败,那么后续的都不再继续执行

所以我们只能看到第二个步骤失败,看不到第三个步骤失败(因为它没有执行)

如果你有多个测试步骤,力求每一个步骤都能够执行,可以考虑把步骤分散到不同的用例中。

按照一般的测试原则,用例之间相互隔离,所以就算某个用例失败了,其他用例也会继续执行

这里有一个小技巧:

我们不需要真的创建三个 yaml 文件,

只需要在同一个 yaml 在文件通过 --- 进行分隔,即可模拟出三个 yaml 文件的效果

图片

一个 yaml 文件中写多个用例

执行结果如下:

图片

多个用例的执行结果

从执行结果可以看到,1 个成功 2 个失败

失败的原因分别是因为断言失败和用例格式不正确

03.补充用例

至此,yaml 加法测试已实现,

你可以在测试用例中补充更多的步骤,或者创建更多的 yaml 文件里补充测试用例

实现 yaml 计算测试

在前面的例子中,我们只对测试步骤做了【加法计算】这一种处理,

在实际项目中,测试步骤的类型往往有多种,不同的步骤类型,需要不同的方式去执行。

接下来我们实现一个支持加、减、乘、除的计算测试,来模拟演示不同步骤类型的实现方式

01.设计用例

这一次,在测试步骤中多了一个层级,用以表示步骤的类型

test_name: 计算测试steps:  - add:  # 加      num1: 111      num2: 222      expected_results: 333
  - subtract: # 减      num1: 111      num2: 222      expected_results: -111
  - multiply : # 乘      num1: 111      num2: 222      expected_results: 222
  - divide: # 除      num1: 111      num2: 222      expected_results: 0.5

为了保持简单,本例不同的步骤类型中内容格式是相同的,但这不是强制要求,

你也可以为不同的步骤类型定义不同的内容格式、不同的处理方式

02.实现 hook

由于测试步骤发生了变化,hook 必须更新才正确处理。

在新的 hook 实现中,我们需要做到 2 点:

  1. 判断具体的步骤类型

  2. 根据不同的步骤类型,做出不同的测试动作

图片

新的 hook 实现

执行结果如下:

图片

断言失败

首先看到的是,这个用例执行失败了

再细看失败原因,却发现无法判断失败的步骤

这是因为断言写得太过简洁,可以为 assert 提供第二个参数进行断言描述,比如这样:

msg = f'测试步骤: {item.current_step_no},测试类型: {step_type}, 测试步骤: {step_data}'
assert actual_results == step_data['expected_results'], msg

修改后的执行结果如下:

图片

在断言中添加描述

PS:有计划在 yaml content 直接标注错误的步骤,但暂时没找到好的实现方式

03.补充用例

至此,yaml 计算测试已实现,

你可以在测试用例中补充更多的步骤,或者创建更多的 yaml 文件里补充测试用例

小结

通过目前这两个例子,想必你已经更直观地感受到通过 yaml 编写测试用例的步骤和思路。

如果这些内容已经消化完毕,接下来还有两个更加贴近现实的例子:基于 yaml 文件的 API 测试和 Web 测试

原创不易,喜欢请星标+点赞+在看,关注公众号《测试开发研习社》,不错过技术干货,谢谢鼓励!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP协议名词解释

一、HTTP协议通讯名词解释-URL URL(Uniform Resource Locator,统一资源定位符)是标识Web资源的唯一标识符。通过它即可获取其标识的资源。 最常用的URL格式如下: protocol://hostname[:port]/[path/Ifile[?paramvaluel 这个结构中有几个部分是可选的。如果端口…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出,又称PR,佩奇排名。主要针对网页进行排名,计算网站的重要性,优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想: 数量假设&#…

10kV配电室在线监控改造技术方案

安科瑞薛瑶瑶18701709087 摘要:目前,我国经济高速发展,社会在不断进步,国家加大了农村低压配电网络改造升级投入,低压配电网供电可靠性及供电质量得到明显提升,但低压配电网络自动化运维水平及农村电网用电…

如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本,通过…

移动开发避坑指南——内存泄漏

在日常编写代码时难免会遇到各种各样的问题和坑,这些问题可能会影响我们的开发效率和代码质量,因此我们需要不断总结和学习,以避免这些问题的出现。接下来我们将围绕移动开发中常见问题做出总结,以提高大家的开发质量。本系列文章…

【Qt编译】ARM环境 Qt5.14.2-QtWebEngine库编译 (完整版)

ARM 编译Qt5.14.2源码 1.下载源码 下载Qt5.14.2源代码(可根据自己的需求下载不同版本) 下载网站:https://download.qt.io/new_archive/qt/5.14/5.14.2/single/ 2.相关依赖(如果需要的话) 先参考官方文档的需求进行安装: 官方…

第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结

目录 个人总结 C/C 组真题 握手问题 小球反弹 好数 R 格式 宝石组合 数字接龙 爬山 拔河 ​编辑 再总结及后续规划 个人总结 第一次参加蓝桥杯,大二,以前都在在学技术,没有系统的学过算法。所以,还是花了挺多时间去备…

unity按路径移动

using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class FollowPathMove : MonoBehaviour {public Transform[] wayPointArray;[SerializeField] private Transform PathA;//路径点的父物体[SerializeField]private Trans…

用html写一个有趣的鬼魂动画

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>一个有趣的鬼魂动画</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.m…

[leetcode] minimum-falling-path-sum

. - 力扣&#xff08;LeetCode&#xff09; 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多…

a == 1 a== 2 a== 3 返回 true ?

1. 前言 下面这道题是 阿里、百度、腾讯 三个大厂都出过的面试题&#xff0c;一个前端同事跳槽面试也被问了这道题 // &#xff1f; 位置应该怎么写&#xff0c;才能输出 trueconst a ?console.log(a 1 && a 2 && a 3) 看了大厂的面试题会对面试官的精神…

applicaitonListener配合ApplicationEvent原理

今天突然想看看applicationListener和applicationEvent是怎么实现的观察者模式所以看了下源码 先定义两个观察者 Component public class ListenerOne implements ApplicationListener<MyEvent> {Overridepublic void onApplicationEvent(MyEvent event) {System.out.pr…

三次握手与四次挥手到底是怎么回事?

三次握手和四次挥手是TCP/IP协议中建立和断开连接的关键步骤&#xff0c;它们是保证可靠通信的重要机制。这里将探讨这两个概念&#xff0c;并解释它们背后的原理。 三次握手 三次握手用于建立TCP连接&#xff0c;它由客户端和服务器之间发送的三个报文组成&#xff1a; 第一次…

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后&#xff0c;在解决方案管理器中有五个项目&#xff0c;分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目&#xff0c;除PlantsVsZombies外&#xff0c;其他四个…

python爬取京东商品信息与可视化

项目介绍&#xff1a;使用python爬取京东电商拿到价格、店铺、链接、销量并做可视化 ........................................................................................................................................................... 项目介绍效果展示全部…

Project Euler_Problem 193_Few Repeated Digits_欧拉筛+容斥公式

解题思路&#xff1a;暴力搜索 代码&#xff1a; void solve() {ll i, j,k,x,y,z,p,q,u,v,l,l1;N 999966663333, NN 1024;//N 1000;double a, b, c,d;M.NT.get_prime_Euler(1000000);l M.NT.pcnt;for (i 1; i < l; i) {u M.NT.prime[i];v M.NT.prime[i 1];x u * …

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

在linux上面安装xxl-job2.4.0

问题 由于预算有限&#xff0c;用不起lambda去跑定时任务&#xff0c;现在只能在EC2上面自己安装一个单机版的xxl-job了。 步骤 下载压缩包 在这个页面下载压缩包&#xff0c;并本地解压。 https://github.com/xuxueli/xxl-job/releases mysql准备 找到它默认身数据库初始…

JavaScript-2.对话框、函数、数组、Date、DOM

对话框 window对象封装了三个对话框用于与用户交互 提示框&#xff1a;alert(title);确认框&#xff1a;confirm(title);输入框&#xff1a;prompt(title); 确认框 包含两个按钮“确认”/“取消”&#xff0c;点击确定时&#xff0c;返回值为true // 确认框 var bool con…

C语言单链表详解

链表和顺序表的区别 顺序表的底层存储空间是连续的&#xff0c;链表的底层存储空间是不连续的&#xff0c;链表的每个节点需要额外的指针来指向下一个节点&#xff0c;占用更多的存储空间。 顺序表的随机访问性能好&#xff0c;时间复杂度为O(1)&#xff0c;链表的随机访问性能…