2011年8月8日月曜日

仕様化テストの話をしようか

今日は仕様化テストのお話


先日、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 件のコメント:

コメントを投稿