今日は仕様化テストのお話
先日、Androidテスト祭りで取り上げましたが、仕様化テストというテスト技法(?)があります。
簡単に仕様化テストとは何かをまとめるとこうなります。
ソフトウェアの仕様を調べ、その結果に基づいてテストを書くこと
マイケル・C・フェザーズ著、ウルシステムズ株式会社監訳、『レガシーコード改善ガイド』(翔泳社、2009年)、p.200
これは仕様のよくわからないアプリケーションないしはメソッドに対して仕様を明らかにすることができる技法なので、確実に覚えておきたい技法です。
というわけで、今回は画面サイズというなんかAndroidではちょっと嫌な部分について仕様化テストを書いてみようと思います。
まずは
Activity
を作ります。これはHello, Android状態のアプリです。
MikeCountDown.java
public class MikeCountDown extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mike_countdown);
}
}
レイアウト頑張ります。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/view_position"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_weight="3"
android:orientation="vertical">
<!-- 省略 -->
<SeekBar
android:id="@+id/seekBar"
android:max="15"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="25dip"
android:paddingRight="25dip"
android:layout_marginBottom="25dip"
android:thumb="@drawable/thumb"/>
<!-- 省略 -->
</LinearLayout>
</LinearLayout>
さて、ここでお題
SeekBar
の横幅の大きさを求めよ
ここで『リファクタリング―プログラムの体質改善テクニック』の一言が思い浮かぶわけです。
デバッグは最悪、テストはまだいい
微妙に間違っていると思いますが…
つまり、やつの大きさを求めるためにデバッグモードで起動するのは最悪ということです。
ではわからないものにどう対処するか?
わからないものには、テストを書きましょう。
MikeCountDownTest.java
public class MikeCountDownTest extends ActivityTestCase<MikeCountDown> {
private Activity activity;
public MikeCountDownTest() {
super("org.mikeneck.android.countdown", MikeCountDown.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
activity = getActivity();
}
public void testGetWidth() {
View view = activity.findViewById(R.id.seekBar);
assertEquals(1, view.getWidth());
}
}
テスト結果
落ちたので、大きさを取得することができました。
というわけで、これが通るようにテストを書きなおします。
MikeCountDownTest.java
public void testGetWidth() {
View view = activity.findViewById(R.id.seekBar);
assertEquals(464, view.getWidth());
}
テスト結果
はい、見事にテスト通過しました。
これでエミュレーターの仕様を知ることができました。
それと同時に、動かすことのできる仕様を手に入れることができました。
このような感じで現状の仕様にあわせてテストを書いていって、仕様書にしてしまう手法を仕様化テストといいます。
今テストがないのに、どうやってテストを入れればいいのかお悩みの皆さん、この手法でテストを挟み込んでいきましょう。
0 件のコメント:
コメントを投稿