kotlin 测试_实验:Kotlin和突变测试

kotlin 测试

大约一年半以来,我做了很多有关突变测试 的 演讲 。 在这些文章中,我的观点是要表明Code Coverage的唯一好处是它易于计算,但毫无意义-因此进行了突变测试。

从一段时间以来,我一直对Kotlin感兴趣, Kotlin是JetBrains的一种在JVM上运行的语言。 我很自然地想检查如何将突变测试应用于Kotlin语言。 由于Kotlin太年轻,无法拥有自己的专用突变测试工具,因此我使用了Java专用工具Pit 。 我没想到太多,这是我的发现。

我从演示项目的Kotlin端口开始。 它有两个简单的类,每个都有一个相关的测试。 在第一个中,断言丢失,在第二个中,不测试<运算符的边界条件。 这是进行突变测试的理想用例。 这是一个Maven项目,因此命令非常简单:

mvn org.pitest:pitest-maven:mutationCoverage

有趣的是,这在执行突变覆盖率方面以及在参考引用作为问题根源的行方面都非常有效。

kotlin 测试_实验:Kotlin和突变测试_第1张图片

kotlin 测试_实验:Kotlin和突变测试_第2张图片

我想走得更远,使用一个真实的项目。 Kotlin的人很友好 ,可以将我重定向到基于Kotlin的Web框架KTor 。 我尝试了相同的命令,但仅限于一个模块-ktor-features / ktor-server-sessions(我不知道它的作用,无论如何都不相关)。 是的,有摩擦。

首先,Pit在某些地方无法正确解析生成的字节码:

PIT >> WARNING : Found more than one mutation similar on same line in a finally block. Can't correct for inlining.

更糟糕的是,有很多超时错误。 由于涉及到一些线程,因此这实际上不是一个阻碍。

PIT >> WARNING : Slave exited abnormally due to TIMED_OUT

对于此项目,报告的确很长,但是有些错误确实与您希望从Java代码中获得的错误相似,例如:

removed call to kotlin/jvm/internal/Intrinsics::checkParameterIsNotNull → NO_COVERAGE

这是报告的示例:

kotlin 测试_实验:Kotlin和突变测试_第3张图片

再次,Pit能够将实际问题与发现的问题绑定在一起。 生活不好吗? 如果您在这一点上停下来,可能是这样。 但是在另一个项目上运行Pit-例如,ktor-features / ktor-locations失败了。

The class org.jetbrains.ktor.locations.Locations$WhenMappings does not contain a source debug information.
All classes must be compiled with source and line number debug information

似乎使用Kotlin中的when构造会生成一个不包含调试信息的内部类,Pit需要发挥其魔力。 让我们排除有问题的类及其内部映射类:

mvn org.pitest:pitest-maven:mutationCoverage-DexcludedClasses= org.jetbrains.ktor.locations.Locations *

它可以再次工作并产生预期的结果:

kotlin 测试_实验:Kotlin和突变测试_第4张图片

目前还没有针对Kotlin的突变测试工具,考虑到Java生态系统的历史,可能永远不会有。 但是,变异测试是断言测试真正质量的宝贵工具。 即使Pit对于Kotlin来说不是完美的选择,但放弃它也是愚蠢的。

翻译自: https://blog.frankel.ch/experimental-kotlin-mutation-testing/

kotlin 测试

你可能感兴趣的:(kotlin 测试_实验:Kotlin和突变测试)