本文共 3895 字,大约阅读时间需要 12 分钟。
Flaky Tests是一种不可靠的测试现象:即在同样的软件代码和配置环境下,得不到确定(有时成功、有时失败)的测试结果。
从逻辑上讲,当一遍又一遍地进行相同的测试时,代码将产生相同的结果——应用程序要么每次都能正常工作,从而通过测试,要么每次都不能正常工作,从而导致测试失败。测试结果应该是一致的(Consistent),即一段代码要么符合预期的运行结果,通过测试;要么与预期结果不符,测试失败。
然而,实际中执行测试时会出现完全相同的代码和配置,但是出现不一致的测试结果,那么这种现象被称为 Flaky Test。
Flaky ['fleɪki] 的英文意思是:易碎成小薄片的;易剥落的;行为古怪的;好忘事的
Flaky Test 是表达一种不可靠的测试现象。
在 Regression Test 时,尤其是采用自动化的方式执行测试时,测试者编写了自动化测试Scripts执行测试,一些 Test Scripts 有时候执行成功,有时候执行失败了,这时就产生了 Flaky Test的现象。
Regression Test 是敏捷开发过程中非常重要的一种测试,当发生了功能变更,或者开发团队修复了缺陷之后,为了确保产品功能正常,通常需要执行Regression Test,能够采用自动化方式执行时,最后执行自动化回归测试。
在回归测试中,如果所有测试都通过了,开发人员和测试人员通常不会进一步检查测试运行。如果测试中有失败的测试用例或者自动化测试Scripts时,开发者和测试者就需要引起关注,查明失败的原因。
在查找失败测试的原因时,开发人员需要收集数据,试图发现看似随机的结果之间的差异,以便找出失败测试的原因。
代码应该被重新检查,测试本身也应该被重新检查,如果没有发现问题,那么就需要检查外部因素,看看它们是否是问题的核心。
开发人员可能会查看通过的测试是否在一天中的某个时间运行,而失败的测试是否在一天中的不同时间运行,某些程序是否在测试通过时没有运行的失败测试的同时在开发人员的计算机上运行,或者失败的测试是在测试的同一点运行还是在测试的不同时间运行。
有时,Flaky Test 的原因很容易诊断,而且可以很快确定。这是最好的情况。其他时候,没有简单的fix,虽然可能会花费大量的时间和成本,但是开发人员可能需要删除测试并从头开始重写,以确保测试结果的准确性。
现实情况中,Flaky Test 并不少见。例如,谷歌(Google)报告称,其16%的测试显示出某种程度的 Flaky。它们可以导致软件系统暂时停顿,但这些问题和缺陷可以被发现和解决。
由于我们无法很容易地复制故障,因此需要多个团队来帮助进行此类问题的调查,需要收集广泛的日志记录来寻找问题。这一点是至关重要的!
在间歇性故障发生时尝试找出一种模式,然后深入研究RCA以获得相同的结果。很多时候,原因可能是一个糟糕的测试实现本身。一旦排除了这一点,原因可能是在特定情况下暴露的被测应用程序中的错误/缺陷、数据相关问题或环境/网络问题。
我们来分析一下常见的一些原因:
例子:
例子:
例子:
例子:
例子:
例子:
例子:
测试环境考虑不充足导致了问题发生。
由于当前的技术导致了大量的计算设备和移动设备的选择,如果在UI层进行测试,那么测试过程中必须考虑大量的参数。不同的操作系统、屏幕大小、分辨率、不同的可用浏览器都是必须处理的参数。
考虑到软件的后端部分,软件有多个部分与设备中提供的服务进行交互,例如一些传感器或有线网络,对于这样一个复杂的软件,需要更广泛的范围来全面地包括所有内容。
例子:
当顺序改变时,测试是否间歇性失败?
例子:
例子:
例子:
这个原因显而易见,由于修改了程序代码,导致测试变得不稳定了。
UI测试其实是最复杂的测试。每一次UI的变更,除了做好UI测试之外,功能测试和回归测试也是需要执行的。
为获得成功的测试结果,构建的每个测试都应该是稳定的、可伸缩的和可重用的。使用UI测试,这些目标无法实现,测试很容易被破坏。测试应该与除了UI之外的后端程序进行交互而不是只和操作界面上的UI元素交互。
有时,测试数据不能覆盖所有的功能,也不能捕捉到软件可能由于特殊情况而失败的场景。通常情况下,数据涵盖了Positive和Negative的情况,但特殊的情况可能会丢失。在一个成功的开发过程中,特殊测试数据是至关重要的。
测试数据不应成为测试设计的问题,这意味着当有测试彼此独立工作时,测试数据必须单独存储,以便数据不会损坏。
当某些测试依赖于其他测试的数据时,必须采取预防措施,以便在测试运行期间测试数据不会损坏,并且下一个测试可以正常工作。在测试运行期间,测试数据必须在每个点都是正确的。
既然开发团队或者测试团队(包括质量管理团队)已经采取步骤进行适当的调查和Root Cause Analyze(RCA)以找到间歇性故障的原因,那么请查看应用程序的上下文、团队技能、基础设施等,以找到“便于从源头解决问题的正确解决方案”。
作为修复程序,最糟糕的做法是盲目地增加等待时间或重新运行测试以希望它通过。请永远别那么做!
修复Flaky Test的“正确”方法可能意味着以下任何一项或多项,甚至更多-
以下各种形式和类型的日志很有价值,因此需要:
在许多情况下,上述调查需要不同角色之间的协作,因为任何一个角色都可能不具备整个系统的完整背景。
转载地址:http://ytvdi.baihongyu.com/