如果您曾经有过一次测试,前一刻通过,下一刻不及格,即使没有任何变化,您也可能会遇到不稳定的测试,这些不可预测的测试可能会使 CI/CD pipelines 脱轨并减慢发布速度。
但偶发性测试不一定是一个永久性的问题。事实上,你可以永久摆脱这些片状的东西,以下是对这个概念和对抗它的武器的仔细研究。
偶发性测试是有时失败有时通过的自动化测试,即使相关代码保持完全相同。这些不一致的结果使得很难知道某些东西是否真的坏了。
这种测试失败在自动化 pipelines 中尤其危险,因为误报可能会阻止部署或导致团队忽略合法问题。
偶发性测试不仅仅是随机发生的。大多数时候,这种行为背后有某种模式或某种原因。
以下是它们发生的一些最常见原因:
了解原因是解决问题的第一步。一旦确定了模式,您就可以开始解决每个偶发性测试背后的具体问题。
为什么您应该关注偶发性测试?因为他们停留的时间越长,造成的伤害就越大。
不稳定的偶发性测试可能会削弱人们对测试套件的信任。开发人员可能会开始忽略失败,假设测试再次运行。这为真正的问题打开了大门。
它们还会减慢您的开发过程。重新运行测试和调试误报所花费的时间是构建产品所占用的时间。
总体而言,偶发性测试可以:
简而言之,及早识别偶发性测试是 CI/CD 工作流程优化不可或缺的一部分。
检测偶发性测试并不总是那么容易,但有一些经过验证的方法可以提供帮助。
重复测试执行
发现偶发性测试的最简单方法之一是多次运行它。如果测试有时通过,有时失败,但没有任何代码更改,则您发现了一个碎片
分析历史测试数据
使用 CI/CD 工具检查过去的测试运行。查找模式:某些测试在特定分支上还是在一天中的特定时间更频繁地失败?Jenkins、GitHub Actions 或 CircleCI 等工具可以帮助您跟踪和比较结果。
识别并行执行失败
某些测试仅在并行运行时失败。尝试按顺序运行相同的测试套件,然后并行运行,看看是否有差异。
监控执行时间
显示执行时间变化较大的测试可能是片状的。持续时间的突然峰值通常暗示潜在的计时或依赖项问题。
使用检测工具
有几种工具可以帮助检测偶发性测试:
标记出潜在的偶发性测试后,请隔离它们以进行进一步检查并开始努力修复。
修复不稳定的测试通常意味着深入研究测试本身并探索围绕它的系统。
首先重现薄片。这可能需要多次运行测试或修改环境以模拟测试失败的条件。
然后,根据原因,考虑以下解决方案:
修复偶发性测试类似于解决由不一致环境导致的构建失败。您需要消除隐藏变量并确保测试运行之间的稳定性。
这可能需要一些试验和错误,但现在投入时间修复不稳定的测试具有很高的回报。
偶发性测试的最佳策略?一开始就不要让它们发生。
以下是您的团队可以采取的一些主动措施:
更少的偶发性测试意味着更少的延迟和更快的反馈循环。减少开发团队的困惑意味着更好的结果。
偶发性测试不仅令人讨厌。它们很昂贵。它们会减慢发布速度并破坏对测试套件的信任。但好消息是它们可以被检测和消除。
不要让片状的测试削弱您的信心。立即采取行动,提高测试稳定性并优化 CI/CD 工作流程,同时提高开发人员的工作效率 。
强耦合的测试和偶发性测试有什么区别?
当底层代码发生变化时,强耦合性测试会中断,即使更改不应影响结果。它们对实现细节很敏感,例如网页的确切结构或变量的命名。
另一方面,Flaky 测试即使代码没有更改,也会随机失败。他们可能在前一分钟过去了,下一分钟就失败了(没有任何明确的原因)。
虽然强耦合性测试本质上是脆弱的,但偶发性测试是不一致的。每个问题都值得您关注,但需要不同的解决方案。
什么是偶发性测试的例子?
这是 Python 中的一个经典示例:
python
CopyEdit
def test_login():
driver.get(“https://example.com/login”)
driver.find_element_by_id(“username”).send_keys(“user”)
driver.find_element_by_id(“password”).send_keys(“pass”)
driver.find_element_by_id(“login-button”).click()
assert “Welcome” in driver.page_source
如果页面加载缓慢,则此测试可能会失败。添加适当的等待可以使此测试更加稳定。
如何测量偶发性测试?
衡量不稳定的测试有助于跟踪改进并确定要修复的内容的优先级。
另一方面,跟踪这些指标可以帮助您抓住 issn,低命中率可能表明可能存在效率低下的情况,例如冗余任务执行。提高缓存命中率可能具有挑战性,但优化这些可以显著加快构建速度并减少资源消耗。