2013-03-19 65 views

回答

6

在github上回购了Eclemma的母公司,jacocoopen issue,表明这样的功能实际上是有点难以包括。

然而,即使没有Eclemma功能,如果目标只是找出在特定情况下错过的分支,您可以用仪器来跟踪您的代码。最简单的例子是老式的打印语句:

if (x || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

然后看输出,看到你竟然打什么分支(例如java ... | grep "BRANCH:" | sort | uniq)。 (不是非常令人满意的,我知道。)

13

什么可以xy是什么?

  • true || true(不适用的,因为JVM的优化:如果所述第一条件是true,第二个将不能评价由于短路评价)
  • false || true
  • true || falsetrue
  • false || falsefalse
+1

问题是,我怎么知道哪些分支没有被跟踪?我知道肯定不是假/假的情况,因为在某些情况下执行“else”情况。 – tor 2013-03-19 08:07:22

+7

它不应该是真正的||没有涵盖的真实案例? – Jason 2013-12-30 16:03:24

+0

我只是偶然发现了这个问题 - 不得不回过头去记住旧的数字逻辑真值表和“不关心”条件。 – 2016-01-07 23:17:44

0

有可能无论是从扩大你的xy谓词if块中嵌套的语句或语句隐含的分支。

阅读本: http://emma.sourceforge.net/faq.html#q.fractional.examples

+0

是的,我想通了。有4种不同的x和y布尔值可能的组合,我猜测他们中只有三种被观察过。问题是,我怎么知道哪个案例没有发生?或者等同地观察哪些情况? – tor 2013-03-19 08:11:17

+0

“覆盖4个分支中的1个”表示3个分支未被覆盖。我认为它应该是显而易见的(从覆盖块内部突出显示)哪些代码路径未被覆盖。 – 2013-03-19 17:40:14

+1

对不起,我的错误完全了!该消息实际上表示“错过了4个分支中的1个”。我会立即更新... – tor 2013-03-20 03:30:48

4

答案是true|| true不是盖的。

这是因为一旦JVM已经找到的第一个条件为真,那么就不会运行第二个条件(它优化),这意味着代码从不运行的那部分。

正如Maroun说,3超过了4个分支将允许有条件通过。如果您仍然担心代码覆盖率,则可以将条件重构为&&而不是||

(x || y)(!(!x && !y))相同,这将允许您测试所有条件,因为现在只有三个分支。

条件的原始形式是经常出现在后卫声明:

if (obj == null || obj.hasError()) 
{ 
    throw new RuntimeException(); 
} 

这不会让你检查,如果objnull并有一个错误,因为它会抛出一个空指针异常。

如果代码覆盖率是非常重要的,那么就使用这种形式:

if (!(obj != null && !obj.hasError())) 
{ 
    throw new RuntimeException(); 
} 
+1

,或者可能会使用''''或'&'急切的操作符,除非您故意短路操作,在这种情况下,您永远无法获得完整的分支覆盖。 – tkokasih 2014-08-15 09:25:16

+0

@BrettPyke'&&'的情况下,如何有三个分支? – ishan3243 2015-02-06 08:41:15

+5

@BrettPyke如果你将(x || y)转换为!(!x &&!y),你有与表达式相同的快捷方式问题!(false && false)。 – 2015-12-16 11:54:55

3

有一个很容易woarkaround - 只是把每个谓词逻辑在单独一行,像这样:

if (x 
    || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

现在,当你运行analisys中,标记应直接指向错过的分支。在你将它覆盖之后,你可以正确地重新格式化你的代码。

HTH