如何解决 flaky test 调试成本高问题?

2022-06-23

54

作者:行云创新 孙春景


在谈 flaky test 之前,我们先谈谈作为工程师经常遇见的几个问题:


- 您是否遇到过在测试软件或者应用程序时,都是相同的输入,有时候通过有时候又不通过?

- 您是否遇到过对相同的代码进行相同的测试会产生不同的结果?

- 如果您是一个测试工程师提交一个严重bug时,却在研发那没法重现,您是否感受到来自开发的轻视?

...


没错,这种每次运行相同的代码或者应用程序,却产生了不同的结果,我们叫做 flaky test。每当开发更新计算机软件、网页或者应用程序而编写新代码时,都需要在整个开发过程中进行测试,以确保应用程序在发布后能够按照预期运行。从逻辑上讲,当我们进行一次又一次进行相同的测试时,代码将只产生一份结果,要么通过测试,要么每次不能正常工作,从而测试失败!


然而,看似随机的,有时对相同代码的相同测试会产生不同的结果。有时它会显示代码通过了测试并且应用程序按计划工作,有时它会显示代码未通过测试并且没有按计划工作。当测试未能产生一致的结果时,该测试被认为是不稳定的。


这种不稳定的测试可能由多种因素引起:


- 新编写的代码有问题

- 测试本身的问题

- 一些影响测试结果的外部因素


Flaky tests 是软件质量的报警器,它在您诊断其根本原因前,是无法知道其缺陷来自测试还是产品代码亦或者外部原因。


Flaky tests的影响


Flaky tests是维护可靠的测试自动化框架的最大障碍之一。


1.Flaky tests阻碍了生产力


Flaky tests调试成本很高:工程师团队花费数天、数周甚至数月的时间来确认问题,进行根本原因分析,然而他们还不一定得到想要的结果


工程师认为已经找到了原因并解决了,然而在重新运行进行测试时,又有可能失败,从而浪费大量时间(此处会涉及到各种流程时间、沟通时间等)。


2.Flaky tests让工程师对测试失去信心


当一个软件或者应用程序出现flaky test时,通常有这样的反应:这是测试的问题,而不是我的软件问题!如果我重新运行软件进行测试,也许重新测试就不会失败。


Flaky tests会导致测试结果的不一致性,进而导致开发人员对测试本身失去信心。研究发现:开发人员认为测试输出越不可靠,他们就越有可能完全忽视测试结果的结果。简而言之,开发人员根本不信任测试结果。


一个对测试失去信心的团队和一个没有测试的团队,哪个做得更好?显然后者大概率做得更好。如果都不认同测试结果,那么测试就没有任何意义了。


除了对开发团队的负面影响之外,这些未解决的问题可能会变成定时炸弹,随时可能在客户现场爆炸,造成严重损失。


3.引入了昂贵的技术债


不稳定问题需要及时修复,否则就会产生技术债,并且随着不稳定问题的扩散,“债务利息”变得越来越昂贵。总而言之,如果开发人员希望下次运行能够顺利通过,那么他就会忽略这种不稳定的问题,从而导致整个系统的稳定性随着时间的推移而下降。并且失败的测试不再与特定的提交相关联,后期排查和解决该问题将会越来越困难。


4.Flaky tests与CD不兼容


任何可靠的发布过程都将受到flaky tests的阻止,如果系统有很多Flaky tests,那么系统将会不再干净也很难判断是否可发布,这时就需要人工判断才知道是否可发布。系统越不稳定,CD过程中就越会判断阻止发布。如果您的产品过早发布,总会容忍一些不稳定因素,尽管这些因素可能很严重。这就是为什么82%的软件公司报告测试未解决的失败是导致生成失败的主要原因。


如何解决:跟踪记录并尽可能的早解决


不管是代码库还是测试出现的不稳定,你需要做的就是立刻解决。你离开它时间越长,就越难解决,就好比病毒,存在时间越长,就会繁殖越多,产生的变异就越多。*时间旅行调试*(Time Travel Debugging,简称TTD)是解决flaky tests的关键因素。


1.自动记录flaky tests相关的失败测试


当作为持续集成/测试自动化框架的一部分时,*时间旅行调试*可用于在记录下持续运行flaky tests。记录捕获了失败运行的精确副本,并提供了程序做了什么以及原因的完整图片。所有工程师所要做的就是向前和向后调试录音——就像使用视频播放器一样——以快速定位问题的根本原因。通过向前和向后执行代码执行时间旅行的能力称为时间旅行调试。


这种记录/重放过程显着提高了工程效率,因为无需浪费时间尝试重现故障。


Flaky tests每次都会以不同的方式失败,因此如果没有时间旅行调试,很难收集有关单个故障的足够信息。更糟糕的是,间歇性故障的根本原因通常发生在影响被注意到之前的某个时间,例如,数据损坏发生在断言失败之前很长时间。记录故障使工程师可以轻松地从一次运行中确定错误的根本原因——反复运行,快速定位问题。


2.使错误修复可预测


由于它们的间歇性,无法预测修复片状测试需要多长时间。但是通过时间旅行调试,记录会捕获调试和修复问题所需的所有内容(直至指令级别)——从而使缺陷解决变得更加可预测。


3.减少计划延误


当软件延迟交付时,通常是因为开发人员无法解决错误。随着不稳定测试的解决时间显着减少,调试中的可预测性水平提高,计划延迟可以最小化。


4.保持稳定


不可靠的测试套件的最坏影响之一是通常不可能注意到新引入的间歇性故障。当你有一个可以信任的测试套件时,当一个新的间歇性故障源出现时,它很快就会变得很明显,即使它只是偶尔导致测试套件失败。


通过将时间旅行调试作为 CI 或测试自动化框架的一部分,可以快速发现回归,并且可以快速根除错误代码。


总之,flaky tests会导致低效的软件团队和不可靠的软件发布。


修复所有因子可能是一个昂贵而痛苦的过程;但问题未解决的时间越长,对生产力和产品质量的拖累就越大,修复成本也越高。


时间旅行调试将软件故障解决从一个缓慢且不可预测的消除过程转变为一个系统的、可重复的工作流程。


- 使错误修复可预测并避免计划延误

- 加快缺陷解决,从而加快产品交付

- 提高 CI/CD 管道效率并降低工程成本



了解企业开发测试云,从这里开始




技术交流
我们建了一个云原生技术交流群,其中有来自Oracle、Citrix、华为、腾讯等国内外云计算专家,立即扫码,拉你进群。目前已有1000+开发者加入我们......
云原生厂商 云原生技术服务商
在云原生时代,行云创新致力于通过赋能开发者,实现企业快速迭代与交付,大幅提升创新效率。
免费试用