有没有一种简单的方法来判断我错过了哪个分支?即我有一些像这样的代码:Eclemma说4分支中没有1分支,但是哪个分支?
if (x || y) {
// do stuff
}
在覆盖突出有Eclipse的一个黄点,说:
1 4分支错过
,但我想知道哪个分支丢失。
有没有一种简单的方法来判断我错过了哪个分支?即我有一些像这样的代码:Eclemma说4分支中没有1分支,但是哪个分支?
if (x || y) {
// do stuff
}
在覆盖突出有Eclipse的一个黄点,说:
1 4分支错过
,但我想知道哪个分支丢失。
在github上回购了Eclemma的母公司,jacoco的open issue,表明这样的功能实际上是有点难以包括。
然而,即使没有Eclemma功能,如果目标只是找出在特定情况下错过的分支,您可以用仪器来跟踪您的代码。最简单的例子是老式的打印语句:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
然后看输出,看到你竟然打什么分支(例如java ... | grep "BRANCH:" | sort | uniq
)。 (不是非常令人满意的,我知道。)
什么可以x
和y
是什么?
true || true
是真(不适用的,因为JVM的优化:如果所述第一条件是true
,第二个将不能评价由于短路评价)false || true
是真true || false
是truefalse || false
是false有可能无论是从扩大你的x
或y
谓词if
块中嵌套的语句或语句隐含的分支。
阅读本: http://emma.sourceforge.net/faq.html#q.fractional.examples
答案是true|| true
不是盖的。
这是因为一旦JVM已经找到的第一个条件为真,那么就不会运行第二个条件(它优化),这意味着代码从不运行的那部分。
正如Maroun说,3超过了4个分支将允许有条件通过。如果您仍然担心代码覆盖率,则可以将条件重构为&&
而不是||
。
(x || y)
与(!(!x && !y))
相同,这将允许您测试所有条件,因为现在只有三个分支。
条件的原始形式是经常出现在后卫声明:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
这不会让你检查,如果obj
是null
并有一个错误,因为它会抛出一个空指针异常。
如果代码覆盖率是非常重要的,那么就使用这种形式:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
有一个很容易woarkaround - 只是把每个谓词逻辑在单独一行,像这样:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
现在,当你运行analisys中,标记应直接指向错过的分支。在你将它覆盖之后,你可以正确地重新格式化你的代码。
HTH
问题是,我怎么知道哪些分支没有被跟踪?我知道肯定不是假/假的情况,因为在某些情况下执行“else”情况。 – tor 2013-03-19 08:07:22
它不应该是真正的||没有涵盖的真实案例? – Jason 2013-12-30 16:03:24
我只是偶然发现了这个问题 - 不得不回过头去记住旧的数字逻辑真值表和“不关心”条件。 – 2016-01-07 23:17:44