我想知道,自Java 8问世以来,用当前的Java工具来度量有条件代码覆盖率是否还没有过时。使用Java8‘S Optional和Stream,我们通常可以避免代码分支/循环,这使得在不测试所有可能的执行路径的情况下很容易获得非常高的条件覆盖率。让我们比较一下旧Java代码和Java 8代码:
在Java 8之前:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}在上述方法中有3种可能的执行路径。为了获得100%的条件覆盖率,我们需要创建3个单元测试。
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}在这种情况下,分支是隐藏的,我们只需要一个测试就可以获得100%的覆盖率,而不管我们要测试哪种情况。虽然仍然有相同的三个逻辑分支,但我认为应该包括在内。我认为,这使得这些天条件覆盖率统计数据完全不可信。
度量Java 8代码的有条件覆盖率有意义吗?是否还有其他工具发现未经过测试的代码?
发布于 2016-12-01 22:09:05
是否有任何工具可以测量可以在Java 8中创建的逻辑分支?
我什么都不知道。我试着通过JaCoCo (又名EclEmma)运行代码,但它显示了Optional版本中的0个分支。我不知道有什么方法可以将它配置为相反的方式。如果您将它配置为还包括JDK文件,理论上它将在Optional中显示分支,但我认为开始验证JDK代码是愚蠢的。你只要假设这是正确的。
不过,我认为核心问题是认识到,在Java 8之前的附加分支在某种意义上是人工创建的分支。它们不再存在于Java8中,这意味着您现在拥有了合适的作业工具(在本例中是Optional)。在之前的Java 8代码中,您必须编写额外的单元测试,这样您才能确信代码的每个分支都以一种可接受的方式运行--这在代码的一些部分中变得更加重要,比如User/getName示例。
在Java 8代码中,您可以信任JDK代码正常工作。实际上,您应该像代码覆盖率工具一样对待Optional行:3行具有0分支。下面的代码中还有其他行和分支,这是您以前没有注意到的,但是每次使用ArrayList或HashMap之类的东西时都会出现这种情况。
https://softwareengineering.stackexchange.com/questions/337301
复制相似问题