JUnit报告显示测试功能,而不是覆盖范围

Ada*_*dam 3 java junit unit-testing mutation-testing test-coverage

团队领导的一个问题是团队中的人(有时甚至包括我自己)经常在没有任何测试功能的情况下创建JUnit测试.

它很容易完成,因为开发人员使用他们的JUnit测试作为线束来启动他们正在编码的应用程序的一部分,然后故意或忘记只是检查它而不进行任何断言测试或模拟验证.

然后它会忘记测试是不完整的,但它们通过并产生了很好的代码覆盖率.运行应用程序并通过它提供数据将创建来自Cobertura或Jacoco的高代码覆盖率统计数据,但除了能够在不爆炸的情况下运行之外,没有任何测试 - 我甚至已经看到在大型尝试捕获块中运行考试.

是否有一个报告工具可以测试测试,所以我不需要经常查看测试代码?

我暂时兴奋地发现Jester通过更改测试代码(例如if子句)来测试测试并重新运行它以查看它是否破坏了测试.

但是,这不是您可以设置为在CI服务器上运行的东西 - 它需要在命令行上进行设置,在不显示其GUI的情况下无法运行,仅将结果打印到GUI上,并且还需要很长时间才能运行.

Tom*_*m G 11

PIT是标准的Java突变测试程序.从他们的网站:

突变测试在概念上非常简单.

故障(或突变)会自动嵌入到您的代码中,然后运行您的测试.如果你的测试失败,那么突变就会被杀死,如果你的测试通过,那么突变就会存在.

...

传统的测试覆盖率(即行,语句,分支等)仅测量测试执行的代码.它不会检查您的测试是否确实能够检测执行代码中的错误.因此,它只能识别绝对未经过测试的代码.

问题的最极端的例子是没有断言的测试.幸运的是,这些在大多数代码库中并不常见.更常见的是仅通过其套件进行部分测试的代码.仅部分测试代码的套件仍然可以执行其所有分支(示例).

由于它实际上能够检测每个语句是否经过有意义的测试,因此突变测试是衡量所有其他类型的覆盖范围的黄金标准.

您可以根据已杀死的突变百分比来衡量您的测试质量.

它有一个相应的Maven插件,可以简化集成作为CI构建的一部分.我相信下一个版本也将包括与Maven站点报告的正确集成.

此外,创建者/维护者在StackOverflow上非常活跃,并且很好地响应标记的问题.