Cobertura如何识别代码中的分支?

时间:2017-08-25 04:57:37

标签: java cobertura

我正在用我的代码测试cobertura并生成一个简单的报告。理解那里所示的数字有点问题。

enter image description here

只有一个类,内容显示在图像中。 我写的测试如下,

public class AppTest {
    @Before
    public void before() {

    }

    @Test
    public void addShouldReturnTheSumOfTwoIntegersWhenFirstIsLessThan100() {
        Assert.assertTrue(65 == App.add(20, 45));
    }

    @Test
    public void addShouldReturnMinusOneWhenFirstIsGreaterThan200() {
        Assert.assertTrue(-1 == App.add(250, 45));
    }
}

如图所示,有4个分支。有人可以解释这个数字是4的吗?

更新:

当我只有以下测试用例时,

@Test
public void addShouldReturnMinusOneWhenFirstIsGreaterThan200() {
    Assert.assertTrue(-1 == App.add(250, 45));
}

输出,

enter image description here

当我进行所有3次测试时,

@Test
public void addShouldReturnTheSumOfTwoIntegersWhenFirstIsLessThan100() {
    Assert.assertTrue(65 == App.add(20, 45));
}

@Test
public void addShouldReturnMinusOneWhenFirstIsGreaterThan200() {
    Assert.assertTrue(-1 == App.add(250, 45));
}

@Test
public void addShouldReturn200WhenFirstIsGreaterThan100AndLessThan200() {
    Assert.assertTrue(200 == App.add(120, 45));
}

输出,

enter image description here

当我有return 200分支的以下测试用例时,

@Test
public void addShouldReturn200WhenFirstIsGreaterThan100AndLessThan200() {
    Assert.assertTrue(200 == App.add(120, 45));
}

输出,

enter image description here

更新2:

如果我有一个测试用例来检查第一个if子句,

@Test
public void addShouldReturnTheSumOfTwoIntegersWhenFirstIsLessThan100() {
    Assert.assertTrue(65 == App.add(20, 45));
}

输出,

enter image description here

我认为只有这个测试用例才涵盖隐藏分支。但是下面的任何其他分支也将覆盖这个神秘的分支。

更新3:

使用javap -c App.class后,

Compiled from "App.java"
public class com.vnb.play_cobertura.play_cobertura.App {
public com.vnb.play_cobertura.play_cobertura.App();
Code:
   0: aload_0
   1: invokespecial #1                  // Method java/lang/Object."<init>":
()V
   4: return

  public static int add(int, int);
Code:
   0: iload_0
   1: bipush        100
   3: if_icmpge     10
   6: iload_0
   7: iload_1
   8: iadd
   9: ireturn
  10: iload_0
  11: sipush        200
  14: if_icmpge     21
  17: sipush        200
  20: ireturn
  21: iconst_m1
  22: ireturn
}

解编译输出,

package com.vnb.play_cobertura.play_cobertura;

public class App
{
  public App() {}

  public static int add(int a, int b)
  {
    if (a < 100)
      return a + b;
    if (a < 200) {
      return 200;
    }
    return -1;
  }
}

1 个答案:

答案 0 :(得分:1)

基于javap输出,在指令3和14处有分支。每个分支由cobertura独立评估。由于每个分支可以有两个不同的结果,因此cobertura总计为您的方法计算4条路径。

一般来说,使用cobertura或任何其他工具来查找分支之间的所有依赖关系是不可行的。这就是为什么这些工具甚至不会尝试这样做的原因。

编译器将您的代码转换为更像这样的代码(请注意第二个else之前缺少的if):

if (a < 100) {
    return a + b;
}
if (a < 200) {
    return 200;
}
return -1;