2012年6月16日土曜日

Androidの単体テストの方法

まぁ、今さら感満載なのですが^^;;;

今日はAndroidの単体テストをする方法について記述していこうと思います。

まず、テストプロジェクトを用意します!
これはEclipseのAndroid Unit Test Projectを作成すればいいので
特に説明はいらないと思います!

あ!そうそう、一つだけ!!!
単体テストをしたいアプリのプロジェクトを指定するところが
ありますので、そこだけはちゃんと指定してください^^

さて、プロジェクトを作った後ですが、Activityをテストする
場合には、以下のように、「ActivityInstrumentationTestCase2」から
派生させてください。

で、そのクラスにテストケースを記述していく訳ですが、
命名規則(?)があります。

public void testXXXX()

のように、testから始まる関数がテストケースになります。
例えば、あるボタンの単体テストを記述する時には、
public void testButton()
などのようになるわけです。

以下にサンプルソースを乗せておきます!
サンプルでは、Acitivity1というActivityの、ボタンとオプションメニューの
動作をテストするサンプルです!
後は応用と発想力(?)です^^

この他にSDKには、モンキーテストをするためのツールもあるようです!
詳しくは調べてないのですが、
「adb ごにょごにょ monkey ごにょごにょ」
というように、コマンドラインから実行できるみたいです!

Let's Try Unit Test.

あ!
ちなみに、Androidの単体テストのベースはJUnitです!



package jp.developerwaiwai.test.test;

import jp.developerwaiwai.test.UI.Activity1;

import android.app.Activity;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;

public class TestCase1 extends ActivityInstrumentationTestCase2<Activity1> {

    private Activity _activity;
    private Instrumentation _instrumentation;
    
    public TestCase1() {
     super("jp.developerwaiwai.test.UI.Activity1", Activity1.class);
    }
    
    
    //テストを始める前に必要なものを記述する
    @Override
    protected void setUp() throws Exception {
     super.setUp();
    
     _activity = getActivity();
     _instrumentation = getInstrumentation();
    }
    
    //テスト後に必要な後処理を記述する
    @Override
    protected void tearDown() throws Exception {
    }
    
    
    public void testOptionMenu(){
     _instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
     _instrumentation.invokeMenuActionSync(_activity, Activity1.optionMenuID_1, 0);
    
     assertEquals(true , true);
    }

    public void testButton1() {
     ActivityMonitor monitor = new ActivityMonitor("jp.developerwaiwai.test.UI.Activity2", null, false);
     _instrumentation.addMonitor(monitor);
    
        _activity.runOnUiThread(new Runnable() {
            private Button button1 = (Button)_activity.findViewById(R.id.button1);
            
            @Override
            public void run() {
                button1.performClick();
            }
        });
        //UIスレッドが終了するまで待つ
        _instrumentation.waitForIdleSync();
        Activity next = getInstrumentation().waitForMonitorWithTimeout(monitor, 2000);
        assertEquals(monitor.getHits(),1);
        next.finish();
        _instrumentation.removeMonitor(monitor);
        
        TextView textView = (TextView)_activity.findViewById(R.id.textview1);
        String stringOfTextView = textView.getText().toString();
        assertTrue(stringOfTextView.equals("abc"));
    
    }
}