我想知道自Java 8出现以来,当前使用Java的工具来衡量条件代码覆盖率是否还没有过时。使用Java 8 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代码的条件覆盖范围是否有意义?还有其他工具可以发现未经测试的代码吗?
getName
?似乎是如果user
为null,则应返回“未知”。如果user
不为null且user.getName()
为null,则应返回“未知”。如果user
不为null user.getName()
且不为null,则应返回该值。因此,您将对这三种情况进行单元测试,因为这就是合同的getName
内容。您似乎在向后做。您不想看到分支并根据那些分支编写测试,您不想根据合同编写测试,并确保合同已满。到那时,您的覆盖范围就会很好。