做了这么久的自动化测试现在才知道API 接口测试还能...

news2024/9/25 17:10:45

接口测试作为最常用的集成测试方法的一部分,通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期,有些情况是功能测试无法覆盖的,所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解:

接口测试的意义

  • 低 - 低成本

因为接口的相对稳定性,不需要大量的重新编写,做好基础的维护,用例的扩充,能满足日常的使用范围

  • 稳 - 相对稳定

当接口自动化创建后,可以相对稳定的运行。接口相对稳定,不会频繁更换,顶多增加字段或者新增接口(相对于UI测试来说,维护、编写成本很大,实际过程中一点点的放弃了UI自动化测试)

  • 快 - 执行速度快,反馈速度快

涉及到持续集成,把接口集成到 jenkins 上,自动触发或定时任务触发,触发后就反馈结果。

测试和监控 API 对确保应用程序的功能和性能变得越来越重要,我们在本文中可以详细了解完成API 测试的操作步骤,详细信息请参照下文:

七个基本步骤

1. 了解 API 的范围

在尝试测试 API 之前,了解 API 的作用及其职责是至关重要的。此步骤应从访问 API 文档开始。应该手动对 API 端点进行一些调用,以深入了解它们的工作方式以及它们返回的数据

2. 了解用户流程

在这一步中,应该超越单个 API,查看使用它的应用程序。尝试并了解用户如何使用这些应用程序,以及它们的使用会触发哪些 API 调用。这将帮助你了解API在实际生活中使用的场景,并使你能够开发测试,以测试和验证 API 在实际生活中的使用方式。

例如,如果直接从 Web 应用程序调用 API,可以使用浏览器开发人员工具记录对 API 发出的所有请求并检查请求和响应负载。这有助于了解 API 的使用方式。

3. 编写API测试

  • 测试接口选择

项目有几十个或者几百个接口。一方面,不可能对每一个接口都做自动化测试,所以要分主要接口和非主要接口;另一方面,也不是每个接口都适合做自动化测试,所有要分稳定接口和不稳定接口;还有一方面,有些接口只能调用一次,所有要分可重复执行接口和不可重复执行接口。当然其中还有其他银色影响接口的选择,要根据实际情况进行筛选,然后对接口逐步分析,来确定最后需要自动化测试的接口,做到可以在接口层面成本最大化。

  • 注册接口

这是一个重要的接口,但却是不可重复执行的接口,因为同样的数据第二次是无法注册成功的,所以这个接口不适合做这类自动化。

  • 登录接口

这个接口是可以重复执行的,而且相对于来说不太会随意改动的借口,所以这个接口适合做自动化。

  • 用户信息查询

这个接口可以反复请求,适合做自动化。

结合自身项目并在具体的实践过程中,我们会发现大多数做自动化的接口都是查询接口,因为不涉及对数据库的改动,仅仅是查询可以重复操作的,而且返回数据也是相同的,便于对返回结果的判断验证。

4. 覆盖异常情况和边界值情况

上一节介绍 API 测试接口的选择,并验证它在“正常”使用情况下是否按预期工作。在这一步中,判断 API 在边界值和异常情况下的行为是否正确。例如:

  • 是否试图让一个不存在的实体返回正确的错误代码(404 响应)?
  • 如果提供了错误数据类型的参数(400 响应),API 是否会失败?
  • 如果我们尝试访问我们没有权限的实体(401 响应)会发生什么?

这一步的技巧是查看HTTP 错误代码列表(尤其是 4xx 范围 - 用户错误)并尝试创建生成这些代码的场景。

5. 针对 Dev 和 Stage 环境执行测试

自动化需要一个干净的测试环境,不然很难重复运行起来。自动化测试要做到绝对只能也是不可能的,尤其运行过程中会遇到脏数据活着异常就会中断。首先需要在测试环境跑一遍正常流程,中间通过抓包获取数据信息,一方面需要确定这些数据作为自动化测试的数据基础,另一方面需要了解数据结构是什么,可能是包含列表的字典,也可能是一个纯元组。前提是可以测试通过一套流程,不然获取这些数据没有必然意义。

编写测试后,你应该能够开始在非生产环境中使用它们并看到它们通过。理想情况下,如果正确编写了测试,应该可以通过向不同环境传递不同的变量来针对不同环境执行测试。这可以帮助你开始验证 API 的开发版本。

6. 持续集成 Jenkins

Jenkins 是一个功能强大的工作,测试人员可以根据各自的测试需求灵活运用其中的部分功能。引进持续集成思想是为了帮助测试人员提高测试效率,一旦可以看到针对开发/阶段环境运行的所有测试,你就可以将它们连接到你的 CI/CD 管道,以便在你推送新代码时开始自动化测试过程。这可以通过源代码管理工具(如 GitHub 或 GitLab)或构建工具(如 Jenkins 或 CircleCI)来完成。这有助于保持测试运行并“强制”使测试保持最新,因为无法在测试失败的情况下推送代码。

7. 运行测试以监控生产环境

维护 API 测试用例的好处之一是你可以轻松地在多个环境中运行它们。具体来说,你可以在生产环境中定期运行测试以确保其按预期运行。这还可以帮助你收集有关 API 的性能数据,实时查看性能的降级或更改。

以上内容测重于对接口操作流程及一些简单操作步骤具体的作用,给出的只是借助工具对于基本操作方向性的指导,没有详细的具体实践,不过没关系呀,这都是正常的,关于如何使用/借助工作去做接口测试的方式非常多,也不是一两篇文章能够全部讲完,最重要的是先知道大概的方向,然后就去大胆实践,在做的过程中成长最快。

 

重点:学习资料

600g的学习资料需要+文章末尾插件备注csdn000领取

 

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

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

相关文章

Linux如何安装BeyondCompare

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录安装yumtar.gz使用示例BeyondCompare是一款广受好评的文本对比工具。本…

文件上传漏洞渗透与攻防(一)

目录 前言 文件上传漏洞原理 Webshell介绍 一句话木马: 小马: 大马: Webshell集合: 网站控制工具 文件上传漏洞危害 文件上传漏洞靶场练习 Pass-01 Pass-02 Pass-03 Pass-04 Pass-06 Pass-07 Pass-08 Pass-09 Pass-10 Pas…

Java并发编程(二)

线程方法 API Thread 类 API: 方法说明public void start()启动一个新线程,Java虚拟机调用此线程的 run 方法public void run()线程启动后调用该方法public void setName(String name)给当前线程取名字public void getName()获取当前线程的名字 线程存…

实战演练 | 使用 Navicat Premium 自动运行数据库复制

与同步(使两个数据库的模式和数据同步的一次性过程)不同,复制是一个连续(自动)在两个数据库之间重现数据的过程(尽管模式更新也是可能的)。复制可以异步完成,因此不需要永久连接两个…

【Lniux】目录的权限,默认权限,粘滞位详细讲解

大家好,今天详细讲解一些关于目录权限的细节 很多细节都是通过问答方式,希望大家可以先自己思考一下答案然后再听我的分析 欢迎指正错误,我们共同成长 目录 1.目录的权限 2.默认权限 3.粘滞位 1.目录的权限 如果我们要进图一个目录只需要…

ArcGIS基础实验操作100例--实验25统一多分辨率栅格数据

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验25 统一多分辨率栅格数据 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

springboot admin-server的使用

指标监控可视化文档&#xff1a; 用于管理 Spring Boot 应用程序的管理 UI Spring Boot Admin Reference Guide 一、创建项目 就勾选Spring Web项目即可 二、基础设置 (1) 依赖引入 <dependency><groupId>de.codecentric</groupId><artifactId>sp…

Android: Binder: 彻底顿悟Android Binder

Binder机制可谓是Android 知识体系的重中之中&#xff0c;作为偏底层的基础组件&#xff0c;平时我们很少关注它&#xff0c;但是它却无处不在&#xff0c;这也是android面试考察点之一&#xff0c;本篇将从流程上将Binder通信过一遍。 文章目录 1&#xff1a;Binder作用 2&…

STM32F7-Discovery使用ITM作为调试工具

关于代码的调试手段&#xff0c;我在自己的一篇文章(http://bbs.ickey.cn/index.php?appgroup&actopic&id54944链接中的《STM32F030 Nucleo-开发调试的经验USART的重要性.pdf》)中已经详细谈到&#xff0c;为什么在调试中我们通常使用J-Link或ULINK或ST-Link(ST)或Ope…

机器学习——细节补充

1.matplotlib与seaborn的区别 来源&#xff1a;https://geek-docs.com/matplotlib/matplotlib-ask-answer/difference-between-matplotlib-and-seaborn.html 2.%matplotlib inline使图片嵌入notebook&#xff0c;而不需要使用show()方法 3.IPython与python&#xff1a;IPyth…

中小企业如何选择进销存软件?

企业信息化转型趋势的推动&#xff0c;让很多中小企业也开启了转型的探索。对于企业&#xff0c;一款合适的进销存管理软件&#xff0c;绝对是转型之路上的必备工具&#xff0c;可以帮助企业对经营中的采购、库存、销售等环节进行有效管理监督。 目前&#xff0c;市面上的各种…

three.js 的渲染结构

理解three.js 的渲染结构 1 three.js 的渲染 Three.js 封装了场景、灯光、阴影、材质、纹理和三维算法&#xff0c;让你不必再直接用WebGL 开发项目。three.js 在渲染三维场景时&#xff0c;需要创建很多对象&#xff0c;并将它们关联在一起。 下图便是一个基本的three.js 渲…

Python通知Epic白嫖游戏信息

每周都有免费游戏 - Epic Games 近期看到Epic在送游戏&#xff0c;目前每周都会有活动白嫖。 身为白嫖党&#xff0c;肯定要操作一下。 游戏列表&#xff1a;Epic Games Store 每周免费游戏&#xff08;331&#xff09; | indienova GameDB 游戏库 大致思路&#xff1a; 1、…

把teamtalk中的网络库(netlib)拆出来单独测试实现双工通信效果

这篇文章的基础是上一篇对于将teamtalk中的线程池&#xff0c;连接池单独拆出来的讲解 不是说这个网络库会依赖线程池&#xff0c;连接池&#xff0c;而是上一篇文章中讲了一些base目录中的文件&#xff0c;并且这个网络库会依赖一些base目录里的文件&#xff0c; 文末会将所有…

基于fpga的自动售货机(三段式状态机)

目录 1、VL38 自动贩售机1 题目介绍 思路分析 代码实现 仿真文件 2、VL39 自动贩售机2 题目介绍&#xff1a; 题目分析 代码实现 仿真文件 3、状态机基本知识 1、VL38 自动贩售机1 题目介绍 设计一个自动贩售机&#xff0c;输入货币有三种&#xff0c;为0.5/1/2元&…

JS概览 (JS基础 DOM BOM)

目录 JavaScript JS基础 JS数据类型 函数 变量的作用域 作用域链 预解析 DOM DOM树 获取元素的方法 事件高级 注册和解绑事件 DOM事件流 BOM 和DOM的区别 window 对象的常见事件 window.onload JS执行机制 具体的执行流程 例子 JavaScript JS基础 JS数据类…

鉴源论坛 · 观模丨基于AUTOSAR的TTCAN通信协议的形式化建模与分析

作者 | 郭建 上海控安可信软件创新研究院特聘专家 版块 | 鉴源论坛 观模 汽车工业发展至今&#xff0c;硬件方面如车身材料、发动机等已无太大升值空间&#xff0c;而汽车电子则有着广阔的前景。为此各大汽车厂商对汽车电子的研究都投入了大量的人力财力。2003 年&#xff0c…

链式二叉树的代码总结

今天我带来链式二叉树的代码总结。 目录前言链式二叉树代码实现的五个文档二叉树的例子前序遍历中序遍历后序遍历层序遍历求结点个数的函数求叶子的个数的函数求k层结点个数的函数查找某一个值的函数求二叉树高度的函数判断二叉树是否是完全二叉树的函数开辟二叉树结点的函数销…

【设计模式】工厂方法模式

简单工厂模式的弊端 在简单工厂模式中只提供一个工厂类&#xff0c;该工厂类处于对产品类进行实例化的中心位置&#xff0c;它需要知道每一个产品对象的创建细节&#xff0c;并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时&#xff0c;必…

实现isReactive和isReadonly

08_实现isReactive和isReadonly 一、实现isReactive isReactive: 检查一个对象是否是由 reactive 创建的响应式代理。 1. 单元测试 // src/reactivity/tests/reactive.spec.tsimport { reactive, isReactive } from ../reactive;describe(reactive, function () {it(happy pa…