atdd's Wiki - Chapter6 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
!! Light States
車と交差点の信号機のためのシステムを構築する。
2つの方向性がある。
* 交差点の仕様
** 信号の点灯状態が正しく遷移すること
* 構築の仕方
** テストを FitNesse で決定表 (デシジョンテーブル) として実装
!!! State Specification
ドイツの信号機システムについて仕様化ワークショップを始める。
* 遷移
** 赤→赤と黄の同時→緑
** 緑→黄
** 黄→赤
さっそく表にしよう。
Table 6.1 Valid な遷移
|| 前の状態 || 次の状態 ||
|| 赤 || 赤、黄 ||
|| 赤、黄 || 緑 ||
|| 緑 || 黄 ||
|| 黄 || 赤 ||
Table 6.1 全ての遷移
|| 前の状態 || 次の状態 ||
|| 赤 || 赤、黄 ||
|| 赤、黄 || 緑 ||
|| 緑 || 黄 ||
|| 黄 || 赤 ||
|| 黄点滅 || 黄点滅 ||
!!! The First Test
* まずは FitNesse をダウンロードするところから。
** http://fitnesse.org
* ダウンロードしたら java -jar fitnesse.jar -p 8080 で実行。
* 最近のやつだと最初に Wiki ページを用意してくれる。
* Traffic Light システムのためのテストスイートとなるページを作る
* ページを作成したら Tools>Properties からページの種類を Suite に変更する
** Add ボタンが追加される
** Suite ボタンが追加される
* Suite ボタンを押すとテストが実行できるようになった
** (注釈:厳密なTDDでは新しいものを追加するときはテストを書いてから云々。著者は3年くらいFitNesse使って慣れてるから、この手順でも大丈夫なんだと主張)
* 最初のテスト
** 信号機の状態のテスト
* この後のテスト (予測)
** 交差点のいろんな状態に関するテスト
* 最初のテストと後のテストは性質が違うことが予想される
** 予めテストスイートを別にしておく
* 忘れそうだけどワークショップでは状態遷移を明らかにしたい
* 決定表は SLiM で利用できる記法を使う
** 1行1行がテストケース
** ヘッダ文字列の最後にクエスチョンマークが
*** 無い:システムへの入力
*** 有る:システムからの出力 (検証される)
* 信号機の状態遷移では、入力も出力も信号の色 (Listing 6.5)
* まずは最初の失敗するテストができたところ (Figure 6.2)
!!! Diving into the Code
Java 開発環境のセットアップは本書のスコープ外なのであまり説明はしません…
* レッド、最初のテストが失敗
** TrafficLights クラスと引数無しのコンストラクタを作成する
* レッド、失敗の原因が変わる
** setPreviousState と nextState メソッドの空実装を追加
* レッド、失敗の原因が変わる
** nextState メソッドの仮実装…
* グリーン
** 次のテストケースを追加
* レッド、失敗の原因が変わる
** setPreviousState で渡された状態を保持するようにして
** nextState は直前の状態から次の状態を決めるようにして
* グリーン
!!! Refactoring
* 1つの機能を実装した
** 次の機能に進んでもよさそうだけどちょっと待って!
*** TDD で開発した (ドヤァ) ので、テストコードとプロダクションコードが密結合すぎる。分離しないといけない
*** パッケージ空間無しに開発してしまったので修正されるべき
!!!! パッケージ
* ちゃんとしたツール (IDE) を使ってるならクラスの移動に頭を悩ませることはない
* でも FitNesses には伝えないといけない…
** テストページの冒頭にパッケージの記述 (import 文) を追加する
!!!! 点灯状態列挙型 (The LightState Enum)
* 点灯状態は列挙型にするべきなんじゃないかと思えてきた
* TDD で変更しました (ドヤァ)
* 不定な状態への対処
** ドイツの法律「信号機は、設定が間違っていたら点滅しないといけない」
** 実装しました
!!!! Editing LightStates
* 列挙型を導入したのでサポートコードの修正も必要
* FitNesses のテストは文字列値を使ってるので、それを変換したりする
** 巨大は if then elseif else ができつつある
** 決っしてよい設計とは言えない
* 値クラス (Domain) に対する編集クラス (Editor) を導入する
** LithtState に対する LightStateEditor
** PropertyEditorSupport のサブクラスとして作成
* ここでも TDD で進める (ドヤァ)
!!! Summary
* 信号の点灯状態の遷移を表で表した
* 受け入れテストとユニットテストを別の概念として導入した
* 私たちはテストによって問題領域の理解を深めていく
** 信号機の状態を LightState クラスで表現したら、サポートコードはシンプルになっていった
* アウトサイドインなアプローチの利点
** コードがドメインから乖離してしまうことを防げる
** もしテストを既存のコードベースに合わせようとしたらこうはいかなかった
* 受け入れ基準から設計に落としていく
** いいと思います
車と交差点の信号機のためのシステムを構築する。
2つの方向性がある。
* 交差点の仕様
** 信号の点灯状態が正しく遷移すること
* 構築の仕方
** テストを FitNesse で決定表 (デシジョンテーブル) として実装
!!! State Specification
ドイツの信号機システムについて仕様化ワークショップを始める。
* 遷移
** 赤→赤と黄の同時→緑
** 緑→黄
** 黄→赤
さっそく表にしよう。
Table 6.1 Valid な遷移
|| 前の状態 || 次の状態 ||
|| 赤 || 赤、黄 ||
|| 赤、黄 || 緑 ||
|| 緑 || 黄 ||
|| 黄 || 赤 ||
Table 6.1 全ての遷移
|| 前の状態 || 次の状態 ||
|| 赤 || 赤、黄 ||
|| 赤、黄 || 緑 ||
|| 緑 || 黄 ||
|| 黄 || 赤 ||
|| 黄点滅 || 黄点滅 ||
!!! The First Test
* まずは FitNesse をダウンロードするところから。
** http://fitnesse.org
* ダウンロードしたら java -jar fitnesse.jar -p 8080 で実行。
* 最近のやつだと最初に Wiki ページを用意してくれる。
* Traffic Light システムのためのテストスイートとなるページを作る
* ページを作成したら Tools>Properties からページの種類を Suite に変更する
** Add ボタンが追加される
** Suite ボタンが追加される
* Suite ボタンを押すとテストが実行できるようになった
** (注釈:厳密なTDDでは新しいものを追加するときはテストを書いてから云々。著者は3年くらいFitNesse使って慣れてるから、この手順でも大丈夫なんだと主張)
* 最初のテスト
** 信号機の状態のテスト
* この後のテスト (予測)
** 交差点のいろんな状態に関するテスト
* 最初のテストと後のテストは性質が違うことが予想される
** 予めテストスイートを別にしておく
* 忘れそうだけどワークショップでは状態遷移を明らかにしたい
* 決定表は SLiM で利用できる記法を使う
** 1行1行がテストケース
** ヘッダ文字列の最後にクエスチョンマークが
*** 無い:システムへの入力
*** 有る:システムからの出力 (検証される)
* 信号機の状態遷移では、入力も出力も信号の色 (Listing 6.5)
* まずは最初の失敗するテストができたところ (Figure 6.2)
!!! Diving into the Code
Java 開発環境のセットアップは本書のスコープ外なのであまり説明はしません…
* レッド、最初のテストが失敗
** TrafficLights クラスと引数無しのコンストラクタを作成する
* レッド、失敗の原因が変わる
** setPreviousState と nextState メソッドの空実装を追加
* レッド、失敗の原因が変わる
** nextState メソッドの仮実装…
* グリーン
** 次のテストケースを追加
* レッド、失敗の原因が変わる
** setPreviousState で渡された状態を保持するようにして
** nextState は直前の状態から次の状態を決めるようにして
* グリーン
!!! Refactoring
* 1つの機能を実装した
** 次の機能に進んでもよさそうだけどちょっと待って!
*** TDD で開発した (ドヤァ) ので、テストコードとプロダクションコードが密結合すぎる。分離しないといけない
*** パッケージ空間無しに開発してしまったので修正されるべき
!!!! パッケージ
* ちゃんとしたツール (IDE) を使ってるならクラスの移動に頭を悩ませることはない
* でも FitNesses には伝えないといけない…
** テストページの冒頭にパッケージの記述 (import 文) を追加する
!!!! 点灯状態列挙型 (The LightState Enum)
* 点灯状態は列挙型にするべきなんじゃないかと思えてきた
* TDD で変更しました (ドヤァ)
* 不定な状態への対処
** ドイツの法律「信号機は、設定が間違っていたら点滅しないといけない」
** 実装しました
!!!! Editing LightStates
* 列挙型を導入したのでサポートコードの修正も必要
* FitNesses のテストは文字列値を使ってるので、それを変換したりする
** 巨大は if then elseif else ができつつある
** 決っしてよい設計とは言えない
* 値クラス (Domain) に対する編集クラス (Editor) を導入する
** LithtState に対する LightStateEditor
** PropertyEditorSupport のサブクラスとして作成
* ここでも TDD で進める (ドヤァ)
!!! Summary
* 信号の点灯状態の遷移を表で表した
* 受け入れテストとユニットテストを別の概念として導入した
* 私たちはテストによって問題領域の理解を深めていく
** 信号機の状態を LightState クラスで表現したら、サポートコードはシンプルになっていった
* アウトサイドインなアプローチの利点
** コードがドメインから乖離してしまうことを防げる
** もしテストを既存のコードベースに合わせようとしたらこうはいかなかった
* 受け入れ基準から設計に落としていく
** いいと思います