#Jacoco收集Robotium脚本测试覆盖率#

导言##

最近做一个项目,要收集Android测试脚本的代码覆盖率,分支覆盖率,以前用Eclipse开发的时候使用Emma,但是Emma只能收集代码覆盖率,无法收集分支覆盖率,并且使用Emma比较麻烦。后来使用Android studio进行开发,发现了jacoco这个工具,简直神器,好用不说,功能还很齐全。下面说说如何使用jacoco收集robotium脚本测试覆盖率。
首先新建一个Android项目,我这里做了一个简单的加减乘除计算器,代码很少,就一个activity,具体代码如下:

package mandaria.net.jacocodemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements View.OnClickListener {

    private EditText input1_EditText;
    private EditText input2_EditText;
    private Button add_Button;
    private Button minus_Button;
    private Button multi_Button;
    private Button divide_Button;
    private TextView resultText;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        input1_EditText = (EditText) findViewById(R.id.input1_editText);
        input2_EditText = (EditText) findViewById(R.id.input2_editText);
        add_Button = (Button) findViewById(R.id.add_button);
        minus_Button = (Button) findViewById(R.id.minus_button);
        multi_Button = (Button) findViewById(R.id.multi_button);
        divide_Button = (Button) findViewById(R.id.divide_button);
        resultText = (TextView) findViewById(R.id.result_TextView);
        add_Button.setOnClickListener(this);
        minus_Button.setOnClickListener(this);
        multi_Button.setOnClickListener(this);
        divide_Button.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        String input1 = input1_EditText.getText().toString();
        String input2 = input2_EditText.getText().toString();
        double number1 = 0;
        double number2 = 0;
        try {
            number1 = Double.parseDouble(input1);
            number2 = Double.parseDouble(input2);
        } catch (RuntimeException e) {
            resultText.setText("Invalid Input");
            System.out.println(e.getMessage());
            return;
        }
        switch (view.getId()) {
            case R.id.add_button:
                resultText.setText(Double.toString(number1 + number2));
                break;
            case R.id.minus_button:
                resultText.setText(Double.toString(number1 - number2));
                break;
            case R.id.multi_button:
                resultText.setText(Double.toString(number1 * number2));
                break;
            case R.id.divide_button:
                if (number2 == 0) {
                    resultText.setText("Error!!!");
                    Toast.makeText(getApplication(), "dividend can't be zero!", Toast.LENGTH_SHORT).show();
                } else {
                    resultText.setText(Double.toString(number1 / number2));
                }
                break;
        }

    }
}
DEMO界面

然后配置Robotium环境:
在app/libs目录(没有则自己创建)下导入Robotium包;
在app/build.gradle文件中添加依赖:

    androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.2.1'

这样Robotium环境就配置完成了,接下来编写测试脚本:

package mandaria.net.jacocodemo;

import android.annotation.SuppressLint;
import android.test.ActivityInstrumentationTestCase2;

import com.robotium.solo.Solo;

public class DemoTest extends
        ActivityInstrumentationTestCase2<MainActivity> {
    private Solo solo;

    @SuppressLint("NewApi")
    public DemoTest() {
        super(MainActivity.class);
    }


    @Override
    public void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }

    @Override
    public void tearDown() throws Exception {
        solo.finishOpenedActivities();
    }

    /*------ Test Core Function ------*/
    public void testOnAdd() throws Exception {
        solo.enterText(0, "10");
        solo.enterText(1, "2");
        solo.clickOnButton("+");
        boolean result = solo.searchText("12");
        assertTrue(result);
    }
    
}

主要的测试代码在testXX()方法中。
运行一下,发现可以通过

脚本通过!

最后使用Jacoco收集测试覆盖率
首先在app/build.gradle的buildTypes中添加

debug{
            testCoverageEnabled = 'true'
        }

表示启用Jacoco收集覆盖率。点击Android studio右侧边栏Gradle按钮,依次点击项目名称/:app/other找到createDebugAndroidTestCoverageReport,右键点击它,选择Run...

createDebugAndroidTestCoverageReport

稍等一会,就可以看到测试代码在手机中运行。只要脚本没有问题,等运行完,就可以在app/build/reports/coverage/debug/index.html文件中中查看覆盖率。

coverage

点进去还可以看到那些代码没被执行到。

详细情况

绿色的代表被执行到,红色的代表没被执行到。

*注意!!!#

千万别用三星手机去跑脚本来收集测试覆盖率,不然收集到的覆盖率全为0!!!本来很简单的过程,因为导师给我一台三星手机做实验,做了三天也收集不到覆盖率,检查了配置,考虑是不是Android Studio版本有问题,但都没有解决,后来在StackOverFlow上看到这样一句话:
Try to generate the debug coverage report using Nexus device (5 or 5x), it will works perfectly. I was facing same issue with Samsung devices (coverage.ec is empty) but after that I run it with Nexus 5x and everything was working fine.果断丢弃了三星手机,用虚拟机还跑脚本,果然成功得到了覆盖率。

最后,demo及脚本可以在我的github上下载:
https://github.com/chl19940220/JacocoDemo.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容