[Android] 单元测试

515 阅读2分钟

[TOC]

资源

  1. UPDATED GUIDE TO ANDROID UNIT TESTING 介绍了src目录下三个目录的作用,但是我用的 android studio 2.0 preview 6 中的 build variants 中默认已经没有了 test artifact 选项了;
  2. Android测试初探 这几篇蛮全的了
  3. 在Android Studio中进行单元测试和UI测试
  4. as 2.0 Preview 5 简单说到了在这个版本中默认启用了两种test,可以通过如下方式开启(取消勾选):
    as_beta_7

基本操作

概念对应

Test Artifact 选择不同的类型,测试用例要放在不同的目录下:

  1. Android Instrumentation Tests --> src/androidTest
  2. Unit Tests --> src/test

Instrumentation test

经常都需要在机器上测试,调用到android代码等,我们选用 Instrumentation ; 直接看例子:

  1. 创建测试Activity,假设叫 MainActivity ;
  2. MainActivity 类源码中右键 go to -- test(ctrl+shift+t),选择 junit3 ,会在 src/androidTest/ 下生成 MainActivityTest ,修改其父类为 ActivityInstrumentationTestCase2 :
public class MainActivityTest extends ActivityInstrumentationTestCase2 {

    public MainActivityTest() {
        super(MainActivity.class); // 会创建MainActivity实例
    }

    public void testShowToast() throws Throwable {
        final Context context = getActivity();
        //通过getInstrumentation()方法获取Instrumentation对象,从而可以给APP发送用户操作事件
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, "Test ", Toast.LENGTH_LONG).show();
            }
        });
        Thread.sleep(5000);
    }
}
  1. 运行该测试用例,即可看到toast;

调用Activity生命周期

andorid系统没有提供直接调用生命周期的方法,我们可以酱紫做:

//传入页面对象,其他生命周期方法类似
getInstrumentation().callActivityOnPause(activity);

测试listview点击事件

// 正常activity中的listivew事件
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TextView tv = (TextView) view.findViewById(android.R.id.text1);
        Toast.makeText(UnitActivity.this, tv.getText() + " == ", Toast.LENGTH_SHORT).show();
    }
});

//适配器类
class Adapter extends BaseAdapter {
   ......

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null, false);
        TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
        tv.setText("hello listview " + position);
        return convertView;
    }
}

// 单元测试用例: test类,然后右键 run  testListView 即可看到
public void testListView() throws Throwable {
    Activity mAct = getActivity();
    ListView lv = (ListView) mAct.findViewById(R.id.lv);
    runTestOnUiThread(() -> { // 注意只能在ui线程中进行事件操作
        lv.performItemClick(lv.getChildAt(0), 0, lv.getItemIdAtPosition(0));
    });
    Thread.sleep(5000);
}