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我认为区别在于,在OPmaxIdx
的示例中,它是一个变量,您可以控制它的初始化方式,因此eclemma希望您涵盖所有选项。在您在注释中给出的另一个示例中,i
使用硬记录值初始化,并且与硬编码值进行比较。@Mureinik对于EclEmma,i=maxIdx
和i=0
之间绝对没有区别。谢谢!你是对的,在我的代码中有一个循环体的条件退出(break
),我没有考虑它。I是一个以字符串表示的长数字的进位传播,从低有效数字到高有效数字,如果下一个数字依次为“9”,它将替换为“0”,然后传播继续,否则该数字将递增,循环将退出。现在情况对我来说非常清楚,我看到我的初始测试数据并没有涵盖所有可能的情况。现在我已经添加了必要的数据。