5年经验之谈 —— 如何编写有效的接口测试?

简介: 在所有的开发测试中,接口测试是必不可少的一项。有效且覆盖完整的接口测试,不仅能保障新功能的开发质量,还能让开发在修改功能逻辑的时候有回归的能力,同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原则?测试代码的结构应该是什么样的?接口测试有哪些实践技巧?本文分享作者在接口测试上的实践总结。

一线开发同学,可能都或多或少地造成过线上bug甚至故障;也会遇到这样的场景,某同学在开发某功能的时候重构了代码,造成了线上bug或者故障;在开发某个功能时,发现需要修改公共逻辑,害怕影响到其他功能,非常不雅观地拷贝代码,重新写套单独逻辑来支持。

上面这些情况,都包含了一个关键的问题,无论是功能开发还是逻辑重构,如何来保障代码开发的质量。保障的手段,每个人都知道,就是测试。首先是新功能测试,保障新功能逻辑正确;其次是回归测试,保障原有业务功能逻辑正确。测试的方式,一般是两种,人工测试和自动化测试。随着测试技术和工具的持续发展,人工测试比例逐步降低,被自动化测试逐步替代。自动化测试是可持续和可重复的,甚至是可AI化的。

一、 测试分层

测试也是分层的,如下图所示:

在一个系统内,自动化测试一般分单元测试、模块测试和接口测试。

单元测试

目前我的应用代码基本都是基于spring框架面向接口这种编程模式,单元测试已被弱化。单元测试的要求基本上是单个类单个方法的测试,在我们当前模式下,编写成本太高。当然,如果是一个工具或者一段比较内聚而又复杂的逻辑(例如算法逻辑),还是应该使用单元测试来保障逻辑的正确性。

模块测试

在系统比较大、模块比较多的情况下,可以建立模块测试层,保障各模块功能的正确性。不过当前的系统发展趋势是微服务架构,因此模块测试层并非十分必要,可以通过接口测试层来覆盖。

接口测试

个人觉得准确来说应该叫入口测试,这一层,是从系统入口出发进行集成测试。应用入口通常是HSF(一个分布式RPC服务框架)服务,消息,定时任务。

作为开发,测试手段千万条,接口测试不可少。在我们应用的接口测试有效且覆盖完整的情况下,不仅能保障我们新功能的开发质量,还能让我们在修改功能逻辑的时候有回归的能力,同时这也是我们做代码重构的前提。同时,易测性也是代码结构合理的一个指标,如果发现一段代码编写测试脚本困难或者无法测试,那就说明当前代码结构不合理需要重构。接下来,我将主要谈一谈接口测试的有效性。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:310357728【暗号:csdn888】

二、 测试原则

基础原则:

  • 自动化:接口测试是非交互式的自动化执行,不需要人参与。
  • 独立性:接口测试之间不应该相互依赖。
  • 可重复:接口测试可重复执行,不受环境影响。
  • 接口测试遵守BCDE原则,保障接口交付质量。 Border:边界测试。 Correct:正确的输入,正确的预期输出。 Design:按照需求和设计文档编写测试逻辑。 Error:错误输入,预期输出。
  • 数据准备:数据准备通过系统服务进行,不能通过直接插入db方式。
  • 可测性:对于不可测的代码需要进行重构成合理的结构。
  • 覆盖性:接口测试需要覆盖所有UC,同时代码覆盖率和分支覆盖率应达到一定标准,新增代码必须被覆盖。
  • 持续性:如果代码修改导致已有接口测试执行失败,必须修复代码问题或者测试代码逻辑。
  • 时间要求:接口测试应该在项目发布之前完成,不应放到项目发布之后补充。

以上的基本原则应适用于所有层的自动化测试用例,在编写接口测试时,除了上面这些原则,还有其他原则需要遵守,先看一张图:

从系统角度来分析入口调用,以HSF服务为例:

  • 外围系统调用由我们系统提供的服务。
  • 系统执行了一堆代码逻辑,其中包含有分支逻辑。
  • 系统执行过程中依赖外部HSF服务,进行了调用,并得到了返回值。
  • 系统执行过程中依赖DB查询或者落地了数据,依赖缓存查询或者落地了数据。
  • 系统执行过程中对外发送了消息。
  • 给上游系统返回HSF执行结果。

有效接口测试的关键原则是要覆盖所有入口,mock所有依赖,校验执行过程中所留下的痕迹,总结如下:

  • 入口覆盖:接口测试用例必须覆盖HSF服务入口、消息入口、定时任务入口。
  • 依赖mock:在基本原则中,有可重复这个原则,即接口测试不能受环境依赖,需要mock掉对外依赖。但对于db依赖,不建议完全mock掉,一方面mock成本高,另外可能覆盖不到sql和表约束逻辑。
  • 校验完整:有效的接口测试,应该具备完整的校验,没有校验的接口测试是没有意义的。只要执行过程中,留下的痕迹对业务有影响,都要进行完整校验,方能保障接口测试的有效性。 HSF接口返回值校验:按照场景和接口约定进行HSF返回参数校验。 DB校验:校验落地数据的正确性。 缓存校验:校验存入缓存中数据的正确性。 HSF依赖入参校验:通过mock工具获得依赖HSF调用的入参,进行入参校验。 消息校验:通过mock工具获得发送的消息对象,进行消息体校验。

三 、测试代码结构

在编写测试代码的时候,也应跟写业务代码一样,考虑代码的可读、可扩展、可复用性。同时也可以根据系统的业务特性,在测试框架的基础上封装适合当前系统的测试组件,提高测试代码编写效率,规范测试代码结构。

一个接口的测试代码,大概的结构如下:

1 、测试准备

依赖数据准备

很多时候,我们的测试有数据依赖,可能是配置数据,也有可能是业务数据(例如退款需要依赖支付数据)。

  • 配置数据:可以通过定义配置文件来初始化配置。
  • 业务数据:这类数据,禁止通过直接插入数据方式产生,而是应通过调用业务服务产生。

依赖mock

对于外部依赖,需要对被依赖的服务进行mock,避免真实调用。

接口测试入参准备

准备接口方面的入参。

2 、测试执行

调用接口方法,执行业务逻辑。

3、 测试校验

  • 返回参数校验:校验接口的返回参数。
  • DB:校验DB落地数据。
  • 缓存数据校验:校验落地到缓存中的数据。
  • 消息校验:校验对外发送的消息对象。
  • 对外HSF调用校验:校验对外HSF调用的入参。

四 、实践技巧

1 、执行效率

对于接口测试,执行效率是不得不关注的一个点,若一个接口测试执行3分钟以上才能看到结果,会大大降低开发同学编写接口测试的热情。对于测试执行效率提高,建议的方案为:

  • 最小化启动测试上下文,例如spring boot的应用,启动spring就可以了
  • 使用内存数据库,例如h2
  • 将中间件依赖mock掉

2、测试框架选择

对于测试框架,建议选择基于testng,能够提供通过配置文件做数据准备的测试框架。如果找不到合适的,可以自己基于testng进行封装。

3、 接口测试覆盖度

场景的完整性影响着测试用例的覆盖度,一方面需要开发同学基于业务场景的输入和测试经验枚举出正常和异常情况,另一方面接口方法也有一些固定需要测试的点,例如幂等测试,边界值测试,参数不正确测试等等。

同时也要通过覆盖率工具查看接口未覆盖的代码或分支逻辑,进行针对性的场景覆盖测试。根据我的经验,分支完整覆盖非常重要,特别是异常的分支。

五 、总结

要保障系统线上运行稳定,质量保障手段必不可少。虽然现在有很多自动化的保障手段,但接口测试依然是最基本的和最重要的保障手段之一。如能做到持续保障接口测试覆盖度和有效性,很大程度上会降低线上bug的产生,开发同学也会更有积极性去重构代码。

END,今天的分享就到此结束了!点赞关注不迷路!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards

css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards 一、问题描述 在做一个弹窗动画提示的时候遇到了一个问题: 在动画结束的时候,移除元素时会有闪一下的问题,像这样,有残留的痕迹。 我的动画结尾是这…

WebLOAD: 一站式性能测试工具

WebLOAD 是一款一站式前端性能测试工具,对测试人员来说使用非常方便。 它可以帮助前端工程师和测试快速对网页进行性能测试和优化,提高网页加载速度,减少页面卡顿和闪烁。 WebLOAD的特点、使用指南以及企业实际使用中的案列。 WebLOAD的特…

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案 也是昨天晚上折腾了一个晚上到凌晨四点多,实在没有头绪,在论坛,贴吧,各种求助查贴,没有什么人解决.后面请教了一个安全圈的大佬朋友给解决了. 我的问题是在kali上的,所以只写了kali 的解决方案: 修改插件: vim /opt/…

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件,srt文件里面有很多时间轴: 现在想将其批量转为word文档,去掉里面与字符无关的时间轴,在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个批量将SRT字幕文件转为…

R语言:利用biomod2进行生态位建模

在这里主要是分享一个不错的代码,喜欢的可以慢慢研究。我看了一遍,觉得里面有很多有意思的东西,供大家学习和参考。 利用PCA轴总结的70个环境变量,利用biomod2进行生态位建模: #------------------------------------…

【计算机网络学习之路】UDP socket编程

文章目录 前言一. 网络通信本质端口号TCP与UDP网络字节序 二. socket编程接口socket()和sockaddr结构体 三. 简单echo服务结束语 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 一. 网…

安卓:Android Studio4.0~2023中正确的打开Android Device Monitor

Android Studio4.0~2023 中如何正确的打开Android Device Monitor(亲测有效) 前些天买了新电脑,安装了新版本的Android Studio4.0想试一试,结果就出现了一些问题。 问题引出: Android Device Monitor在工具栏中找不到,后来上网查…

基于nbiot的矿车追踪定位系统(论文+源码)

1.系统设计 鉴于智能物联网的大趋势,本次基于窄带物联网的矿车追踪定位系统应具备以下功能: (1)实现实时定位,真正实现矿车随时随地定位; (2)定位精度高,采用该系统可以实现矿车在…

dump备份命令

dump备份文件系统,或者目录 文件系统有等级划分,0为全部备份,1.针对上一次有变动的文件进行备份,以此类崔 目录备份:只有一个等级0, 针对文件系统类型有要求ext2,ext3,如果是其他…

数据分析基础之《jupyter notebook工具》

一、安装库 1、linux库 yum install python3-devel 2、python库 pip3 install -U matplotlib pip3 install -U numpy pip3 install -U pandas pip3 install -U TA-Lib pip3 install -U tables pip3 install -U notebook 3、如果TA-Lib安装不上,先手动安装依赖库 …

Servlet---上传文件

文章目录 上传文件的方法上传文件的示例前端代码示例后端代码示例 上传文件的方法 上传文件的示例 前端代码示例 <body><form action"upload" method"post" enctype"multipart/form-data"><input type"file" name&qu…

transformer学习资料

一、NLP 自然语言处理 NLP 是机器学习在语言学领域的研究&#xff0c;专注于理解与人类语言相关的一切。NLP 的目标不仅是要理解每个单独的单词含义&#xff0c;而且也要理解这些单词与之相关联的上下文之间的意思。 常见的NLP 任务列表&#xff1a; 对整句的分类&#xff1…

【C/PTA】函数专项练习(一)

本文结合PTA专项练习带领读者掌握函数&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 6-1 输出星期名6-2 三整数最大值6-3 数据排序6-4 多项式求值 6-1 输出星期名 请编写函数&#xff0c;根据星期数输出对应的星期名。 函数原…

xss漏洞挖掘

xss漏洞挖掘 以xss-challenge第二关为例 输入123 查看网页源代码 发现value值原样返回 手动挖掘 此处发现尖括号和双引号闭合完整&#xff0c;因此可以直接使用<script>alert(/xss/)</script>测试 发现提交过后标签内容被双引号闭合进去了 因此此处需要将标签…

CAS还能这样理解??

1.CAS全称 全称&#xff1a;compare and swap&#xff0c;比较并交换。 虽然翻译过来是[比较并交换]&#xff0c;但它是一个原子性的操作&#xff0c;对应到CPU指令为cmpxchg。 2.通俗理解CAS CAS 有三个操作数:当前值A、内存值V、要修改的新值B。假设 当前值A 跟 内存值V 相…

高并发分布式架构的演进之路

目录 单体架构 应用数据分离架构 应用数据集群架构 读写分离 / 主从分离架构 引⼊缓存⸺冷热分离架构 垂直分库 业务拆分-微服务 单体架构 一个系统初期&#xff0c;我们需要利⽤我们精⼲的技术团队&#xff0c;快速将业务系统投⼊市场进⾏检验&#xff0c;并且可以迅速…

前端uniapp生成海报绘制canvas画布并且保存到相册【实战/带源码/最新】

目录 插件市场效果如下图注意使用my-share.vue插件文件如下图片hch-posterutilsindex.js draw-demo.vuehch-poster.vue 最后 插件市场 插件市场 效果如下图 注意 主要&#xff1a;使用my-share.vue和绘制canvas的hch-poster.vue这两个使用 使用my-share.vue <template&…

通过css设置元素隐藏和显示

背景&#xff1a;鼠标悬浮时显示删除&#xff0c;放开后显示组件名 解决&#xff1a;通过display:none和display:block显示和隐藏元素&#xff1b; 使用 div p选择器选择当前div的下一个紧跟的p元素 <div v-if"!preview" class"name">{{propertyDa…

java每日一记 —— 浅浅的说下在Lombok中遇到的一个坑

今天说下Lombok 1.先谈谈Lombok吧2.来聊聊为什么有些公司不喜欢用Lombok3.聊点废话 本篇代码在jdk11中测试通过&#xff0c;Lombok版本使用的是1.18.20 昨天写注解时提到了一下Lombok&#xff0c;然而最近写毕业论文又因为Lombok踩过几次坑&#xff0c;所以今天来聊聊 1.先谈谈…