当我们修复测试用例时,到底是修复的什么?

news2024/10/19 3:18:20

当我们运行了测试用例,发现其中一些测试用例未能通过。ok,这下要修复测试用例了!但是,到底需要修复哪些内容呢?

其实从用例被加载到最终执行的过程中,有很多因素可能导致测试失败:

  1. 在测试构建过程中出现了问题

  2. 如果测试通过pipeline运行的,那么可能是pipeline出现了问题。

  3. 该代码正在运行的环境中存在问题

  4. 测试代码运行的环境中存在问题

  5. 被测代码存在缺陷

  6. 测试代码中的错误

  7. 测试应该测试的内容的错误

可以说,在最后三个例子中描述了一次失败的测试,该测试成功地发现了问题。但在前四个例子中,我们甚至没有执行到用例这一步,问题阻碍了测试的进行。因此,在这些情况下,需要修复的不是测试本身。

这就剩下名单上的最后三个了。如果测试发现了代码中的缺陷,那就太好了!修复这个缺陷。如果测试中有编码错误,那就太好了!修复这个错误。但如果测试没有测试它应该测试的内容呢?如果测试设计有问题呢?很简单,修复测试!

修复测试的挑战

理想情况下,事情确实会这样发生。你发现了失败的测试。你理解了它存在的原因以及它应该测试的内容。因此,你根据自己的理解对测试进行了更新,并使其再次通过。也许你还会review和其相关的测试,并对它们也进行更改,你甚至可能还会添加一些额外的测试。

可惜的是,事情往往不是这样的。尤其是当测试随机失败时。

你以为已经完成了。你编写了代码,进行了一些探索性测试,编写了测试用例,它们通过了。然后,要么是在你的本地机器上,要么是在pipeline中,你运行了所有的测试,但其中一些却失败了。你原本以为已经完成用例,但事实证明你还没有。

在那个时候,人们很容易被失败的测试所吸引,并简单地修复导致失败的断言。你查看测试运行器报告的实际结果,心想“是的,看起来是对的”,然后更新测试,以实际结果为依据进行断言。通常情况下,这样做是没有问题的。这是处理此类问题的正确方法。

但有时候情况并非如此。测试会失去一些东西:一些覆盖面,一些意图的清晰度。测试会失去一些价值。如果这种情况发生几次,那么这个测试就不再是一个很好的测试了。它仍然提供了足够的价值,以至于你不想将其删除,但你也不太清楚这个测试究竟在测试什么,以及它与其他相关测试如何共同提供对被测试对象的充分覆盖。

最终该测试成为历史遗留测试。

遗留测试的陷阱

遗留测试是遗留代码的一个子集:你无法废弃的代码,但又希望它能有所不同。

“历史遗留代码通常被定义为“比编写它的团队做出更多设计决策的代码”。

转换为遗留测试:现有的测试正在比团队做出更多的关于测试什么以及如何测试的决定。

那么,你该如何避免陷入遗留测试的陷阱呢?这里有三个建议。

“测试即代码”和“测试即测试”

首先,区分“测试即代码”和“测试即测试”是有帮助的。当你把测试看作“测试即测试”时,你考虑的是测试能够给你的被测应用程序提供的信息。当你把测试看作“测试即代码”时,你考虑的是如何让测试代码按照你的要求运行。

尤其是当测试随机失败时,人们往往只把它当作代码来看待。你需要对测试代码做哪些修改才能让它通过?这时就该退后一步,从另一个角度来看待这个测试:这个测试应该提供哪些信息?我该如何确保它能持续提供这些信息?

明确目的

当你的测试清楚地表达了它们的意图时,提出这个问题就容易多了。每个测试究竟在测试什么?可以通过给测试起清晰的名字、将设置和清理代码与实际测试分离以及有意识地将测试分组来实现这一点。这可能还意味着在代码中稍微“笨拙”一些,使代码尽可能易于阅读——即使这意味着牺牲一些可维护性。

最后感谢每一个认真阅读我文章的人,下方这份完整的软件测试教程已经整理上传完成,需要的朋友们可以文末自行领取:【保证100%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言中的文件操作:从基础到深入底层原理

文件操作是几乎所有应用程序的重要组成部分,特别是在系统级编程中。C语言因其高效、灵活以及接近硬件的特点,成为了文件操作的理想选择。本文将全面深入地探讨C语言中的文件操作,从文件系统的概念到具体的文件操作函数,再到底层的…

生成器和迭代器

迭代器 定义 迭代器是一个实现了选代协议的对象,它可以让我们遍历一个容器中的所有元素,而不需要知道容器的内部结构,迭代器可以被用于遍历列表、元组、字典、集合等容器类型。 工作原理 __iter__():方法返回迭代器对象本身,有…

《15分钟轻松学Go》教程目录

在AI快速发展的时代,学习Go语言依然很有用。Go语言擅长处理高并发任务,也就是说可以同时处理很多请求,这对于需要快速响应的AI服务非常重要。另外,Go适合用来处理和传输大量数据,非常适合机器学习模型的数据预处理。 …

leetcode动态规划(一)-理论基础

本节主要参考:代码随想录 题目分类 动态规划释义 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来…

WinX86内核02-驱动程序

把昨天的程序改用 c++ 编译,改成 .cpp ,发现编译报错 原因是名称粉碎,因此可以直接 extern “C”声明一下这个函数 或者用 头文件(推荐) 因为 在头文件中 可以把 头文件一起包含进去 #pragma once extern "C" { #include <Ntddk.h> ​ /*驱动入口函…

一文搞懂模型倍率怎么计算的,以及模型分组倍率原理!

&#x1f4cd; 已知&#xff1a; ① 输入token&#xff1a;又名 提示、Input token 数 ② 输出token&#xff1a;又名 补全、Output token 数 &#x1f4cd; 基准价格【最初 gpt3.5 的价格&#xff0c;所以倍率越大&#xff0c;越聪明越贵&#xff0c;倍率越小越省钱越笨】 on…

秋招面试题记录

嵌入式软件开发 网上搜集的题目 1.Static关键词的作用&#xff1f; static 关键字有三个主要作用&#xff1a; 局部变量&#xff1a;在函数内部&#xff0c;static 局部变量只初始化一次&#xff0c;且在函数调用结束后仍然保留其值。全局变量/函数&#xff1a;在文件内部&a…

产品自问:前台和中后台

产品自问&#xff1a;前台和中后台 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 前台和中后台通常根据以下几个方面进行区分&#xff1a; 一、功能定位 前台&#xff1a;主要面向外部…

redo文件误删除后通过逻辑备份进行恢复

问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在&#xff0c;如果存在进行下恢复。翻了服务器发现备份文件存在&#xff0c;多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志&#xff0c;赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…

【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)

目录 Anaconda下载 Anaconda安装 conda init conda --v Conda 配置 conda 环境创建 conda info --envs conda list Pytorch安装配置 检验安装情况 检验是否可以使用GPU Anaconda下载 可以通过两种途径完成Anaconda安装包的下载 途径一&#xff1a;本地windows下…

了解静态存储方式和动态存储方式的区别(超详细讲解)快来看

本篇通过一个代码题来考察静态变量和动态变量的区别&#xff0c;主要考察静态变量的值。 在前2章我们讲了变量可以分为全局变量和局部变量&#xff0c;而我们的变量&#xff0c;它的存储又有两种不同的方式:静态存储方式与动态存储方式。 自动局部变量:auto 静态局部变量:stati…

emwin的异常显示和父子坐标问题(瞎写的,别看 -- 2)

文章目录 4&#xff0c;想显示成 最后的demo 仿真器中 1&#xff0c;格子状显示 把下面这句注释掉&#xff0c;就可能会这么显示 WM_SetCreateFlags(WM_CF_MEMDEV);2&#xff0c;显示一副灰度图 很有可能你是这么写的 也就是 hMemDev GUI_MEMDEV_CreateFixed(0, 0, 200, …

Redis-02 单线程与高性能

Redis是单线程吗&#xff1f; Redis不是只有一个线程&#xff0c;通常所说Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数…

BGP(边界网关协议)

1、网络AS&#xff08;自治系统&#xff09; 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。 AS是指在一个实体管辖下的拥有…

【c++并发编程】线程池实现

参考https://shanhai.huawei.com/#/page-forum/post-details?postId43796 完整代码 #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functi…

牛企查:性价比很高的企业综合查询小程序

很多人都会有查询企业信息的需求&#xff1a; 入职公司前查询企业的基本信息&#xff1b; 只是需要简单便捷查询到企业的信用代码注册地址等基础信息&#xff1b; 做企业调查&#xff0c;分析时需要用到企业的一些数据&#xff1b; 研究一些单项数据的时候&#xff0c;需要…

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

27.第二阶段x86游戏实战2-遍历周围NPC跳出递归循环

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01;0 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…