2011年7月30日土曜日

[Android] JUnitを使ってテストする

Androidで単体テストを行うときに使用するJUnitを今日は使ってみたいと思います。

というわけでさっそく使ってみましょう。

ハイライトとしては以下のとおりです。
1.ActivityInstrumentationTestCase2を継承する
2.パッケージとテストしたいクラスを指定したコンストラクタを作成
3.テスト準備を行うsetUpメソッドを記述する
4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する

えっと、先に参考サイトは
こちら
テスティングフレームワーク JUnit

こちら
AndroidアプリケーションをJUnitでテストする

ですね。

では、さっそくコードです。

・・・その前にテストプロジェクトを作成しましょう。
New -> Android TestProjectで作成します。


























画面としてはこんな感じです。
今回は前回使用したプロジェクト(checkBoxAcitivy)を使用します。


では、コードをみていきましょう。

1.ActivityInstrumentationTestCase2を継承する
public class CheckActivityTest extends ActivityInstrumentationTestCase2  {
}

JUnitだとTestCaseなんですが、Androidはこちらを使用するとのことです。
Activityだからかな。

次。

2.パッケージとテストしたいクラスを指定したコンストラクタを作成
public CheckActivityTest() {
  super("jp.co.mogakana.check.test",CheckActivity.class);
 }

クラスを指定してやら無いといかんということですね。

では次。

3.テスト準備を行うsetUpメソッドを記述する
@Override
 protected void setUp() throws Exception {
     super.setUp();
    
     // Activityを取得
     mActivity = getActivity();
     // リソースを紐付け
     mCheckTooth = (CheckBox) mActivity.findViewById(R.id.toothCheck);
     mCheckHair = (CheckBox) mActivity.findViewById(R.id.hairCheck);
     mCheckBody = (CheckBox) mActivity.findViewById(R.id.bodyCheck);
  
 }

ここはあんまり説明するまでもないかもしれませんが。
テストで使用するActivityを取得します。

4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する
// 歯を磨いていないかチェックする
 public void testIsCheckTooth() {
  assertFalse(mCheckTooth.isChecked());
 }

上記は単純にチェックボックスがオフになっていることを確認しています。
テスト中にUIをいじる・・・
例えばチェックボックスにチェックをいれるなどの動作をする場合は
別スレッドで動作させます。

// 髪を磨いてチェックする
 public void testIsCheckHair() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckHair.setChecked(true);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  
  assertTrue(mCheckHair.isChecked());
 }

こんな感じですね。
実際にチェックをいれてから動作が完了するまで待ってから判定しています。

こんな感じでJUnitは使用していきます。
これはさわりだけなんで、詳しいことはまた後日・・・。


だとおもいたい。

せっかくなのでソースコードをさらしておきますのさー。

package jp.co.mogakana.check.test.testcase;

import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.CheckBox;
import jp.co.mogakana.check.test.CheckActivity;

import jp.co.mogakana.check.test.R;

/* 1.ActivityInstrumentationTestCase2を継承する */
public class CheckActivityTest extends ActivityInstrumentationTestCase2  {
 
 // Activity用
 private Activity mActivity;

 // CheckBox1用
 private CheckBox mCheckTooth;
 private CheckBox mCheckHair;
 private CheckBox mCheckBody;
 
 
 /* 2.パッケージとテストしたいクラスを指定したコンストラクタを作成 */
 
 public CheckActivityTest() {
  super("jp.co.mogakana.check.test",CheckActivity.class);
 }
 
 
 /* 3.テスト準備を行うsetUpメソッドを記述する */ 
 @Override
 protected void setUp() throws Exception {
     super.setUp();
    
     // Activityを取得
     mActivity = getActivity();
     // リソースを紐付け
     mCheckTooth = (CheckBox) mActivity.findViewById(R.id.toothCheck);
     mCheckHair = (CheckBox) mActivity.findViewById(R.id.hairCheck);
     mCheckBody = (CheckBox) mActivity.findViewById(R.id.bodyCheck);
  
 }
 
 /* 4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する */
 
 // 歯を磨いていないかチェックする
 public void testIsCheckTooth() {
  assertFalse(mCheckTooth.isChecked());
 }
 
 // 髪を磨いてチェックする
 public void testIsCheckHair() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckHair.setChecked(true);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  
  assertTrue(mCheckHair.isChecked());
 }
 
 // 体を洗って戻して(?)チェックする
 public void testIsCheckBody() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckBody.setChecked(true);
    mCheckBody.setChecked(false);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  assertFalse(mCheckBody.isChecked());
  
 }
 
}

0 件のコメント:

コメントを投稿