用逻辑或(||)测试if语句的覆盖率-由于Java的短路,JaCoCo要我覆盖的第四个条件是什么?

Chr*_*ian 5 java short-circuiting jacoco test-coverage sonarqube

这可能是一个相当简单的问题,但我很茫然。

我有一个if语句,如下所示:

if(TheEnum.A.equals(myEnum) || TheEnum.B.equals(myEnum))
Run Code Online (Sandbox Code Playgroud)

TheEnum可以ABC,... G(不止4个选项)。

JaCoCo(SONAR)告诉我这里有四个条件。那些是什么?从本质上讲,我不是可以测试的整套设备

if(true || not_evaluated) => true
if(false || true) => true
if(false || false) => false
Run Code Online (Sandbox Code Playgroud)

我敢肯定我不能专门测试 if(true || true)if(true || false),因为短路评估不会那么远...?

如果是这样,JaCoCo / Sonar要我测试的第四个选项是什么?

Tag*_*eev 6

您是对的,该代码存在短路。大致将其编译为字节码,如下所示(假设Java具有goto):

if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
   // body of if statement
end:
Run Code Online (Sandbox Code Playgroud)

因此,在JaCoCo分析字节码时,从其角度来看,您有两个独立的检查:first if和second if,它们生成四个可能的分支。您可能将其视为JaCoCo错误,但我想要对其进行强大的修复并不容易,而且也不是很令人不安,因此您可以忍受它。

  • @Christian时间向您的经理解释说,高覆盖率并不意味着高质量。 (6认同)
  • 好吧,它减少了覆盖范围。而且目标是95%,其中一些是短期课程,这确实很重要...;) (3认同)
  • @克里斯蒂安:在许多情况下,您无法获得100%的覆盖率。例如,在方法内部断言。或`clone()`方法中的`catch(CloneNotSupportedException ex)`。另一方面,100%的覆盖率不是灵丹妙药。历史上知道许多很酷的bug,尽管覆盖率100%却未被注意到。例如 用((a + b)/ 2)计算平均值。它只是为了掩盖它,它没有分支,但是如果您不对大于Integer.MAX_VALUE / 2的数字进行测试,则不会发现错误。 (3认同)