ブログトップ 記事一覧 ログイン 無料ブログ開設

Strategic Choice

2010-03-01

[]テスト駆動開発のパターン・Assert First(アサートファースト)

Q:アサートをいつ作成すべきなのか。

A:最初に作成すべきである。

どうして?

テストを作成する時、実は複数の問題を一度に解決しようとしています。

  • 機能はどこに所属するのか。
  • どのような名前を付けるべきなのか。
  • 正しい答をどのようにチェックするのか。
  • 正しい答は何か。
  • このテストから、他のどのテストが想起されるのか。

これらの問題すべてを同時に解決しようとしてもよい結果は得られません。アサートファーストすると「正しい答は何か」と「正しい答をどのようにチェックするのか」という2つの問題を、他の問題から「最初に」「容易に」分離することができます。これによりプログラミング作業をシンプルに進める事ができます。

どうすれば?

例を挙げて説明します。

ソケット経由で他のシステムと通信を行いたいとします。通信が終わると、ソケットが閉じられ、abcという文字列が読み込まれます。この「正しい答え」をアサートに書くことからテストを書き始めます。

@Test
testCompleteTransaction(){
  assertThat( reader.isClosed(), is(true) );
  assertThat( reply.contents(), is("abc") );
}

後はボトムアップで順に書いていきます。replyはソケットから取得します。

@Test
testCompleteTransaction(){
  Buffer reply = reader.contents();
  assertThat( reader.isClosed(), is(true) );
  assertThat( reply.contents(), is("abc") );
}

ソケットはサーバとの接続時に作成します。

@Test
testCompleteTransaction(){
  Socket reader = new Socket("localhost", defaultPort() );
  Buffer reply = reader.contents();
  assertThat( reader.isClosed(), is(true) );
  assertThat( reply.contents(), is("abc") );
}

しかしその前にサーバをオープンする必要があります。

@Test
testCompleteTransaction(){
  Server writer = new Server( defaultPort(), "abc" );
  Socket reader = new Socket("localhost", defaultPort() );
  Buffer reply = reader.contents();
  assertThat( reader.isClosed(), is(true) );
  assertThat( reply.contents(), is("abc") );
}

実際の使用方法に合わせて、名前を調整しないといけないのかもしれませんが、とても小さな手順でテストの概略を作成できました。それぞれの決定毎に、すぐにフィードバックが得られています。

補足

TDDにおける実装手順の概要は以下の様になります。

  • どこからシステムの構築を開始すべきなのか。
    • →完成したシステムについて、語ることができるストーリーから開始する。
  • どこから小さな機能の作成を開始すべきなのか。
    • →完成したコードならパスするであろうテストから開始する。
  • どこからテストの作成を開始すべきなのか。
    • →完成時にパスするアサートから開始する。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証