探讨接口测试颗粒度

偶然间在论坛上看到一个帖子,帖子内容如下:
 

假设现在有一个新增商品的接口,返回的参数中有新增商品的 id(每次返回的 id 都不一样)、success(判断是否成功,0 失败 1 成功)
1. 接口测试,断言的时候是否需要断言 id,还是说只需要断言 success 等于 1 就行?
2. 如果需要断言 id,是断言 id 不为空即可,还是说从数据库中取新增商品的 id 和接口返回的 id 进行比较,断言是否相等,这种比较有必要吗

问题的核心点是接口测试断言颗粒度问题,大家的观点基本上属于两派:

1. 只需要断言接口响应即可,无需做DB落表数据断言

2. 断言尽可能详细,DB断言很重要。

单体架构测试颗粒度

本文的主题也由此展开,探讨一下微服务接口测试的颗粒度问题。

20年之前,当时负责的产品属于单体架构,产品功能也相对比较简单。第一家公司产品是一个用户营销平台(画像系统),核心功能就是用户标签管理、圈人管理以及客群管理;第二家公司所在部门做在线教育产品,产品是内容生产平台,该平台用于对 K12 教辅书籍进行流水线形式录入,功能涉及文件上传、目录录入、内容框选、题目录入、题目质检等。

当时的测试策略,测试重点在于功能测试,测试手段是手工端到端测试以及实现自动化的接口端到端测试用例。说白了只要覆盖核心的业务场景(核心链路),发布后就基本上没太大问题。

当然,单接口的自动化测试也有覆盖,包括对接口在处理业务前的前置处理逻辑测试,以及接口处理业务逻辑后的输出结果测试。

1.默认值测试

很多情况一些非必填的参数会有默认值,比如说一个查询的接口,参数count为返回查询的结果数量, 默认为10,那么就应该有一条case来测试,当然前置条件是数据库里面必须要存在这样的数据超过10条。

2.异常类型测试

比如上面的count参数,这个参数的类型一定是可以转换为int类型的,这时候我们需要测试如果传的一些不可以 转换为int类型值来测试代码是否加入判断

3.必传项测试

如果接口的参数有必传项,那么需要测试在不传这个参数的时候接口返回情况,测试是否会提示 相应的error code

4.非必传项测试

如果接口有非必填项,当我不传递这些参数的时候会不会正常的返回相应的结果

5.非空测试

无论是必传的和非必传的参数,传递的key是正确的,但是value=null,这时候返回结果是否正确

6.错误码测试

通用的错误码与业务错误码是否能够清晰的说明调用问题,错误码是否能够尽可能的全的覆盖所有的情况

7.接口返回值

主要是对接口返回结果进行断言。例如返回结果中某些字段是否缺失,类型是否正确等。

但我印象中,单接口测试用例发现的缺陷比例占比相对比较少,更多缺陷都是通过端到端测试发现的。

总结一下,可能是出于业务简单(链路复杂度低、业务模型简单)的缘故,测试手段为手工测试+自动化测试,测试场景覆盖核心业务流程即可,接口自动化测试断言返回数据就能满足质量要求,也很少断言DB数据。

微服务架构测试颗粒度

来到阿里,接触的产品业务复杂度、技术架构复杂度指数级增高,此外金融类业务对资损的把控极其严格,只要是资损至少是P级故障了,并且和绩效直接挂钩。所以金融类业务的质量保障工作压力颇大,对测试质量要求极高。因此对落库数据正确性、对下游调用的参数正确性都必须校验到。

通常情况下,开发的编码质量也比较高,常规的业务功能用例开发基本上联调过问题不大。对测试同学来说,测试的重点更多偏向于异常测试场景,例如缓存数据一致性、高并发、异步消息重发/漏发等这些情况下系统该如何正确处理。

为什么与之前单体架构测试颗粒度差别如此之大?我从二者架构差异的以下几点说一下:

1.微服务架构部署和运维成本更高:微服务架构中的服务数量通常比单体架构更多,每个服务都需要独立部署、配置和监控,这会导致部署和运维成本变得更高。

2.微服务架构通常是分布式系统的:微服务架构中的服务分散在不同的服务器上,服务之间通过网络通信。服务实现时必须考虑分布式系统的问题,比如服务发现、负载均衡、容错等,显然这些都会增加系统的复杂性。

3.数据一致性问题:由于微服务架构中的服务是相互独立的,服务之间使用各自的数据库。这使得数据一致性变得更难以保证。

4.服务之间的依赖更加复杂:在微服务架构中,一个服务通常会依赖其他多个服务,这就需要管理服务之间的依赖关系(契约)。

ok,说了这么多差异,下面介绍一下当前的接口测试颗粒度。

在测试策略上,不同于单体架构的端到端测试,如今测试重点是服务自身。如上图所示,如果以下单支付业务为例,服务A可以理解为网关的下单支付接口,服务B可以是X应用的下单支付接口,服务C可以是下游X域的支付接口,这样服务A、B、C分属不同的开发团队,则各个开发团队也只能保证各自应用服务的质量,所以测试重点就是服务自身,很少进行端到端测试。

基于此,如果你负责的服务是服务B,则你测试的颗粒度至少保证到:

1.服务A各种调用B的请求场景需要考虑到。正向的场景可以正确响应和异常的场景服务B则给予上游约定的错误码。

2.服务B内部的业务正常和异常处理落库的数据正确性。

3.服务B调用服务C,请求报文是否和契约一致。

此外,上文说到了数据一致性问题。整个也是比较重要的,一笔请求从A到C,则如何保证数据的金额、状态一致性也是需要测试同学关注的。当然如今对分布式系统数据一致性采取的都是最终一致性的实现方式。

1.采用分布式事务:分布式事务是指跨越多个节点的事务。当多个操作需要在不同的节点上执行时,为了确保所有节点上的操作都能正确地执行并且保持一致,可以使用分布式事务来协调这些操作。常见的实现方式包括两阶段提交和三阶段提交。

2.使用分布式锁:分布式锁是指在分布式系统中对共享资源进行加锁的一种机制。它可以防止多个节点同时对同一个资源进行修改,从而保证数据的一致性。常见的分布式锁实现包括基于数据库的分布式锁和基于缓存的分布式锁等。

3.采用分布式缓存:将数据存储在分布式缓存中,每个节点都可以从缓存中读取数据。如果缓存中没有所需的数据,则可以从数据库中读取。这种方法可以大大减少对数据库的访问次数,因此也能提高系统的性能。

如何测试数据一致性,测试同学只有先了解这些框架本身的原理,才能通过一定的测试手段构造这样的业务场景。

即使有些场景无法构造,也是可以使用被动手段来验证数据一致性,例如可以借助于核对的手段。对同一笔单据,服务A-服务B-服务C,落库数据的一致性核对;以及服务B落库数据各表数据一致性核对。

总结一下:微服务架构下业务复杂度高、技术架构服务高,对测试质量提出了更高的要求,单体架构下的测试策略已经不适用于微服务架构,微服务架构更偏重于接口测试。对接口测试的颗粒度要求尽可能细:

1.异常场景正确处理(这点和单体架构测试点几乎是一致的,如1-6)

2.契约测试保证契约符合预期

3.落库数据准确性

现在回头再看文章开头的那个问题,我认为他们说的都没错,凡事没有绝对性,不同的产品有不同的质量要求,最优解就是花最少的时间得到最优的质量回报。


 

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

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

相关文章

Elasticsearch painless脚本教程(包含Java API和SpringDataElasticsearch调用脚本)

Elasticsearch painless脚本 1.什么是painless2.painless的特性3.使用kibana进行准备操作3.1 使用kibana创建索引和映射3.2 使用kibana添加测试数据 4.使用painless执行查询操作关于脚本查询须知4.1 字段查询脚本4.1 排序查询脚本 5.如何使用painless执行更新操作关于脚本查询须…

【机器学习】第二节:线性回归和线性分类

作者🕵️‍♂️:让机器理解语言か 专栏🎇:机器学习sklearn 描述🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语💓:🐾没有白走的路,每一步都算…

Text-to-SQL提示工程【Prompt Engineering】

我们刚刚启动了一个开源项目pg-text-query,目标是为文本到 SQL 制作生产就绪的大型语言模型 (LLM) 提示。 我们的目标是 利用 LLM、我们自己对 PostgreSQL 数据库的深入了解以及严格的测试来开发一流的文本到 SQL 的翻译。 推荐:用 NSDT设计器 快速搭建…

【MySQL】C语言连接数据库

在使用数据库的时候&#xff0c;我们是操作客户端方的&#xff0c;向服务器请求数据。MySQL的端口号-3306 连接mysql需要头文件&#xff1a;#include<mysql/mysql.h> 基础连接步骤&#xff1a; 1.创建连接句柄 MYSQL mysql_con;//连接句柄 2.初始化连接句柄mysql_i…

「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

OceanBase 4.1 体验 前言OCP Express在线升级功能租户级物理备库TP&#xff08;事务处理&#xff09;和AP&#xff08;分析处理&#xff09;优化TP 性能优化AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4.1的初体验&#xff0c;国产的分布式数据库也太太太太…

有哪些好用的AI工具?

现在有很多好用的AI工具&#xff0c;以下是一些常用的&#xff1a; 1. TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;支持多种编程语言&#xff0c;包括Python、C、Java等。 2. PyTorch&#xff1a;Facebook开发的深度学习框架&#xff0c;易于使用&#xff0c;…

Redis源码分析之网络模型

Redis网络模型 阅读源码的初衷Redis源码阅读 阅读源码的初衷 很多网上解释这个Redis为啥这么块&#xff1f;都会说Redis这么快的原因会有一个Redis才用了单线程&使用了多路io复用来检查io事件&#xff0c;单线程可以避免多线程对资源的竞争。如果我们使用了多线程那么就需…

ChatGPT其实并不想让开发人员做这5件事情

前言 ChatGPT已经火爆了快半年了吧&#xff0c;紧接着国内也开始推出了各种仿制品&#xff0c;我甚至一度怀疑&#xff0c;如果人家没有推出ChatGPT&#xff0c;这些仿制品会不会出现。而很多人也嗨皮得不行&#xff0c;利用各种方法开始科学上网&#xff0c;用ChatGPT做各种觉…

[读书笔记] Variational AutoEncoders

小全读书笔记 《Variational AutoEncoders》 1. Generative Model &#xff08;生成式模型&#xff09;简述2. 简单生成模型 AutoEncoders2.1 结构2.2 不足 3. Variational AutoEncoders4. Variational AutoEncoders的数学支持 此读书笔记来自于Joseph Rocca的Understanding Va…

APP 兼容性测试是什么?8年测试老鸟告诉你

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

js执行思维导图

备注&#xff1a; js执行&#xff1a; 执行分为两部分&#xff1a;预执行和执行 预执行&#xff1a;创建好执行上下文 执行&#xff1a;执行栈中执行 js引擎&#xff1a; 读取并执行js 各个浏览器的引擎如下 …

linux学习[10]磁盘与文件系统(1):查看磁盘容量指令df 评估文件系统的磁盘使用量指令 du

文章目录 前言1. df指令2. du指令 前言 TF卡制作的过程中涉及到了磁盘分区格式化等问题&#xff0c;当时对具体的指令理解不是特别深刻&#xff1b;由此引申到我对linux中的整个磁盘与文件系统没有一个全面的认识&#xff0c;这个磁盘与文件系统的系列博客章节就对这些进行记录…

MySQL的主从复制与读写分离

一、MySQL主从复制 1、mysql支持的复制类型 STATEMENT∶基于语句的复制。在服务器上执行sql语句&#xff0c;在从服务器上执行同样的语句&#xff0c;mysql默认采用基于语句的复制&#xff0c;执行效率高。 ROW∶ 基于行的复制。把改变的内容复制过去&#xff0c; 而不是把命…

下载和安装appuploader

转载&#xff1a;下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程&#xff0c;无需再安装其他软件。…

微服务保护(线程隔离、降级、熔断)

线程隔离 线程隔离有两种方式实现: 线程池隔离信号量隔离 线程池隔离 假设服务A依赖于服务B和服务C&#xff0c;那么服务A就会分别对服务B和服务C创建线程池&#xff0c;当有请求进来时不会使用服务A本身的线程&#xff0c;而是到对应的线程池中取一个线程来调用feign的客户…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子&#xff0c;跑Amber动力学模拟 下载1phv 从PBD下载文件&#xff1a;https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法快慢指针法【双指针】递归法)

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;代码实现2.1 三指针法2.2 快慢指针法&#xff08;双指针&#xff09;2.3 递归 第一部分&#xff1a;题目描述 &#x1f3e0; 链接&#xff1a;82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xf…

ChatGPT热门资料汇总,绝对不割韭菜

前言 ChatGPT 的出现&#xff0c;AI圈子一下就热闹起来了&#xff0c;各个公司争先恐后地出自己的产品&#xff0c;百度的文心一言、谷歌的Bard、阿里的通义千问等等&#xff0c;有很多人借此机会已经赚到百万&#xff0c;很多卖课搞培训的都是互为合伙人&#xff0c;大家都懂…

如何注册appuploader账号​

如何注册appuploader账号​ 我们上一篇讲到appuploader的下载安装&#xff0c;要想使用此软件呢&#xff0c;需要注册账号才能使用&#xff0c;今​ 天我们来讲下如何注册appuploader账号来使用软件。​ 1.Apple官网注册Apple ID​ 首先我们点击首页左侧菜单栏中的“常见网…

【更新日志】填鸭表单TduckPro v5.1 更新

hi&#xff0c;各位Tducker小伙伴。 填鸭表单pro迎来了v5.1版本&#xff1b;本次我们进行了许多的功能新增和优化&#xff0c;能够让我们在日常使用中获得更好的体验。 让我们一起来康康新功能吧。 01 新增Pro功能 新增登录后才能填写表单。 新增表单卡片一键发布。 新增矩…