如何保证接口测试的覆盖率?

写在前面_一定要先谈下接口在测试领域的地位:

在当前企业实际测试技能应用中,功能测试和接口测试应用最广泛。但相比功能测试,接口测试缺口却非常大。

且接口测试在测试领域地位非常高,是软件测试工程师初级和中级分界线。所以测试人员只要懂得接口测试,就能找到薪资很不错的工作。
在这里插入图片描述

所以测试工作者(也就是提问者眼中的QA),一定要尽最大努力去提高自己的接口测试实力。

如果想提高接口测试的代码覆盖率。首先要知道代码覆盖率低的原因,才能更好的采取措施来提高代码的覆盖率。仔细分析题主补充的应用场景后,题主的问题我分4部分来阐述。

1、为什么常规接口测试,代码覆盖率低呢?
2、如何提高代码覆盖率呢?
3、为便于理解接口测试用例方法,举例说明。
4、保证接口测试覆盖率可能会遇到的难点分析。

一、为什么常规接口测试,代码覆盖率低呢?

接口QA还是黑盒的。QA们并不关注接口的内部逻辑。只是按自己的理解去设计不同的参数组合当做用例。

其实题主已经揭露了代码覆盖率低的根源。针对接口测试,这种黑盒测试用例设计思维还是比较普遍的。

我们以一个简单的接口场景为例,来看看黑盒测试人员的测试用例设计:

以http协议为例

单接口:

验证 URL
* 针对URL 路径上存在一些特殊的path需要验证

验证 查询参数,请求头、请求体参数
* 针对参数:正则类的参数校验(正常和异常数据)
* 针对业务:单接口功能覆盖(正向需求和反向需求)

验证 响应数据
* 正常接口响应覆盖
* 异常接口响应覆盖(错误信息)

验证 业务场景:
* 覆盖应用的业务场景
* 通过接口,模拟用户可能的操作流程

这种黑盒设计应对接口测试,往往会遗漏下面4个分类:

遗漏分类1、测试不清晰或不规范导致的场景遗漏

如果接口测试用例设计思路不清晰或者不规范,是很容易遗漏场景的。也就是上面所提到的,黑盒测试用例设计思维应该覆盖的场景存在遗漏,肯定会降低代码的覆盖率。

遗漏分类2、涉及不容易覆盖的分支

接口的实现逻辑多种多样,涉及很多分支,下面列举一些常见的点。希望大家多多补充。

1.接口涉及异步任务

当接口涉及异步任务时。常规的接口测试用例设计思路,一般只会触发异步任务正常执行的场景。而异步任务失败,重试,定时被拉起这些异步流程,有可能会被遗漏掉。因此会降低代码覆盖率。

2.接口涉及事务

当某个接口涉及事务,常规的接口测试用例设计,一般只会触发正常的事务流程。而实际开发人员是对具体哪一步回滚,回滚后需要的处理,都是做了一些特殊的业务实现的。这些场景容易被遗漏,也会影响代码覆盖率。

3.接口涉及锁

当某个接口涉及到锁,也会有容易遗漏一些测试场景。以读写锁为例(读-读共存,读-写不共存,写-写不共存)。常规的接口测试用例设计,很可能会遗漏一些 读-读共存,读-写不共存,写-写不共存的场景。就算这些场景被覆盖了,关于锁过期,获取锁失败后等待的场景很难被覆盖到。很明显这会降低代码覆盖率。

4.接口涉及缓存

接口中利用缓存技术是比较常见的,尤其是查询类接口。比如批量查询。如果接口涉及了缓存,常规的接口测试用例设计很容易忽略缓存的影响,而没有针对性对接口缓存相关的验证。这也会降低代码覆盖率。

遗漏分类3.异常场景忽略

理论上讲,每一个接口都可能存在异常场景

当接口存在一些异常场景,抛出了框架的报错,一般是不允许的。换句话讲,程序员一般要对接口可能出现的异常场景 进行处理。有一些场景比较苛刻,不易出现,测试人员也容易忽略。一旦没有覆盖,肯定会降低代码的覆盖率。比如:

场景1: 下游接口返回超时

上游服务调用本服务对外提供的某个接口时,本服务在处理此接口业务需要访问其他服务,其他服务返回可能会超时,本服务一般也不会一直等待。

场景2:数据库连接超时

当某个接口需要操作数据时,数据库服务器的性能是一定的,肯定会存在一些数据库异常的场景。针对这些场景,开发一般都做一些代码处理。

场景3:缓存服务器异常

用户的一些登录状态,如果保存在缓存服务中。如果缓存服务异常或重启,很多接口都会受到影响。这些场景也需要去覆盖。

遗漏分类4.其他相关-项目配置

很多项目的业务逻辑,是可以通过配置来进行控制的,这也是很普遍的。有些功能是否开启,开始的模式,以及具体业务内容的控制,都可以使用配置项来进行处理。
比如:

功能开启开关配置

如果开关关闭,此功能业务代码肯定是没法覆盖了,需要开启并测试相关业务员,这也才能覆盖这类代码。

定时任务配置

根据配置设置定时任务执行策略。一些定时任务会处理不同状态的数据。如果某种任务模式没有测试,或者某个模式下数据状态覆盖不全,都会漏侧场景。降低代码覆盖率。

二、那如何提高代码覆盖率呢?

整体思路:针对第一部分分析的原因,采取一些措施,尽量让咱们不懂代码的测试人员能够更好的测试接口,覆盖这些场景。最终提高代码的覆盖率。

解决1. 黑盒测试场景遗漏

这种场景遗漏,是比较好解决的。具体措施:规范用例设计方法和流程,基本的测试人员都能够胜任。

解决2. 覆盖接口中的特殊分支分、异常场景和项目配置相关场景

想从接口设计用例去覆盖这些场景,前提,是必须得知道这些业务逻辑并理解。为了达到这一目标,可以从以下4步来保障。

1、开发除了提供接口文档,还要提供接口实现文档,在文档中要描述清楚接口的实现流程。比如接口涉及的配置项、异步任务、事务、锁、缓存等等,都要明确说明。最好能够输出流程图或时序图。这一点很关键,这可以大大帮助无代码基础的测试人员理解接口业务和实现细节。

2、测试人员除了参加需求评审,掌握项目需求。还需要参加开发的需求设计评审会议,加深对接口的具体业务理解。由于测试人员单独去阅读学习是有一定难度的,测试人员可以多找对应开发人员了解业务实现。

3、如果需求发生变更,或者业务实现发生变更,及时沟通并更新相关文档。

4、测试人员依据对业务实现的掌握,来设计测试用例,覆盖接口的实现业务场景。

三、为方便理解提高代码覆盖率的方法,举例说明

示例1. 异步任务_以批量删除为例

项目中为了给用户好的体验,一些删除类的接口存在异步删除任务是很常见的。

例如:订单批量删除(某电商),文件批量删除(某盘)等等这些数据的批量删除业务很多都是通过异步任务来实现的。

下面粗略的写一下删除数据的假定逻辑
在这里插入图片描述

分析:

常规的接口测试用例覆盖,容易忽略这些异步任务其他分支。原因也很简单,QA不知道还有这些逻辑。调用接口时,这些场景也不容易触发。

如果开发人员提供了这个流程图,测试人员完全可以根据流程图来设计测试用例,覆盖所有的分支。
场景举例:

异步任务写入失败

可以通过提前写入固定用户的固定数据,阻止数据写入(主键冲突之类的处理)

修改数据库连接数,批量执行删除接口

异步任务执行失败

可以提前预置错误数据,导致执行失败(缺少某些字段,某些字段值是错误数据)

示例2. 事务

项目中,有一些接口的实现,涉及一些事务,这也是非常常见的。
在这里插入图片描述

分析:

接口测试用例设计过程中,考虑在整个业务流程中,尽量覆盖每一步出现异常,设计不同的测试场景,来覆盖整个业务流程。

场景举例:

事务内出现异常,回滚成功。

示例3. 锁

项目中,多端操作也是比较常见,web端,App端,小程序等。那就会存在一些接口操作同一部分数据的场景。

在这里插入图片描述

分析:
在设计接口测试用例时,要考虑锁相关的场景,提高代码覆盖率。
场景举例:
获取锁

无锁

获取写锁

获取读锁

写锁存在

获取读锁

获取写锁

读锁存在

获取读锁

获取写锁

释放锁

读锁

释放锁成功

释放锁失败

写锁

释放锁成功

释放锁失败

示例4. 定时任务

项目如果存在需要批量处理数据时,一般 都会选择在低峰期,通过定时任务来实现。
例如:数据版本迁移,清理过期数据等。

在这里插入图片描述

分析:

针对服务器接口测试时,这些定时任务也要去验证。可以有效提高 代码覆盖率。
在这主要强调一下任务执行的数据状态,要保证数据全面性,整个生命周期的数据代表均要存在,并且要有一定的量级,这样才能覆盖任务的处理逻辑。

场景举例:

定时任务是否拉起

定时任务是否执行

任务执行前,数据是否全面(覆盖整个生命周期的所有类型数)

四、保证接口测试覆盖率可能会遇到的难点分析

难点1. 开发提供的接口实现文档不规范

开发实现文档要有一定的模版和编写规范,严格要求开发人员输出文档。要有把控措施。

难点2.测试人员理解困难

文档要注重流程描述,少代码。

这个是可以培养的,难点并不会特别大。除非这个测试人员不想进步。

难点3.设计的用例无法实施测试

存在一些异常场景,实施测试确实有难度,可以求助。

我现在越来越觉得作为测试人员,在设计用例的时候,是不需要考虑能不能实现测试的。没法测试,多半是因为自己技能不足。所以用例正常设计,用例执行可以找大佬辅助。

五、最后总结

具体的实现要求

开发人员,将接口实现逻辑,从代码思想转化为文档描述。这是让无代码基础理解项目业务的前提。文档要规范,评审要清晰,变更及时同步。

测试人员需要加强学习,通过文档阅读,评审学习,请教开发,理解业务实现。

测试人员深入理解业务,然后设计更全面的测试场景并实施测试。

意义

提高了代码覆盖率,项目自然测试的更加充分。能够发现更多隐藏的问题。

能够让没有代码能力的测试人员快速成长,做好测试。

规范化了开发实现流程,对项目的开发管理也很一定促进作用。

缺点

刚开始实施起来会吃力一些,尤其是跨部门操作。

测试和开发会有更多的沟通成本。


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具

八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到! 

                                    

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

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

相关文章

生成对抗网络DCGAN学习

在AI内容生成领域,有三种常见的AI模型技术:GAN、VAE、Diffusion。其中,Diffusion是较新的技术,相关资料较为稀缺。VAE通常更多用于压缩任务,而GAN由于其问世较早,相关的开源项目和科普文章也更加全面&#…

海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

C++如何用OpenCV中实现图像的边缘检测和轮廓提取?

最近有个项目需要做细孔定位和孔距测量,需要做边缘检测和轮廓提取,先看初步效果图: 主要实现代码: int MainWindow::Test() {// 2.9 单个像素长度um 5倍double dbUnit 2.9/(1000*5);// 定义显示窗口namedWindow("src"…

【使用机器学习和深度学习对城市声音进行分类】基于两种技术(ML和DL)对音频数据(城市声音)进行分类(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【ASP.NET MVC】生成页面(6)

本应该继续数据库访问的问题进行探讨,前文确实比较LOW。但本人认为:初学者需要解决的是快速了解知识路线的问题,所谓“生存问题”,所以,干脆把流程先走完。 一、页面生成 下面这张图在前面已经介绍过: 前…

网工内推 | 云计算工程师专场,CCNP/HCIP认证优先

01 弧聚科技 招聘岗位:网络工程师(云计算方向) 职责描述: 1、作为H3C初级云计算交付工程资源培养对象,需配合完成相关华三产品及服务规范培训。 2、培训赋能后,安排到H3C云项目交付中进行项目交付及驻场支…

【从零开始学习JAVA | 第三十七篇】初识多线程

目录 前言: ​编辑 引入: 多线程: 什么是多线程: 多线程的意义: 多线程的应用场景: 总结: 前言: 本章节我们将开始学习多线程,多线程是一个很重要的知识点&#xff…

【Spring Boot】请求参数传json数组,后端采用(pojo)新增案例(103)

请求参数传json数组,后端采用(pojo)接收的前提条件: 1.pom.xml文件加入坐标依赖:jackson-databind 2.Spring Boot 的启动类加注解:EnableWebMvc 3.Spring Boot 的Controller接受参数采用:Reque…

openCV C++环境配置

文章目录 一、openCV 安装二、新建项目三、配置环境变量四、测试使用 编译器:vs2017 OpenCV:4.5.4 一、openCV 安装 将openCV安装到一个路径下,我安装到了D盘根目录下 二、新建项目 在vs2017新建控制台空项目,打开项目属性 在VC目录 -> 包含目录下…

【Spring Boot】请求参数传json对象,后端采用(map)CRUD案例(101)

请求参数传json对象,后端采用(map)接收的前提条件: 1.Spring Boot 的Controller接受参数采用:RequestBody 2.需要一个Json工具类,将json数据转成Map; 工具类:Json转Map import com…

面试热题(接雨水问题)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 我们看到题的第一步,永远是对入参进行判断 public int trap(int[] height) {if (height null) {return 0;}...} 但是我们想想看,接…

Springboot -- 按照模板生成docx、pdf文件,docx转pdf格式

使用 poi-tl 根据模板生成 word 文件。 使用 xdocreport 将 docx 文件转换为 pdf 文件。 xdocreport 也支持根据模板导出 word ,但是 poi-tl 的功能更齐全,操作更简单,文档清晰。 poi-tl 、xdocreport 内部均依赖了 poi ,要注意两…

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓+IOS前端纯原生源码

伊语IM即时通讯源码/im商城系统/纯源码IM通讯系统安卓IOS前端纯原生源码, 后端是java源码。

利用鸿鹄快速构建公司IT设备管理方案

需求描述 相信应该有一部分朋友跟我们一样,公司内部有很多各种各样的系统,比如资产管理、CRM、issue管理等等。这篇文章介绍下,鸿鹄是如何让我们的资产系统,按照我们的需求展示数据的。 我们的资产管理系统,是使用开源…

机器学习---线性回归、多元线性回归、代价函数

1. 线性回归 回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学模型,然后 将该数学模型用于预测或者分类。该方法处理的数据可以是多维的。 回归是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测&…

51:电机(ULN2003D)

1:介绍 我们51单片机使用的是直流电机 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器,属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos,ribbon还没有被替换。 使用: 在配置类中:LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

MacOS Monterey VM Install ESXi to 7 U2

一、MacOS Monterey ISO 准备 1.1 下载macOS Monterey 下载🔗链接 一定是 ISO 格式的,其他格式不适用: https://www.mediafire.com/file/4fcx0aeoehmbnmp/macOSMontereybyTechrechard.com.iso/file 1.2 将 Monterey ISO 文件上传到数据…

编辑接口和新增接口的分别调用

在后台管理系统中,有时候会碰到新增接口和编辑接口共用一个弹窗的时候. 一.场景 在点击新增或者编辑的时候都会使用这个窗口,新增直接调用接口进行增加即可,编辑则是打开这个窗口显示当前行的数据,然后调用编辑接口。 二.处理方法 在默认的情况下,这个窗口用来处理…

【从零开始学习JAVA | 第三十八篇】应用多线程

目录 前言: 多线程的实现方式: Thread常见的成员方法: 总结: 前言: 多线程的引入不仅仅是提高计算机处理能力的技术手段,更是适应当前时代对效率和性能要求的必然选择。在本文中,我们将深入…