我正在用我的代码测试cobertura并生成一个简单的报告。理解那里所示的数字有点问题。
只有一个类,内容显示在图像中。 我写的测试如下,
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));
}
输出,
当我进行所有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));
}
输出,
当我有return 200
分支的以下测试用例时,
@Test
public void addShouldReturn200WhenFirstIsGreaterThan100AndLessThan200() {
Assert.assertTrue(200 == App.add(120, 45));
}
输出,
更新2:
如果我有一个测试用例来检查第一个if
子句,
@Test
public void addShouldReturnTheSumOfTwoIntegersWhenFirstIsLessThan100() {
Assert.assertTrue(65 == App.add(20, 45));
}
输出,
我认为只有这个测试用例才涵盖隐藏分支。但是下面的任何其他分支也将覆盖这个神秘的分支。
更新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 :(得分:1)
基于javap
输出,在指令3和14处有分支。每个分支由cobertura独立评估。由于每个分支可以有两个不同的结果,因此cobertura总计为您的方法计算4条路径。
一般来说,使用cobertura或任何其他工具来查找分支之间的所有依赖关系是不可行的。这就是为什么这些工具甚至不会尝试这样做的原因。
编译器将您的代码转换为更像这样的代码(请注意第二个else
之前缺少的if
):
if (a < 100) {
return a + b;
}
if (a < 200) {
return 200;
}
return -1;