2017-08-25 34 views
3

我用我的代码测试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

UPDATE:

当我只有下面的测试案例,

@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

我认为,隐藏分支未涉及的仅此测试用例。但下面的其他分支也会覆盖这个神秘的分支。

UPDATE 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; 
    } 
} 
+0

尝试增加App.add(120,45)的'测试'与预期输出。只是一个猜测,但我想你会得到'6/6'。 –

+0

@JimGarrison我做到了,然后它会是4/4。到目前为止,我可以确定3个分支。我为那些人写了三个问题,问题是另一个问题是什么?和其他人一样,无论如何都是如此。 – prime

+0

显然你没有测试'return 200'分支。如果你测试了所有三个,那么请显示实际代码和Cobertura输出。 –

回答

1

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

一般来说,cobertura或任何其他工具都无法找到分支之间的所有依赖关系。所以这就是为什么这些工具甚至不尝试这样做的原因。

编译器转换你的代码的东西更是这样(注意第二if前失踪else):

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

所以你的意思是cobertura不会考虑'return'语句?反编译的代码看起来类似。 – prime

+1

@prime是的,这就是我的意思。 – SpaceTrucker