接口用例之好用例和坏用例

  自动化测试的重要性显而易见,但自动化测试又无法解决所有问题,所以说完全依赖自动化是不可能的,但完全没有自动化是万万不能。在软件开发项目中,重度依赖人力进行持续回归是一件非常枯燥的重复工作。企业需要花费大量的时间和金钱来维持这样一支队伍以保证产品质量,而队伍中的同学在每天重复劳动的工作之下,也丝毫得不到成长,看不到方向。
  尽管自动化测试不能解决所有问题,但是却拥有一个优势:“Once” Written, Run Anytime as Desired(一旦写好,即可随意重复执行)。所以,自动化测试通常都会跟持续集成系统(比如Jenkins)配合使用,就像“良辰美景”要配上“月光杯”才算的上是极致。这样我们可以避免在软件上线或交付的最后一刻,还深陷软件问题的泥潭中。当然,这也是敏捷开发的关键所在,把问题消灭在过程中,只需持续关注增量内容。另外,在持续集成中,可以根据自己的需求来确定自动化测试的触发频次和时间,比如“代码提交”、“定时触发”等。
  万物皆有阴阳两面,自动化测试有这么多优势,当然也有它的劣势。所以,至今仍然有很多公司自动化水平不高。我们分析一下这些劣势,主要有以下几方面:
对测试人员要求相对较高。
  测试用例需要根据版本迭代进行更新,有一定维护成本。
  测试结果不一定可靠,测试用例也分“好”、“坏”。

  前面两点也是大家公知的问题,每个公司各有自己的情况判断,今天也不做赘述。今天我主要讨论第三个问题,也就是:怎么保证我们花了时间和精力去做的自动化测试,其结果是有效的、是能够反映被测代码质量的?

一、 测试用例也分好坏

  对于标题,你可能会有疑问,测试用例竟然也有好坏?的确,测试用例也有好坏之分,那么什么是坏用例?什么是好用例?那要先从测试用例的特征说起:
自动化测试或者测试用例的根本目的就是judge(判断)被测系统是否有问题,是以衡量被测产品的“标尺”存在的。所以,它具备一个重要的特征:在测试脚本和被测代码都保持不变的情况下,测试结果应该是稳定的、不变的。
根据这个原则,“坏用例”并不是指测试不通过的用例,更不是测试通过的用例,而是指那些在相同条件下,偶尔通过、偶尔不通过的测试用例。反之,“好用例”则是表现稳定的用例。
  为什么说“坏用例”破坏性大?因为如果用例本身不具备稳定的结果输出,就无法准确的衡量被测产品是代码的问题还是用例本身的问题。如果每次测试结果都不能直接说明问题,需要进行反复分析,将直接导致大家对测试用例失去信心。也就是说,测试同学和开发同学会把测试用例的不通过,当成“Warning”而非“Error”,这样的最终效果就是自动化测试慢慢被抛弃。

二、 测试用例的生命周期

  有了“好用例”、“坏用例”的区分,测试用例就是“鲜活”的了。事实上,我们也可以规划处一个测试用例从生到死的生命周期。

  一般情况下,我们可以以测试用例通过率或通过次数来为其划分“好/坏”。随着执行次数的增多,测试用例可以切换“好/坏”状态,当“坏用例”持续一段时间之后,我们可以把它标记为“垃圾用例”,并从自动化执行的序列中剔除。“坏用例”和“垃圾用例”可以被开发或者测试同学修复,然后进入“未知状态”。“未知状态”中的应用随着执行次数的增加,不断的在这个生命周期里循环往复。

三、 如何消灭坏用例

  至此,我们明白了测试用例的“好/坏”之分,也了解了测试用例的生命周期。那么,我们如何保证用例质量,“消灭坏用例”呢?

  1,通过“CI”(Continuous Integration持续集成)发现“坏用例”
  “坏用例”指的是偶尔不通过、偶尔通过的用例。所以,你会发现在本地运行的时候很难发现“坏用例”,因为“坏用例”需要被执行很多次才能被检测出来。执行很多次的过程可以非常好地通过CI系统来帮助实现,所以,如果你还没有使用CI系统,也依然建议使用持续集成工具进行多次的执行用例,即便你的工程量很小。另外一点,CI系统可以在一天不同的时刻执行用例,而时间也是一个“坏用例”产生的可能属性。
当然,成熟的CI系统(比如Jenkins)都可以满足绝大部分人的业务需求

  2,防微杜渐
  可能大家都听过“破窗理论”:当房子上的一扇窗户的玻璃被打破,如果不及时修复,将会有破坏者破坏更多的窗户。“坏用例”现象也是一样的,当出现一个“坏用例”时,如果不抓紧修复,整个测试用例集甚至自动化测试结果的可信度都将快速下滑。
对“坏用例”采取零容忍的态度,有助于整体自动化水平和质量的提升。可以建立测试或开发人员“坏用例”档案,并自动追踪每一个“坏用例”的来源,督促负责人跟进解决。

  3,避免执行环境差异
  例如,保证本地用例执行时的环境与CI执行用例环境是一致的。

  4,使用异步等待
  通常,一个测试用例多个测试步骤组合而成,每一个测试步骤都需要特定的执行时间,所以,大家写测试用例一般的做法就是等待特定的时长,比如5秒。但是相同的测试步骤在每次用例执行过程中的时长并不相同,并且有时差异还会很大。这往往会导致上一步还未完成,下一步就开始执行,导致“坏用例”的产生。
另外,即便是步骤执行没有超时,但依然可能造成时间上的浪费,比如一个步骤等待5s,但实际执行只用了2s,就有3s的时间浪费。
理论上,解决这个问题有两种方式:回调、轮询。回调是指,上一步执行完成后,通知执行测试用例的进程/线程继续下一步。但这种方式在实际中并不采用,因为它需要紧耦合被测系统,可能为被测系统带来新的问题和维护成本。所以,实际中,更多的采用的是以“观察者”身份存在的轮询。比如说,以很小的时间间隔来不断查询是否到达下一步执行的状态。这样就能够避免一定程度的“坏用例”的产生。

  5,解决并行执行的问题
  如果测试用例存在并行执行的情况,请确保多个测试用例之间不会因为相互对被测系统的影响导致冲突,从而使用例变成“坏用例”。比如,在所有测试用例执行过程中,数据库相关操作都采取事务的方式,用例执行完成后,就立即进行回滚。

  6,避免测试用例互相依赖
  如果一个用例集中的测试用例时相互依赖的,那如果其中有一个“坏用例”出现,将会导致整个用例集不稳定。所以,尽量保证用例集中的每一个用例没有相互依赖关系,每一个都可以独立执行验证。

  7,避免测试脚本太长
毫无疑问,一个测试用例的步骤越多,可能变成“坏用例”的概率越高,所以,一般情况下,一个App的测试用例不超过在30步最好。

  8,提高测试用例代码水平
一个“好用例”除了结果足够稳定之外,还需要具备良好的结构设计,以及良好的可读性、可维护性。这一点对测试用例编写人员要求较高,当然,通过多读、多思、多写,能够很快的提高自己的自动化用例编写能力。

本文转自:https://testerhome.com/topics/5921,作者:vividly

 

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

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

相关文章

代码随想录算法训练营第33天|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果

代码随想录算法训练营第33天|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果 1005.K次取反后最大化的数组和 本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。 https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%…

【QA】MySQL导出某数据库的所有数据为sql文件,包含建库命令、建表命令。

文章目录 前言Windows系统下 | mysqldump导出数据库数据Docker中导入初始化数据【补充】通过命令行,执行sql文件,将数据导入到数据库在MySQL外面执行在MySQL中执行 前言 我们在用docker部署mysql项目的时候,往往需要对数据库进行数据初始化。…

PLC_博图系列☞RS:复位/置位触发器

PLC_博图系列☞RS:复位/置位触发器 文章目录 PLC_博图系列☞RS:复位/置位触发器背景介绍RS:复位/置位触发器说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 RS 背景介绍 这是一篇关于PLC编程的文章,特别…

蓝桥杯java---螺旋矩阵

解题思路&#xff1a; int [][] arr new int[n][m];int i 0, j -1, temp 1;while (n * m > 0){for (int p 0; p < m; p)//从左自右arr[i][jj1] temp;n--;if (n * m 0) break;for (int p 0; p < n; p)//从上自下arr[ii1][j] temp;m--;if (n * m 0) break;fo…

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板

鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板&#xff1b; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙官方文档我们知道DevEco Device Tool是一个V…

C语言:自定义类型:联合体和枚举

目录 联合体 联合体是什么&#xff1f; 联合体的大小计算 枚举 枚举是什么&#xff1f; 为什么要使用枚举&#xff1f; 联合体 联合体是什么&#xff1f; 联合体也是个自定义类型&#xff0c;它和结构体类似&#xff0c;都是由多个成员构成&#xff0c;可以有不同的内置…

【Java八股面试系列】中间件-Redis

目录 Redis 什么是Redis Redis解决了什么问题 Redis的实现原理 数据结构 String 常用命令 应用场景 List(列表) 常用命令 应用场景 Hash(哈希) 常用命令 应用场景 set(集合) 常见命令​编辑 应用场景 Sorted Set(有序集合) 常见命令​编辑 应用场景 数据持…

【数据结构】线性表的定义与基本操作

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

【搭建私人图床】本地PHP搭建简单Imagewheel云图床,在外远程访问

目录 ⛳️推荐 1.前言 2. Imagewheel网站搭建 2.1. Imagewheel下载和安装 2.2. Imagewheel网页测试 2.3.cpolar的安装和注册 3.本地网页发布 3.1.Cpolar临时数据隧道 3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09; 3.3.Cpolar稳定隧道&#xff08;本地设置&…

JavaScript 基础、内置对象、BOM 和 DOM 常用英文单词总结

一提到编程、软件、代码。对于英语不是很熟悉的同学望而却步。其实没有想像中的难么难&#xff0c;反复练习加上自己的思考、总结&#xff0c;会形成肌肉记忆。整理一下&#xff0c;初学者每天30遍。 1、JavaScript 基础语法 break&#xff1a;中断循环或 switch 语句的执行。…

ISAC代码仿真学习笔记

文章目录 A. MIMO Communication ModelB. MIMO Radar Model III. Joint Waveform and Phase Shift Matrix Design for Given Radar BeampatternA. Problem FormulationB. Proposed Algorithm V. S IMULATION RESULTS A. MIMO Communication Model 用户处的接收信号矩阵由 Y …

IO流之字符流实战

IO流&#xff08;一&#xff09;字符流 一、IO流是什么&#xff1f;二、File类三、引入IO流四、代码演示例题&#xff1a;通过java程序完成文件的复制操作从文件中读取数据&#xff08;一个一个读&#xff09;向文件中写入数据&#xff08;一个一个写&#xff09;利用缓冲数组读…

景泓达智能科技邀您参观2024第七届燕窝及天然滋补品博览会

2024第七届世界燕窝及天然滋补品博览会 2024年8月7-9日| 上海新国际博览中心 同期举办&#xff1a;第三届世界滋补产业生态大会暨交流晚宴/颁奖典礼 2024第九届酵素、益生产品博览会 2024上海国际月子健康博览会 2024上海燕博会经历了7年的发展与资源积累&#xff0c;已成为…

初始Redis关联和非关联

基础篇Redis 3.初始Redis 3.1.2.关联和非关联 传统数据库的表与表之间往往存在关联&#xff0c;例如外键&#xff1a; 而非关系型数据库不存在关联关系&#xff0c;要维护关系要么靠代码中的业务逻辑&#xff0c;要么靠数据之间的耦合&#xff1a; {id: 1,name: "张三…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据&#xff0c;如果我开始玩游戏之后&#xff0c;被怪物打了失去了一部分血量&#xff0c;这个时候我想退出游戏&#xff0c;当我再次进入的时候&#xff0c;希望仍然保持被怪物打之后的血量&#xff0c;而不是重新读取了数据表&#xff0c;这个时候…

锁的7大分类

锁 首先会了解锁的整体概念&#xff0c;了解锁究竟有哪些分类的标准。在后面的文章中会对重要的锁进行详细的介绍。 锁的7大分类 需要首先指出的是&#xff0c;这些多种多样的分类&#xff0c;是评价一个事物的多种标准&#xff0c;比如评价一个城市&#xff0c;标准有人口多…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中&#xff0c;输入“# df -h”命令&#xff0c;查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘&#xff08;这…

Spring Boot + MyBatis

一、配置依赖 <!-- MyBatis --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.5.3</version> </dependency> <!-- junit测试依赖 --&g…

Unity连接MySQL踩坑,问题处理记录

用的unity2021版本&#xff0c;MySQL是官方下载的最新版8.0.36. 安装MySQL时&#xff0c;过去如果安装过&#xff0c;一定要删干净&#xff0c;单纯的卸载不行&#xff0c;网上有很多教程。 MySQL安装完成后&#xff0c;将安装目录的MySql.Data.dll文件放入unity项目的Plugin…

隐语技术架构

隐语架构 产品定位 算法层 计算层 密码原语 互联互通–资源层 总结