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のテストに取り組む予定。