java企业门户网站开发教程/山东16市最新疫情
上周,我花了一些天假去参加Devoxx法国2014 第三版 。 至于牡蛎,最大的对话不一定包含最漂亮的珍珠。 在今年的版本中,我的启示来自我的朋友Alexandre Victoor的15分钟的演讲,他向我介绍了突变测试的奇观。 由于我目前正在撰写有关Integration Testing的文章 ,因此我对测试我不了解的口味非常感兴趣。
经验丰富的软件开发人员知道不要对代码覆盖率指标抱有太大的信心。 原因包括:
- 某些断言可能已被遗忘(有意或无意)
- 没有值的代码(例如getter和setter)可能已经过测试
- 等等...
变异测试试图超越代码覆盖率指标,以增强人们对测试的信心。 这是这样实现的:在测试的代码中引入了称为突变的随机代码更改。 如果尽管更改了代码,测试仍然成功,则肯定会有些麻烦,因为该测试毫无用处。 作为一个值得一千个单词的示例,以下是需要测试的代码段:
publicclassDiscountEngine{publicDoubleapply(Doublediscount,Doubleprice){return(1-discount.doubleValue())*price.doubleValue();}
}
测试代码类似于:
publicclassDiscountEngineTest{privateDiscountEnginediscounter;@BeforeMethodprotectedvoidsetUp(){discounter=newDiscountEngine();}@Testpublicvoidshould_apply_discount(){Doubleprice=discounter.apply(newDouble(0.5),newDouble(10));assertEquals(price,newDouble(5));}
}
现在,假设第16行被忘记了: DiscountEngineTest
结果仍然会通过。 但是,在这种情况下,不会检测到DiscountEngine
错误的代码更新。 那是变异测试进入竞技场。 通过更改DiscountEngine
, DiscountEngineTest
仍然会通过,这意味着没有任何测试。
PIT是提供突变测试的Java工具。 为了实现这一点,PIT创建了许多称为“突变体”的备用类,其中未突变的类是初始源类。 这些突变体将针对针对原始类别的现有测试进行测试。 如果测试仍然通过,那就有问题了,并且认为该突变体还可以存活。 如果不是,那么一切都很好,因为该突变体已被杀死。 对于单个未突变的类,这将一直持续到突变体被杀死或针对该类的所有测试都已执行并且仍然存在。
一般而言,突变测试,尤其是PIT,有一个很大的缺点:一类突变的数量越多,结果的可信度就越高,但是执行测试所需的时间就越长。 因此,建议仅在每晚构建时运行变异测试。 但是,与再次信任您的测试相比,这笔钱不算什么...
即用型PIT提供:
- Maven整合
- 蚂蚁整合
- 命令行
另外,Alexandre还为Sonar编写了专用的插件 。
本文的源代码可以在的IntelliJ / Maven的格式被发现存在 。
翻译自: https://blog.frankel.ch/introduction-to-mutation-testing/