[Android] 單元測試

我啥時候說啦jj發表於2018-01-03

[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);
}
複製程式碼

相關文章