2011年8月4日木曜日

[Android] JUnitで単体テストをする

前回の記事の補足になってしまいますが、
前回のActivityInstrumentationTestCase2は「機能テスト」を行うためでした。
機能テストはその機能がテストするかどうかのテストです。

次は「単体テスト」をやりましょう。
Activityの単体テストということで、開始→終了までをテストします。

今回の流れはこちら。

1.ActivityInstrumentationTestCaseを継承する
2.テストしたいクラスを指定したコンストラクタを作成
3.テスト準備を行うsetUpメソッドを記述する
4.Activityを終了させる(この場合はBACKボタンの押下)

基本的には動作を変えただけですが。
UIをいじっての終了ではなく、ハードキー動作での終了なので
わりと簡素なコードになってます。
さ、順番に見ていきましょう。

1.ActivityInstrumentationTestCaseを継承する

  1. /* 1.ActivityInstrumentationTestCaseを継承する */  
  2. public class CheckActivityTest2 extends ActivityUnitTestCase<checkactivity> {  
  3.   
  4. }  
  5. </checkactivity>  

*ソースコードにとありますが、エディタの補完機能でこうなっているだけです。無視してください。
今回は単体テストなので(Activity全体のテスト)、ActivityInstrumentationTestCaseを継承して使います。


2.テストしたいクラスを指定したコンストラクタを作成

  1. /* 2.テストしたいクラスを指定したコンストラクタを作成 */  
  2. public CheckActivityTest2() {  
  3.  super(CheckActivity.class);  
  4. }  

コンストラクタはクラス名のみ指定で。
次。
3.テスト準備を行うsetUpメソッドを記述する

  1. /* 3.テスト準備を行うsetUpメソッドを記述する */   
  2. @Override  
  3. protected void setUp() throws Exception {  
  4.  super.setUp();  
  5.    
  6.  // Activityの起動  
  7.  startActivity(new Intent(), nullnull);  
  8.    
  9.  // Activityを取得  
  10.  mActivity = getActivity();  
  11.    
  12. }  

自力でActivityを起動して取得しています。
次。
4.Activityを終了させる(この場合はBACKボタンの押下)

  1. /* 4.Activityを終了させる(この場合はBACKボタンの押下) */  
  2. public void testPushBackButton() {  
  3.   
  4.  KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);  
  5.  assertTrue(mActivity.dispatchKeyEvent(event));  
  6.    
  7. }  

本当はActivityが終了したら~という判定になると思うんですが、
そのあたりが未調査(おい)なので、BACKボタンの判定をしています。
うまいかんじにおせたらテストOKとしています。
Activityに何かさせる場合はその都度テストがいるのだとおもいますが、
そのあたりは機能テストで網羅させて単体テストでは開始→終了のサイクルがみれればいいかなーともおもっていたり。
なんつか技術者的にそれはいいのか?とも思うのですが、それもそのうち。
どうにかしたいです。

では本日のソースコードをのせておわりにします。
  1. package jp.co.mogakana.check.test.testcase;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.test.ActivityUnitTestCase;  
  6. import android.view.KeyEvent;  
  7. import jp.co.mogakana.check.test.CheckActivity;  
  8.   
  9. /* 1.ActivityInstrumentationTestCaseを継承する */  
  10. public class CheckActivityTest2 extends ActivityUnitTestCase<checkactivity> {  
  11.    
  12.  // Activity用  
  13.  private Activity mActivity;  
  14.    
  15.  /* 2.テストしたいクラスを指定したコンストラクタを作成 */  
  16.  public CheckActivityTest2() {  
  17.   super(CheckActivity.class);  
  18.  }  
  19.    
  20.  /* 3.テスト準備を行うsetUpメソッドを記述する */   
  21.  @Override  
  22.  protected void setUp() throws Exception {  
  23.      super.setUp();  
  24.     
  25.      // Activityの起動  
  26.      startActivity(new Intent(), nullnull);  
  27.        
  28.      // Activityを取得  
  29.      mActivity = getActivity();  
  30.        
  31.  }  
  32.    
  33.  /* 4.Activityを終了させる(この場合はBACKボタンの押下 */  
  34.  public void testPushBackButton() {  
  35.   
  36.   KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);  
  37.   assertTrue(mActivity.dispatchKeyEvent(event));  
  38.     
  39.  }  
  40.   
  41. }  
  42.   
  43. </checkactivity>  

今日も素敵にノイローゼ★

1 件のコメント:

  1. こんにちは。

    アンドロイド、益々充実してきますでしょうかね。

    返信削除