GOOS一人読書会 第1回 AuctionSniperEndToEndTest.sniperJoinsAuctionUntilAuctionCloses() - 1

環境としてはWindows7 + Eclipseでやっていきます。

環境構築はこちらの方を参考にさせていただきました。
http://hmi-me.ciao.jp/wordpress/archives/965
http://hmi-me.ciao.jp/wordpress/archives/972

進め方としてはTODOリストを頻繁に更新して、今なにをしようとしているのかを常に把握できるようにしていこうかなと思っています。

本の中にもざっくりとしたTODOリストがでてきますが、どんな細かい内容でも追加していこうと思います。

理由は、何をTODOリストに追加するかがとても重要だと思うからです。
実践する際は、
- 次に何をすべきか
- まだ何をしていないのか
- 仮実装にして後回しにしていることは何か
等を把握し対処することが一番大事で、あくまでもテスト技術はそれらの項目に対処するためのテクニックであると感じます。

ということで早速はじめていきましょう。


TODOリスト
商品ひとつ: 参加し、入札せずに落札に失敗する
商品ひとつ: 参加し、入札し、落札に失敗する
商品ひとつ: 参加し、入札し、落札する
商品ひとつ: 価格の詳細を表示する
複数の商品を扱う
GUIから新しい商品を追加する
指値で入札をやめる

まずは、"商品ひとつ: 参加し、入札せずに落札に失敗する"を表現するテストを書いていくことになります。
それが、以下のAuctionSniperEndToEndTestのsniperJoinsAuctionUntilAuctionCloses()になります。

package test.endtoend.auctionsniper;

import org.junit.Test;
import org.junit.After;

public class AuctionSniperEndToEndTest {
	private final FakeAuctionServer auction = new FakeAuctionServer("item-54321");
	private final ApplicationRunner application = new ApplicationRunner();
	
        // "商品ひとつ: 参加し、入札せずに落札に失敗する"
	@Test public void sniperJoinsAuctionUntilAuctionCloses() throws Exception {
                // step.1 偽のオークションにアイテムが出品されている状態にする
		auction.startSellingItem();

                // step.2 AuctionSniperをオークションに参加させる
		application.startBiddingIn(auction);

                // step.3 step.2の結果、偽のオークションがAuctionSniperから
                // メッセージを受信したことを確認する
		auction.hasReceivedJoinRequestFromSniper();

                // step.4 偽のオークションを終了させる
		auction.announceClosed();

                // step.5 step.4の結果、AuctionSniperが偽のオークションから
                // メッセージを受けて落札に失敗したことをユーザに知らせることを確認する
		application.showsSniperHasLostAuction();
	}
	
	@After public void stopAuction() {
		auction.stop();
	}

	@After public void stopApplication() {
		application.stop();
	}
}

本文中にも記述されていますが、テストを実行するための操作を表すメソッドは命令調(Step.1, 2, 4)、その結果を確認するためのメソッドは説明的(Step.3, 5)にするという命名規則となっています。

公式githubリポジトリ(https://github.com/sf105/goos-code)にならって、パッケージはtest.endtoend.auctionsniperにしました。
一応ですが、"final"は再代入禁止を表明するのに使います。

このテストを書いたことでやらなきゃならないことが追加されます。


TODOリスト
商品ひとつ: 参加し、入札せずに落札に失敗する


 ApplicationRunnerを定義する
 FakeAuctionServerを定義する

商品ひとつ: 参加し、入札し、落札に失敗する
商品ひとつ: 参加し、入札し、落札する
商品ひとつ: 価格の詳細を表示する
複数の商品を扱う
GUIから新しい商品を追加する
指値で入札をやめる

まずはApplicationRunnerを定義していくことにします。

package test.endtoend.auctionsniper;

public class ApplicationRunner {
	public static final String SNIPER_ID = "sniper";
	public static final String SNIPER_PASSWORD = "sniper";
	
        // 別スレッドで起動させるメインプログラムとやり取りするためのオブジェクト
	private AuctionSniperDriver driver;
	
        // step.2 AuctionSniperをオークションに参加させる
	public void startBiddingIn(final FakeAuctionServer auction) {
		Thread thread = new Thread("Test Application") {
			@Override public void run() {
				try {
                                // メインプログラムに接続先サーバ名, 接続に使うidと
                                // パスワード, 参加するオークションIDを渡すと自動で
                                // オークションに参加する"ことにする"
					Main.main(XMPP_HOSTNAME, SNIPER_ID, SNIPER_PASSWORD, auction.getItemId());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};
                // スレッドをデーモンにしておく
		thread.setDaemon(true);
                // メインプログラムを別スレッドで起動する
		thread.start();
		driver = new AuctionSniperDriver(1000);

                // メインプログラムが起動した結果AuctionSniperの状態が
                // Joining(参加中)になっていることを確認する
		driver.showsSniperStatus(STATUS_JOINING);
	}
	
        // step.5 step.4の結果、AuctionSniperが偽のオークションから
        // メッセージを受けて落札に失敗したことをユーザに知らせることを確認する
	public void showsSniperHasLostAuction() {
		driver.showsSniperStatus(STATUS_LOST);
	}
	
	public void stop() {
		driver.dispose();
	}
}

ApplicationRunnerを実装するために、実行する対象のMainと、Mainとやり取りするためのAuctionSniperDriverを実装しなければならないのでTODOリストに追加していきます。


TODOリスト

商品ひとつ: 参加し、入札せずに落札に失敗する
 ApplicationRunnerを定義する


  AuctionSniperDriverを定義する
  Mainを定義し、自動でログインできるようにする

 FakeAuctionServerを定義する


商品ひとつ: 参加し、入札し、落札に失敗する
商品ひとつ: 参加し、入札し、落札する
商品ひとつ: 価格の詳細を表示する
複数の商品を扱う
GUIから新しい商品を追加する
指値で入札をやめる

今回はここまでにします。

次回は、WindowLickerについて少し学んでからAuctionSniperDriverを実装していくところからはじめたいと思います。