massの日記

日々の薪

Android×TDD

昨年度からAndroidのアプリをチラホラ作り始めた。
一人でもくもく作っていて、何が一番つらかったかというと確認作業。
ちょっとしたリファクタリングでもエミュレータ起動して動きを確認しないといけない。
このコストは時間的にもそうだけど、精神的にもじわじわくる。
リファクタリングしたい→確認が面倒→一応動いているし、まあこのままでもいいか。
という流れに非常になりやすいと思う。
もしくは、リファクタリングした後で、1ステップずつではなくて、まとめて確認とか。

あくまで自分の個人的な見解だけれど、Androidアプリだと複数人でわいわい作るのではなく、一人でガリガリ作るから、こういった状況になりやすいと思う。
そこでテスト。テスト駆動開発。TestDrivenDevelopment。
RubyOnRailsで慣れ親しんだフロー、これをAndroidでもやっていきたい。
テストを書くor考える→テスト実行&失敗→実装→テスト実行&成功。

そんなわけで、まずは初めの1歩を踏んでみた。

今回はActivityのテストを書くことにしたので、Androidから提供されているJUnitのFramewark、TestSuiteを使用。
何故これを使ったかというとActivityのライフサイクル部分を吸収してくれるから。

下のがアプリケーションの実装コード。import文は長いので省略。

package jp.hoge.android.activity;

public class MainActivity extends Activity {
	private LinearLayout ll;
	private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	this.setContentView(R.layout.main);
    	ll = (LinearLayout) findViewById(R.id.ll);
    	
        ImageView icon = new ImageView(this);
        icon.setImageDrawable(@drawable.icon);
        ll.addView(icon);
        TextView name = new TextView(this);
        name.setText("hoge");
        ll.addView(name);
        Button button = new Button(this);
        button.setText("Next");
        button.setOnClickListener(new OnClickListener() {
    		public void onClick(View v) {
    	            Intent intent = new Intent(MainActivity.this, NextActivity.class);
    	            startActivity(intent);
    		}
        });
        ll.addView(button);
}

Activityとしてはシンプルなもので、画面上にユーザアイコン、ユーザ名、ボタンを表示するだけ。
今回はこれのテストを書いてみた。

まずはテストプロジェクトの作成、Eclipseで開発しているとAndroidプロジェクトでTest用のプロジェクトがある。
今回はこちらからプロジェクトを作成。
File>New>Project>Android>Android Test Project
作成する際にテスト対象をきかれるので、テストしたいアプリケーションプロジェクトを指定。
AndroidManifest.xmlには下記のような記述。

    <instrumentation android:targetPackage="jp.hoge.android"
    				 android:name="android.test.InstrumentationTestRunner"
    				 android:label="Test for Hoge Application" />

で、肝心のテストコードは下記。import文は省略

package jp.hoge.android.test.activity;

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
	private LinearLayout ll;
	
	public MainActivityTest() {
		super("jp.hoge.android", MainActivity.class);
	}
	
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		ll = (LinearLayout) getActivity().findViewById(R.id.ll);
	}
	
	public void testShowLoginUserIcon() throws Exception {
		ImageView userIcon = (ImageView) ll.getChildAt(0);
		assertNotNull(userIcon);
	}

	public void testShowLoginUserMessage() throws Exception {
		TextView userName = (TextView) ll.getChildAt(1);
		assertNotNull(userName);
	}

	public void testShowLoginUserButton() throws Exception {
		Button button = (Button) ll.getChildAt(2);
		assertNotNull(button);
	}
}

Javaで生成した子のView要素はgetChildAtで取得。表示要素が正しく表示されているか確認する。
後はテストを走らせて、Eclipse上にJUnitのテストステータスバーが表示され、green一色になればOK。
とりあえず、勢いでここまでやってみた。次はactivityではなくmodelのテストに取り組む予定。