最恶心的测试用例--现实生活中的反模式测试行为

 

看到一篇吐槽测试用例的文章https://itnext.io/the-worst-test-suite-testing-anti-patterns-experienced-in-real-life-24fd13ee3ddd,觉得挺有意思的,没啥新意,不过也确实是我们会遇到的问题,或者说是我们生活的一部分。顺手翻译了一下,下面是文章内容。

图片

我认为这里不需要介绍,我将告诉您我遇到的最糟糕的测试套件(testsuit)是什么样子,以及它是如何运作的。

我提前警告您,这篇文章会让您感到恶心,皮肤发痒,工程技能受挫。

我将介绍的反模式将以恶心程度进行排名,从🤮表示糟糕到🤮🤮🤮表示完全不可原谅。所有的反模式都很糟糕,但其中一些我从未在其他地方见过,我认为对它们进行排名将强调它们的隐蔽性。

在阅读本文时,整个套件大约有10个测试文件。其中9个是“合理的”,第十个则是一场噩梦:它有大约3000行代码,总共组合了约80个测试用例。测试套件的约95%都在这个文件中。

除了测试用例之外,测试使用的所有工具都散落在这个文件中。

混合测试类型

恶心程度: 🤮

该文件包含了许多不同类型的测试——从单元测试到组件测试,再到端到端测试。有些测试非常难以确定测试类型——有些单元测试通过运行系统的主要部分来测试特定的小功能,而在其他情况下,通过调用系统的内部功能序列来执行主要的端到端测试。

为什么测试被编号?

恶心程度: 🤮🤮🤮

所有的测试名称都被编号了!所有的测试都采用了TestXX_what-the-test-checks的形式。

这是一个重要的警示信号,当我加入这个项目时,我没有完全意识到它的重要性。大约工作了两个月后,显然这些测试之间的顺序是有问题的!这些数字是为了强制排序而存在的。这些测试是相互依赖的。

不用说,当我移动一些测试以使那个庞大的文件变得更清晰时,我是以艰难的方式学到了这一点。

如果我想添加一个测试,它必须与其他测试正确排序。这创造了一种荒谬的情况,我必须正确命名测试以便按正确的顺序运行。因此,如果我想让一个测试在Test34_XXX和Test34_YYY之间运行,我必须将我的测试命名为Test341_ZZZ,以确保字典顺序正确 🤯

匿名测试

恶心程度: 🤮

关于测试名称,还有一件事——其中一些是匿名的——这些测试并没有说明它们实际覆盖的内容,例如:test19_requirement_59_passes或者最受欢迎的test87_process_works。

有些测试只有在我引入了使它们失败的更改后,我才知道它们测试的是什么,这迫使我进行调查工作以弄清楚它们在做什么。

(这不是原文,这只是我的补充:这种情况就是测试用例的名字没有任何的意义,没人知道这个用例在做什么)

断言?它们只是建议

恶心程度: 🤮🤮🤮

一些测试没有以断言结束。您当然会问一个没有断言的测试在做什么?

在这些测试中,测试的顶部有一条注释,指示“用户”去做某事。通常是像“转到日志文件并检查是否存在格式为X - Y - Z的日志消息”。

不用说,这并没有说明日志文件在哪里,如果有多个文件(由于日志轮换配置)该怎么办。而且,在某些情况下,这些说明已经过时,日志消息自“测试”和其说明编写以来已经发生了变化。

这些测试显然总是通过的,项目移交期间没有人告诉我这些事情,我是在添加一个功能时偶然发现有一个测试,其名称表明它测试的是我实现的过时功能的相反面。它显然通过了(因为它没有断言)。

我删除了所有这些测试,再也没有回头看过。

(这不是原文,这只是我的补充:这种情况就是只执行动作不做断言,基本上大部分同学入门的时候都会经历这个阶段。)

复杂和隐晦的输入

恶心程度: 🤮

系统的测试输入相当复杂,大多数测试都基于一个单独的输入文件。除了“刚好足够让测试通过”的输入之外,它包含的内容相当隐晦。没有人真正记得这个测试文件是如何创建的。

为了将每个测试带到相关状态,散布在3000行代码中,有一些实用方法来操作输入文件。它们都没有解释它们的作用,通常被称为prepare_for_test78之类的名称。

每当我们需要更改输入时,我们都会有点儿心痛 🥲

(这不是原文,这只是我的补充:这种情况就是准备的数据不具备可读性,没人知道这些数据是做什么的。)

拖累的共享状态

🤮恶心程度: 🤮🤮

不仅测试彼此相互依赖,被测试的系统本身也在测试之间拖累了一些内部状态。

原始作者没有在每个测试之前重新创建系统,而是添加了一组方法,使测试驱动程序能够将内部状态置为null。

入口不明确

恶心程度: 🤮🤮

有一些测试调用了内部函数,并按照特定顺序调用——实际上很难确定测试的入口是什么。事实证明,所有这些调用的函数散布在不同的类中,影响了一些最终被测试的内部共享状态。

最后的思考

是的,这是一个真实的故事。是的,有点夸张,但只是一点点。

我不知道这个测试套件是如何变得如此糟糕的,但我认为只是出于善意。

这个项目在很长一段时间内处于POC阶段,并且直到后期才成为任何人关注的焦点或优先事项,这可能可以解释,但我不知道。

幸运的是,被测试的系统相对简单。除了复杂的输入之外,逻辑本身并不太难理解和推理。这使得在这些条件下工作成为可能。如果系统稍微复杂一些,情况可能会更糟。

话虽如此,也许系统足够简单是导致测试套件变得如此糟糕的原因?

我们尽力改善情况,但我们主要是尽量不要让情况变得更糟。所有新开发的内容都要符合更高的标准,我们决定尽量少地添加到“厄运之一文件”中。

尽管如此,这次经历对我来说是一所了不起的学校——我学到了不应该做什么,以及做这些事情的影响。就像得了一次非常严重的肺炎,才明白在寒冷的冬天穿着T恤出门是不应该的。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

内容概要:本文详细介绍了使用KGDB(Kernel GNU Debugger)调试Linux内核的方法及其重要性。文章首先强调了Linux内核作为系统核心的重要性及其调试的必要性,随后介绍了KGDB的基本原理和优势,包括其基于调试stub和GDB串行协议的工作机制。接着,文章详细描述了使用KGDB调试内核的具体步骤,包括准备工作、内核配置、设置启动参数、建立调试连接和进行调试操作。文中还通过一个实战案例展示了KGDB在解决实际问题中的应用,并总结了使用KGDB时的注意事项和常见问题的解决方法。后,文章展望了KGDB未来的发展方向和应用场景,如优化调试性能、支持新型硬件架构以及在嵌入式系统、云计算和大数据领域的应用。 适合人群:具备一定Linux系统开发经验的研发人员,尤其是那些需要调试和优化Linux内核的工程师。 使用场景及目标:①帮助开发者深入了解Linux内核的运行状态,精准定位并修复内核问题;②优化内核性能,提高系统的稳定性和可靠性;③适用于嵌入式系统开发、远程服务器维护等场景,特别是在硬件资源有限或无法直接接触设备的情况下。 其他说明:在使用KGDB进行调试时,需特别注意串口设置的一致性、内核版本的兼容性以及调试信息的完整性。同时,要解决常见的连接失败、断点无效等问题,确保调试过程顺利进行。未来,KGDB有望在技术上不断优化,并拓展到更多应用场景中,为Linux系统的持续发展提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值