怎么样的测试用例集合是好的,不同人可能会有不同的看法,但是如果一些复杂的逻辑没有被覆盖测试过,那么这样的测试显然是不充分的,所以我们写好单元测试之后还是需要清楚我们测试的覆盖率以及每个方法的覆盖情况,避免遗漏重要的测试用例。
本章介绍如何通过 AS 查看测试代码覆盖率
一、创建一个被测试类以及其测试类
代码如下,具体创建方法可以看我前面的文章
//被测试类
public class Calculate {
@IntDef({OPR_ADD, OPR_MIN, OPR_MULTI, OPR_DIV})
@Retention(RetentionPolicy.SOURCE)
@interface Operation {}
public static final int OPR_ADD = 0;
public static final int OPR_MIN = 1;
public static final int OPR_MULTI = 2;
public static final int OPR_DIV = 3;
public int opr(@Operation int opr, int numA, int numB) {
int result;
switch (opr) {
case OPR_ADD:
result = numA + numB;
break;
case OPR_MIN:
result = numA - numB;
break;
case OPR_MULTI:
result = numA * numB;
break;
case OPR_DIV:
result = numA / numB;
break;
default:
result = 0;
break;
}
return result;
}
@Override
public String toString() {
return "this is a calculate class";
}
}
//测试类
@RunWith(Parameterized.class)
public class CalculateTest {
private Calculate _calculate;
private int _numA;
private int _numB;
private @Calculate.Operation int _opr;
private int _result;
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{Calculate.OPR_ADD, 1, 2, 3},
{Calculate.OPR_MIN, 1, 2, -1},
{Calculate.OPR_MULTI, 1, 2, 2},
{Calculate.OPR_DIV, 1, 2, 0},
// {4, 1, 2, 0},
});
}
public CalculateTest(int _opr, int _numA, int _numB, int _result) {
this._numA = _numA;
this._numB = _numB;
this._opr = _opr;
this._result = _result;
}
@Before
public void setUp() throws Exception {
_calculate = new Calculate();
}
@Test
public void opr() throws Exception {
assertEquals(_result, _calculate.opr(_opr, _numA, _numB));
}
@Test
public void testToString() throws Exception {
_calculate.toString();
}
}
上面的测试类,使用的参数化测试,一个完整的测试包含五个测试用例,关于参数化测试可以看这篇文章
二、为测试类配置代码覆盖率
这个步骤是告诉 AS,我们的测试类关联的是哪个被测试类,目前 AS 默认的覆盖率是以被测试类所在的包为参考对象,但是我们一般的测试类只是针对某一个具体的类进行测试,所以就需要将参考对象设置为具体的类。
操作步骤如下:
-
如图一所示,将 target 切换成测试类,并且点击
edit configurations
-
弹出的界面中,切换到
Code Coverage
,如图二所示,可以看到默认关联的整个package
下的所有类。
-
删除
package.*
选项,增加Calculate
类,如图三四五所示
-
选中
CalculateTest
左侧的绿色箭头,在弹出的下拉菜单中选择Run 'CalculateTest' with Coverage
选项,如图六所示
-
测试用例集合运行完毕之后在 AS 右侧会弹出一个
Coverage
结果面板,在这里我们可以看到类、方法、行等三个覆盖指标,如图七所示
-
单击
Calculate
面板中的记录,便会跳转到所关联的被测试类,我们可以看到被测试类左侧有颜色区分,绿色表示语句覆盖了,红色表示没有被覆盖(因为我把参数化第五个测试用例注销了),如图八所示
-
同样的,我们也可以下载测试覆盖率的报告,如图九所示