在X战警的帮助下改善单元测试

在X战警的帮助下改善单元测试
Lena RoseUnsplash拍摄的照片

如果我告诉您X战警可以使您成为更好的软件测试员,该怎么办? 好吧,他们不能,但是他们的超级反派威廉·史崔克可以。

本文全部涉及如何使用变异测试来改善单元测试。 有几个突变测试框架,但我要谈论的框架称为Stryker ,得名于X-Men想要杀死所有突变体的超级反派。 我使用Stryker已有两年多了,在这两年中,我已经在三个大型企业项目中实施了Stryker,并在框架上进行了多次演示。

警告!

我想从警告开始,突变测试不适合胆小的人。 最初,它很繁琐,耗时,并且经常拖累开发的测试阶段,常常需要开发人员编写更多的单元测试。 为什么还要打扰呢? 因为这是确保单元测试真正提供价值的万无一失的方法。

每个开发人员都看到了一个看起来不错的单元测试,但是实际上什么都没有测试,或者仅仅是为了提供代码覆盖而存在。 这些是突变测试公开的测试。 这是单元测试的重中之重,是命运的选择,任何摇滚明星测试员都不是真正的摇滚明星,除非他们进行了单元测试的突变测试。 现在您已经得到警告,让我们详细介绍一下。

在X战警的帮助下改善单元测试
图片由MAYANK DUnsplash拍摄

什么是变异测试?

一个简单的答案就是变异测试是针对单元测试的测试 这是什么意思? 变异测试是通过诸如Stryker之类的框架完成的,该框架将变异或更改代码的特定部分,并检查该变异是否导致单元测试失败。 如果该突变体导致您现有的单元测试之一失败,则该突变体被视为“已杀死”。 在突变测试结束时,将生成一个报告,其中包含已杀死和尚存的突变体的完整列表,类似于使用Jest或Jasmine在代码覆盖率报告中看到的内容。

一个简单的例子

假设您有一些代码正在为应用程序生成URL。 希望有一个单元测试,检查该URL路径并确保生成它。 突变测试框架将出现,并将您的端点突变为空字符串或空字符串。 您的单元测试会怎样? 如果失败,那就很好了,这意味着您的测试足够聪明,可以知道URL应该是什么,并且该突变体将被视为已杀死。 如果您的单元测试没有失败,则意味着您的单元测试不如您想像的那么好。 该框架将列出尚存的突变体,您需要返回到绘图板上以编写更好的单元测试。 下面是一个字符串突变的示例:

String url = "deadpool.com"
goTo(url)
//mutated code
String url = ""
goTo(url)

变异测试框架

Stryker是一个开放源代码的变异测试框架,具有非常活跃的开发社区。 两年前,当我开始使用Stryker时,该框架仅适用于JavaScript,但多年来一直在增长,现在可用于JavaScript,TypeScript,Scala和C#。 它具有一个CLI工具,可用于快速轻松地进行设置,并且可以与Jasmine和Jest这样的通用测试框架很好地配合使用。 我还使用了Java的PIT Test ,变异测试的概念是相同的,但框架更多基于控制台。 尽管每个突变测试框架可能会略有不同,但概念仍然相同,重要的是开始使用一个框架。

在X战警的帮助下改善单元测试
Artem Sapegin摄Unsplash

变异测试Pro和Con

首次开始使用突变测试时,该过程将非常缓慢。 杀死某些突变体可能很困难,而不得不重写单元测试从来都不是一件有趣的事情。 随着时间的流逝,好处是值得的,就像生活中的任何事情一样,您练习得越多,过程就会变得越快。

专业的

  • 更高质量的单元测试
  • 不再编写仅用于提升指标的无意义的测试(例如代码覆盖率)
  • 对您的应用程序经过全面测试的信心更大
  • 生产缺陷少
  • 发现了更多错误
  • 开发人员有机会获得有关单元测试质量的即时反馈
  • Stryker并行运行,因此如果有可用资源,它可以非常快地运行

骗子

  • 在开发周期中增加了一个额外的步骤
  • 在具有四个或更少核心的机器上运行大型代码库可能需要一个多小时
  • 要弄清楚CLI生成的配置是否不适用于您的项目,可能很难进行配置

结论

突变测试在开发人员中似乎仍然很少见,但希望本文鼓励所有开发人员尝试一下。 设置可能很慢,并且第一个突变体可能需要很长时间才能杀死,但杀死的突变体越多,该过程将变得越快。 金刚狼缺乏提供单元测试辅导,Stryker和变异测试的功能,您可以近距离地获得X-Men改进单元测试的能力。

From: https://hackernoon.com/improving-your-unit-tests-with-help-from-the-x-men-a4eef1e50f25