字节8年经验之谈 —— 如何编写出色的接口测试用例?

2024-01-27 17:20

本文主要是介绍字节8年经验之谈 —— 如何编写出色的接口测试用例?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

一 测试分层

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

image.png

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

单元测试

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

模块测试

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

接口测试

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

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

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

二 测试原则

基础原则:

  • 自动化:接口测试是非交互式的自动化执行,不需要人参与。

  • 独立性:接口测试之间不应该相互依赖。

  • 可重复:接口测试可重复执行,不受环境影响。

  • 接口测试遵守BCDE原则,保障接口交付质量。

    • Border:边界测试。

    • Correct:正确的输入,正确的预期输出。

    • Design:按照需求和设计文档编写测试逻辑。

    • Error:错误输入,预期输出。

  • 数据准备:数据准备通过系统服务进行,不能通过直接插入db方式。

  • 可测性:对于不可测的代码需要进行重构成合理的结构。

  • 覆盖性:接口测试需要覆盖所有UC,同时代码覆盖率和分支覆盖率应达到一定标准,新增代码必须被覆盖。

  • 持续性:如果代码修改导致已有接口测试执行失败,必须修复代码问题或者测试代码逻辑。

  • 时间要求:接口测试应该在项目发布之前完成,不应放到项目发布之后补充。

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

image.png

从系统角度来分析入口调用,以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的产生,开发同学也会更有积极性去重构代码。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

这篇关于字节8年经验之谈 —— 如何编写出色的接口测试用例?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/650965

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

股票数据接口-陈科肇

陈科肇 新浪财经 sz-深圳sh-上海历史分价表:http://market.finance.sina.com.cn/pricehis.php?symbol=sz000506&startdate=2016-12-27&enddate=2016-12-27历史成交明细(当日成交明细):http://vip.stock.finance.sina.com.cn/quotes_service/v

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

实例demo理解面向接口思想

浅显的理解面向接口编程 Android开发的语言是java,至少目前是,所以理解面向接口的思想是有必要的。下面通过一个简单的例子来理解。具体的概括我也不知道怎么说。 例子: 现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的