Android单元测试

Android 单元测试第五篇(查看代码覆盖率及详情)

2018-04-10  本文已影响64人  Little_Mango

怎么样的测试用例集合是好的,不同人可能会有不同的看法,但是如果一些复杂的逻辑没有被覆盖测试过,那么这样的测试显然是不充分的,所以我们写好单元测试之后还是需要清楚我们测试的覆盖率以及每个方法的覆盖情况,避免遗漏重要的测试用例。

本章介绍如何通过 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 默认的覆盖率是以被测试类所在的包为参考对象,但是我们一般的测试类只是针对某一个具体的类进行测试,所以就需要将参考对象设置为具体的类。
操作步骤如下:

  1. 如图一所示,将 target 切换成测试类,并且点击edit configurations

    图一.png
  2. 弹出的界面中,切换到Code Coverage,如图二所示,可以看到默认关联的整个package下的所有类。

    图二.png
  3. 删除package.*选项,增加Calculate类,如图三四五所示

    图三.png
图四.png 图五.png
  1. 选中CalculateTest左侧的绿色箭头,在弹出的下拉菜单中选择Run 'CalculateTest' with Coverage选项,如图六所示

    图六.png
  2. 测试用例集合运行完毕之后在 AS 右侧会弹出一个Coverage结果面板,在这里我们可以看到类、方法、行等三个覆盖指标,如图七所示

    图七.png
  3. 单击Calculate面板中的记录,便会跳转到所关联的被测试类,我们可以看到被测试类左侧有颜色区分,绿色表示语句覆盖了,红色表示没有被覆盖(因为我把参数化第五个测试用例注销了),如图八所示

    图八.png
  4. 同样的,我们也可以下载测试覆盖率的报告,如图九所示


    图九.png
上一篇 下一篇

猜你喜欢

热点阅读