【软件测试】python接口自动化测试编写脚本,资深测试总结方法,你的实用宝典......
目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
接口测试,大家关注更多的是哪个工具更优秀,更好用。但是很少人关注到接口测试用例的设计问题,也很少人会去写接口用例,都代码化了嘛,还写什么用例,是吧?
这样真的对么?我们是不是忽略了什么呢?回归测试的时候,成百上千个接口执行下来,没有报错,你就真的对系统放心了么?在接口测试之外,我们还需要补充哪些功能用例来验证那些接口做不了或者不好做的场景呢?
接口用例的设计也是一项非常重要的测试活动。通过一定的接口用例设计,让我们编写的脚本更有目的性、更可靠,才能体现接口测试的价值的意义,而不是单纯以量取胜。测试目的明确,符合接口测试基本原则,断言清晰的接口自动化脚本才是好脚本。
某个用例的测试目的是什么
在进行接口测试脚本的编写前,我们应该明确这批脚本的预期目标在哪里,是为了验证什么内容。
根据个人的经验,一般会把接口用例分成三类:
单接口验证:以验证接口参数、权限、返回值为主,保证接口“能用”,这类用例一般在接口设计定稿后,配合Mock服务就可以完成用例编写;
场景逻辑验证:以用户场景为基础,验证接口间的参数传递及业务流程能够正常流转,用例复杂度较高,需要非常熟悉业务与接口之间的关系。这是接口测试最核心的价值。
异常验证:主要验证参数异常、逻辑异常等情况下,接口是否能处理并给出友好的错误信息。
通常情况下,关注参数异常的场景会比较多,可以用等价类、边界值等方式来处理。
需要注意的是多关注下异常的返回信息是什么,信息是否明确,提示是否友好等等。
接口信息的来源
当我们明确好测试目标后,再开始编写测试用例,会有更针对性的去设计测试数据和接口组合。
接下来的问题是什么呢?
去哪里确认你的接口信息是有效的?
基本上有两种路径:
接口文档:开发人员都不喜欢自己写文档,同时也很讨厌别人不写文档。所以测试人员如何获取一份真实有效的接口文档是件比较麻烦的事。一般团队内都会有一个统一的接口文档管理工具(如果没有,就找开发多磨麿,让他们弄个,并不难),我们需要关注接口文档的有效性和及时性。现在也有很多的插件或者工具能够帮助研发人员自动生成接口文档,例如Swaager、apidoc等等。
接口抓包:如果什么都没有,那就自力更生,通过Fiddler之类的工具,通过抓包分析的方式来获取接口,这类的场景如果较多的话,可以把Fiddler抓到的接口导出,然后写个小程序,直接转成接口平台可以识别的脚本,效率会更高一些。
在获取到接口信息后,需要与开发人员多交流,明确参数的意义及来源,以便我们针对性的做测试用例设计,这个环节不要过多的自己猜(很多测试人员经常会自己猜想),直接找开发问就好了。
在这个接段,还要梳理并区分接口的重要程度和优先级。这样就可以确认哪些接口优先设计用例,哪些接口可以先放放,在有限制的时间内,做最大价值的事。
一些基本原则
拿到接口后,明确了参数说明,结合测试目标,我们就可以开始设计并编写测试用例了。
区别于功能测试用例,接口测试用例(脚本)一些原则需要注意:
自动化:好像是废话,所有的用例应该是非交互试,最常见的就是Token之类的生成,需自动处理好(我见过每次执行用例前,需要自己手动生成Token再粘贴进去的脚本,特别是分环境执行的时候)。
独立性:每个用例应该是独立的,没有依赖的。需要在一个用例里处理好前置条件,而不是多个用例相互依赖。
可重复:用例测试可重复执行,所以需要注意参数的生成方式。
可持续性:如果代码修改导致已有接口测试执行失败,必须修复代码问题或者测试代码逻辑。
断言那些事
在设计测试用例时,还需要关注的是针对断言的设计,好的断言能够帮助我们发现问题,没有断言的用例(脚本)就是耍流氓,完全没有意义。
个人在审核脚本时,会重点关注这个(很多测试人员为了数据好看,或者因为是事后补写,所以断言写的非常简单,这类脚本其实都是在做无用功,纯粹是为了KPI)。
从接口层面看,我们至少需要验证两点:
数据结构验证:验证接口返回的数据结构是否与事先定义的一样。调用方在处理数据时,肯定是根据事先定义好的数据结构来解析数据的,如果数据结构发生变化,那对调用方来说,是灾难性的(契约测试考虑下)。
核心数值的验证:根据业务场景的不同,可以有目的性的验证某些key的值是否与预期的一样,可以结合数据库查询的方式来验证(不同的自动化测试框架有不同的实现方式)。这个就比较依赖测试人员对业务的了解。根据实际情况灵活的设计验证点。
除了以上两点外,还有一些额外的验证点在需要的时候可以进行,如涉及到其它方的数据流转、返回的URL是否可被访问,返回的数据是否真的是必要的(这点很重要,过多的返回会导致很多意外的问题),等等。根据实际情况进行补充。
这样,通过一系列的方法设计出来的接口用例,才会有一定的业务价值,能够真正的帮助到团队,提升测试效率,对于这样的测试脚本,全部PASS的结果才会让人安心。(你能想象没有断言的脚本全部PASS,你还放心的么)
脚本的后期维护
测试用例(脚本)编写完成后,并不意味着接口测试的成完。在其它的测试环节中,如果发现因为接口问题而产生的BUG(如响应异常、无数据返回等情况),我们需要适当的补充到接口用例中,避免类似的情况再次发生而我们没有验证到。
在积累到一定高质量的用例(脚本)后,可以进一步挖掘这些东西的价值,如转化成线上业务监控的脚本,转换成精准测试的依据等。
还有更高端的玩法,是借助混沌测试的思路,独立拉个分支,故意修改一些异常出来,让测试用例验证,能否发现这些BUG,以验证测试用例的有效性。如果不能发现,那就需要我们去思考如何改进测试脚本(业内已经有类似的平台出现了)。
关于测试数据的准备
多聊下测试数据准备的事,这其实是接口测试中很重要的一个环节,想要脚本可以在多个环境中运行,那么测试数据就不能写的太死,需要根据环境去自动获取一些数据值。
针对测试数据的准备,一般的玩法也有三类:
公共参数:通过不同作用域及标识的区分,有个专门的文件来处理一些共用数据的存放,例如不同环境下的用户名。
数据集合:通过特定的API或者SQL事先生成所需要的数据,然后放到一个指定的集合(参数或者文件都可以)中,在需要的时候,从这里获取对应的数据值。
数据模板:这个是数据集合的升级版,根据业务数据流,只需要填写一些简单的信息,就可以自动生成一整套的业务数据(例如个人做过的,通过基础的学校信息,就自动生成一套针对性的数据,包含学校、班级、学科、学生等整套的数据)。
| 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战

四、App自动化项目实战

五、一线大厂简历

六、测试开发DevOps体系

七、常用自动化测试工具

八、JMeter性能测试

九、总结(尾部小惊喜)
人生留下的不仅是美丽,更重要的是精神;精神需要传承和发扬,会激励我们去追求理想,活就活的精彩,乐就乐的舒畅;记住榜样的力量,传递爱的正能量。
积极的人在每一次忧患中都是看到一个机会,而消极的人则是在每个机会都是会看到某种忧患。
大多数人高估了他们在一年内能做的事情,而低估了他们在十年里能做的事情,绝不以临时方案解决长期问题。
相关文章:
【软件测试】python接口自动化测试编写脚本,资深测试总结方法,你的实用宝典......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 接口测试࿰…...
MathType公式编辑器过期(禁止联网)的解决方案
MathType公式编辑器过期(禁止联网)的解决方案 Mathtype公式编辑器无法使用解决方案 MathType联网后显示证书失效,需要重新认证或者购买。或者是MathType成了精简版,只剩两行了。 1. 打开控制面板 方法1 首先大家在电脑中打开W…...
电子技术——共栅和共源共栅放大器的高频响应
电子技术——共栅和共源共栅放大器的高频响应 我们在之前学过无论是是CS放大器还是CE放大器,都可以看做是一个带通(IC低通)滤波器。在高频处的响应收到输入电容 CinC_{in}Cin 的限制(主要是米勒效应)。因此ÿ…...
基于jsplumb构建的流程设计器
项目背景 最近在准备开发工作流引擎相关模块,完成表结构设计后开始着手流程设计器的技术选型,调研了众多开源项目后决定基于jsplumb.js开源库进行自研开发,保证定制化的便捷性,相关效果图及项目地址如下 项目地址:ht…...
解析从Linux零拷贝深入了解Linux-I/O(下)
接上文解析从Linux零拷贝深入了解Linux-I/O(上) 大文件传输场景 零拷贝还是最优选吗 在大文件传输的场景下,零拷贝技术并不是最优选择;因为在零拷贝的任何一种实现中,都会有「DMA 将数据从磁盘拷贝到内核缓存区——P…...
【学习笔记2.19】动态规划、MySQL、Linux、Redis(框架)
动态规划 343整数拆分 class Solution {public int integerBreak(int n) {int dp [] new int [n 1];//dp[i]:正整数i拆分后的最大乘积dp[2] 1;for(int i 2;i < n ;i ){for(int j 1;j < i;j ){dp[i] Math.max(dp[i],Math.max(j * (i - j),j * dp[i - j]));} …...
String intern方法理解
1、原理 参考学习视频: https://www.bilibili.com/video/BV1WK4y1M77t/?spm_id_from333.337.search-card.all.click&vd_source4dc3f886f5ce1d43363b603935f02bd1 String s1 “hello”; String s1 "hello"; 代码原理解释如下图String s1 new Str…...
解决 cocosjs与安卓原生集成 崩溃问题
版本:cocos2dx3.16 背景:公司需要把游戏整合到一个APP里面。于是打算通过activity切换的方式实现。但是游戏退出重进之后总会出现fatal 11线程报错。于是有了以下修改。我是底层小白。折腾了好久总算鼓捣出一个能用的版本。优化的地方应该有很多。不过就没去好好优…...
spring注解方式整合Dubbo
系列文章目录 文章目录系列文章目录一、创建一个父工程项目二、创建子模块(dubbo-api模块)二、创建子模块(dubbo-provider模块)三、创建子模块(dubbo-consumer模块)总结一、创建一个父工程项目 这里我们通过Spring Initializer 来帮我们构建一个spring-dubbo这个父项目,点击nex…...
Git详解
Git1.Git简介1.1 Git是什么1.2 Git的作用1.3 Git的简介1.4 Git的下载和安装1.5 Git的安装目录结构如下2.Git代码托管服务2.1 常用的Git代码托管服务1.Git简介 1.1 Git是什么 Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、x…...
003__JAVA模板方法-设计模式
模板方法 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现 举个例子,把大象放进冰箱分几步,第一打开冰箱,第二打大象放进冰箱,第三把冰箱关闭。这三个步骤就可以用模板方法的设计模式。 …...
Springboot项目集成Netty组件
系列文章目录 Springboot项目集成Netty组件 Netty新增解析数据包指定长度功能 文章目录系列文章目录前言一、Netty是什么?二、使用步骤1. 项目引入依赖1.1 项目基础版本信息:1.2 Netty依赖2. 项目配置2.1 在 yml 配置文件中配置以下:2.2 创建…...
python 中的import cfg问题
pip install cfg 报错: ERROR: Could not find a version that satisfies the requirement cfg (from versions: none) ERROR: No matching distribution found for cfg 要使用pip install cfg2才行...
[oeasy]python0088_字节_Byte_存储单位_KB_MB_GB_TB
编码进化 回忆上次内容 上次 回顾了 字符大战的结果 ibm 曾经的 EBCDIC 由于字符不连续的隐患 导致后续 出现 无数问题无法补救 7-bit 的 ASA X3.4-1963 字母序号连续 比较字符时 效率高判断字符 是否是字母 也很容易 获得了 IBM以外公司的 支持 为什么 ASA X3.4-1963 是 7…...
vue3.0 生命周期
目录前言:vue3.0生命周期图例1.beforeCreate2.created3.beforeMount/onBeforeMount4.mounted/onMounted5.beforeUpdate/onBeforeUpdate6.updated/onUpdated7.beforeUnmount/onBeforeUnmount8.unmounted/onUnmounted案例:总结前言: 每个Vue组…...
CGAL 数字类型
文章目录 一、简介二、内置数字类型三、CGAL中的数字类型参考资料一、简介 在CGAL汇总,数字类型必须满足特定的语法和语义要求,这样它们才能在CGAL代码中成功使用。一般来说,它们往往是代数结构概念的模型,如果它们对实数的子集模型,那么它们就也是RealEmbeddable模型。 二…...
如何将Python打包后的exe还原成.py?
将python打包好的exe解压为py文件,步骤如下:下载pyinstxtractor.py文件下载地址:https://nchc.dl.sourceforge.net/project/pyinstallerextractor/dist/pyinstxtractor.py并将pyinstxtractor.py放到和exe相同的目录文件下打开命令控制台cd 进…...
CJSON简单介绍
json简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集,最新的定义可以参考ECMA-404_2nd_ed…...
算法训练营 day49 动态规划 爬楼梯 (进阶)零钱兑换 完全平方数
算法训练营 day49 动态规划 爬楼梯 (进阶)零钱兑换 完全平方数 爬楼梯 (进阶) 70. 爬楼梯 - 力扣(LeetCode) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同…...
Vue:extends继承组件复用性
提到extends继承,最先想到的可能是ES6中的class、TS中的interface、面向对象编程语言中中的类和接口概念等等,但是我们今天的关注点在于:如何在Vue中使用extends继承特性。 目录 Vue:创建Vue实例的方式 构造函数方式࿱…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
