scala 代码覆盖率
Scala最好的代码覆盖率指标是语句覆盖率 。 就那么简单。 它最适合Scala中的典型编程风格。 Scala是一个变色龙,它可以看起来像您想要的任何东西,但是通常更多的语句写在一行上,而条件式“ if
”语句很少使用。 换句话说, 线路覆盖率和分支覆盖率指标无济于事。
Java工具
Scala在JVM上运行,因此许多现有的Java工具也可用于Scala。 但是对于代码覆盖率而言,这样做是错误的。
一种错误的选择是使用诸如JaCoCo之类的工具来检查字节码的覆盖率 。 尽管它为您提供了覆盖率数字,但JaCoCo对Scala一无所知,因此它不会告诉您忘记覆盖哪段代码。
另一个不幸的是,工具本身仅支持行和分支覆盖率指标。 Cobertura是Java世界中的标准,它生成的XML覆盖率报告受许多工具支持。 一些Scala代码覆盖工具因其受欢迎程度而决定使用Cobertura XML报告格式。 可悲的是,它不支持语句覆盖。
声明范围
为什么? 因为典型的Scala语句如下所示(单行代码):
def f(l: List[Int]) = l.filter(_ > 0).filter(_ < 42).takeWhile(_ != 3).foreach(println(_))
线路和分支覆盖均不适用于此。 您何时会认为这条单行包含在测试中? 是否至少已调用该行的一条语句? 也许。 还是全部? 也可能。
分公司在哪里? 是的,有些语句是有条件执行的,但是决策逻辑在List的内部实现中是隐藏的。 分支覆盖工具是无助的,因为它们看不到这种条件执行。
我们需要知道的是,是否已通过自动化测试执行了_ > 0
, _ < 42
或println(_)
类的单个语句。 这是语句的覆盖范围。
采空救人!
幸运的是,有一个名为Scoverage的工具。 它是Scala编译器的插件。 还有一个SBT插件 。 它正是我们需要的。 它生成HTML报告以及自己的XML报告,其中包含有关涵盖语句的详细信息。
SonarQube的覆盖插件
最近,我为Sonar 4实现了一个插件,这样语句覆盖率度量就可以成为团队持续集成过程和必需的质量标准的组成部分。 它使您可以查看整个项目语句的覆盖范围,并更深入地研究子模块,目录和源代码文件以查看未发现的语句。
具有Scoverage插件的项目仪表板:
多模块项目概述:
具有语句覆盖率,语句总数和涵盖语句数的列:
具有覆盖线和未覆盖线的源代码标记:
翻译自: https://www.javacodegeeks.com/2014/02/the-best-code-coverage-for-scala.html
scala 代码覆盖率