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

前回の終了時点でのTODOリストは以下の通りです。


TODOリスト

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


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

 FakeAuctionServerを定義する


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

今回はAuctionSniperDriverを実装していくつもりです。

本文には以下のような記述があります。

AuctionSniperDriverは、WindowLickerのJFrameDriverを簡単に拡張したクラスである。

というこで、まずはWindowLickerについて調べることからはじめていきたいと思います。

http://code.google.com/p/windowlicker/wiki/Concepts
を読んでみましょう。

Component Driver
テスト対象システム(SUT)のUIを操作したり、状態を確認したりするのに使用するものだそうです。UIの操作にはGestureが使用され、状態の確認にはProberが使用されます。

Gesture
マウスやキーボードのような入力装置からの入力イベントを発生させて、SUTのUIを操作します。
マウスのボタンやキーボードのキーを押す/離す等の基本的な多くのGestureがあらかじめ用意されていますし、それらのGestureを組み合わせてより複雑なGestureを新たに作成することも可能です。

Probe
SUTの状態を確認し、その状態がテストをパスする状態かどうかを報告します。

ComponentFinder / ComponentSelector
Matcherで指定した条件(複数指定可能)をみたすコンポーネントが存在するかを確かめるものです。これらはProbeの一種です。1個以上存在すればOKとするのがComponentFinder、1個だけ存在するときのみOKとするのがComponentSelector。

とりあえずこんなもんでしょうか。

ということで、AuctionSniperDriverを写経していきます。

package test.endtoend.auctionsniper;

import auctionsniper.Main;

import com.objogate.wl.swing.AWTEventQueueProber;
import com.objogate.wl.swing.driver.JFrameDriver;
import com.objogate.wl.swing.driver.JLabelDriver;
import com.objogate.wl.swing.gesture.GesturePerformer;

import static org.hamcrest.Matchers.equalTo;

public class AuctionSniperDriver extends JFrameDriver {
	public AuctionSniperDriver(int timeoutMillis) {
		super(new GesturePerformer(), // Gestureを実行するためのオブジェクト

                      // ComponentSelector
                      // "Auction Sniper"という名前で画面上に表示されているウィンドウが
                      // 一つだけあればOK、そうじゃなければNG
	              JFrameDriver.topLevelFrame(
                          named(Main.MAIN_WINDOW_NAME), 
                          showingOnScreen()),

                      // Prober
                      // 指定した時間ポーリングしながら与えられたProbeが満たされたかどうかを調べる
	              new AWTEventQueueProber(timeoutMillis, 100));
	}
	
	public void showsSniperStatus(String statusText) {
		new JLabelDriver(
                      this,                          // ComponentDriver<? extends Component> parentOrOwner
                      named(Main.SNIPER_STATUS_NAME) // ComponentSelector<T> selector
                ).hasText(equalTo(statusText));
	}
}

本文では、"コンストラクタが呼び出された際に、与えられた時間の中で、目に見えるトップレベルのウィンドウの中からオークションスナイパーを探す"とかかれていますが、WindowLickerのソースをみる限りJFrameDriverのコンストラクタはメンバ変数に代入を行っているだけですし、ApplicationRunnerのstartBiddingInでdriver.showsSniperStatus(STATUS_JOINING);をコメントアウトし、AuctionSniperDriverのコンストラクタでnamed(Main.MAIN_WINDOW_NAME)のところをnamed("abc")とか適当に変えても、startBiddingInでエラーが発生しないので"オークションスナイパーを探"しているのはコンストラクタが呼び出された際では無いように思います。

"オークションスナイパーを探"しているのは、showsSniperStatusのhasText(equalTo(statusText))を実行する際にcheck()的な関数で行われているようです。

WindowLickerのドキュメントが見つからないのでちょっと自信1が無いですが...


TODOリスト

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

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

 FakeAuctionServerを定義する


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

AuctionSniperDriverの定義が完了しました。TODOは今回追加されていません。

次回はsmackについて少し調べてから、FakeAuctionServerを定義していきたいと思います。