Java Eclemma:for循环中缺少分支——这意味着什么?

Java Eclemma:for循环中缺少分支——这意味着什么?,java,for-loop,code-coverage,eclemma,Java,For Loop,Code Coverage,Eclemma,在测试代码时,我遇到了无法解释的问题。使用eclemma检查代码覆盖率时,我发现了一个for循环的标题,该标题以黄色突出显示,消息为“缺少2个分支中的1个” 代码行如下所示: for (int i = maxIdx; i >= 0; i--) { 循环主体高亮显示为已覆盖(并实际执行),以及前面和后面的语句,并且该方法在所有可能的条件下都可以正常工作。据我所知,只有在循环体从未执行的情况下,循环的其他的头才会以黄色突出显示,并显示相同的消息 这个信息的意义是什么?缺少哪个分支?我

在测试代码时,我遇到了无法解释的问题。使用
eclemma
检查代码覆盖率时,我发现了一个
for循环
的标题,该标题以黄色突出显示,消息为
“缺少2个分支中的1个”

代码行如下所示:

    for (int i = maxIdx; i >= 0; i--) {
循环主体高亮显示为已覆盖(并实际执行),以及前面和后面的语句,并且该方法在所有可能的条件下都可以正常工作。据我所知,只有在循环体从未执行的情况下,循环的其他
的头才会以黄色突出显示,并显示相同的消息


这个信息的意义是什么?缺少哪个分支?

我猜缺少的分支指的是条件
I>=0
。由于
i
是用正的
maxIdx
初始化的(根据注释),您可能还应该为
0
maxIdx
和负的
maxIdx
添加测试用例


请注意,由于
maxIdx
StringBuilder
的长度(根据注释),这可能是不可能的,您必须接受缺少的分支,或者“人为”重构代码,以便可以传递一个负的
maxIdx

以下是表单循环的
方法

for (ForInit; ForCondition; ForUpdate)
  Body
已执行:

  • 执行
    ForInit
  • 对条件
  • 进行评估
    • false
      时,则不会执行
      Body
      ,并在循环后继续执行
    • true
      时,执行
      Body
      ,执行
      ForUpdate
      ,并从步骤2继续执行
    “2个分支”对应于上述两个条件选项

    “缺少2个分支中的1个”表示仅出现其中一个选项,第一个或第二个


    在缺少包含循环主体的的情况下,很难回答其他问题

    但奇怪的是,为什么总是执行至少一次的其他循环都是绿色的呢

    然而,这很奇怪——为什么其他循环总是绿色的

    但是,如果执行了循环的
    Body
    ,则在
    ForCondition
    计算为
    false
    之前,
    Body
    中可能存在退出循环的情况

    例如,使用EclEmma 3.1.1附带的Eclipse IDE For Java的最新版本2018-12:

    也许在你的其他环路中没有这样的出口:

    这也可以解释

    使用空的
    StringBuilder
    运行此代码会将其绘制为绿色

    使用空的
    StringBuilder
    (这在现实中是不可能的)添加人为创建的情况会将循环着色为绿色

    由于在执行
    Body
    之前,
    ForCondition
    计算结果为
    false
    时增加了这种情况:


    您在测试中使用了什么
    maxIdx
    ?@Mureinik它是
    StringBuilder
    中最后一个字符的索引:
    maxIdx=sb.length()-1
    ,通常为30或40。这个表达式最初在循环头中,但为了理解它的问题所在,我将它移到了另一行中。但是它并没有改变eclemma的行为。如果在maxIdx设置为-1的情况下创建一个测试,会发生什么情况?该测试不应该覆盖另一个分支吗?@JoakimDanielson标题保持黄色,主体变为红色,正如预期的那样。主体为什么会变为红色?我希望您再创建一个测试,而不是编辑现有的测试。因此,一个测试中输入了for循环,另一个测试中没有。其他类似的循环都是绿色的,即使在所有情况下都执行了body,比如
    (对于int i=0;i<10;i++)
    是的,您是对的。使用空的
    StringBuilder
    (这在现实中是不可能的)添加人为创建的情况会将循环着色为绿色。然而,这很奇怪——为什么其他循环总是绿色?@m.vokhm我认为区别在于,在OP
    maxIdx
    的示例中,它是一个变量,您可以控制它的初始化方式,因此eclemma希望您涵盖所有选项。在您在注释中给出的另一个示例中,
    i
    使用硬记录值初始化,并且与硬编码值进行比较。@Mureinik对于EclEmma,
    i=maxIdx
    i=0
    之间绝对没有区别。谢谢!你是对的,在我的代码中有一个循环体的条件退出(
    break
    ),我没有考虑它。I是一个以字符串表示的长数字的进位传播,从低有效数字到高有效数字,如果下一个数字依次为“9”,它将替换为“0”,然后传播继续,否则该数字将递增,循环将退出。现在情况对我来说非常清楚,我看到我的初始测试数据并没有涵盖所有可能的情况。现在我已经添加了必要的数据。