Part 1-1
TODOListの作成
- どのようなテストが必要となるか考える(まずテストから始める)
- 複雑なものは小さく分解する
- 途中で必要なものに気づいたらいきなりとりかかるのではなくTODOListに記入する
TODOList.md
レートが2:1の場合、$5+10CHF=$10
$5*2=10
amountのプライベート化
Dollarの副作用
Moneyの丸め処理
テストの作成
DollarTest.java
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
}
- 作成したテストをコンパイルできるようにする
Dollar.java
public class Dollar {
int amount;
Dollar(int amount){}
void times(int multiplier){}
}
レッド
- コンパイルできるがテストは失敗する状態
TDDのサイクル
テストを少しだけ作成する
すべてのテストを実行し、失敗を確認する <- イマココ
小さな修正を行う
テストを実行し、成功させる
重複を取り除くためにリファクタリングを行う
修正とリファクタリング
グリーン
- テストが成功するように修正
Dollar.java
public class Dollar {
int amount = 5 * 2;
Dollar(int amount){}
void times(int multiplier){}
}
リファクタリング
- リファクタリングで実装していく
Dollar.java
public class Dollar {
int amount;
Dollar(int amount){
this.amount = amount;
}
void times(int multiplier){
amount *= multiplier;
}
}
この章で行ったこと
必要なテストのリストを作成
スタブを作成し、テストをコンパイルした
まずテストをパスするようなコードを書いた
リファクタリングした
Part 1-2
TDDのサイクル、詳細
テストの作成: 操作、ストーリーから必要なインターフェースを考える
すべてのテストを実行し、失敗を確認する
小さな修正を行う
テストをパスさせる: バーをグリーンにすることが主となる
リファクタリングを行う: 動作するきれいなコードを目指す
Dollarの副作用への対応
- こういうテストをパスさせたい
DollarTest.java
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
five.times(3);
assertEquals(15, five.amount); // 30が返ってきてしまう
}
- テスト自体の変更
DollarTest.java
public void testMultiplication() {
Dollar five = new Dollar(5);
Dollar product = five.times(2); // times修正必要
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}
- Dollarのコンパイルを通す(仮実装)
Dollar.java
Dollar times(int multiplier){
amount *= multiplier;
return null;
}
- Dollarの修正(明白な実装)
Dollar.java
Dollar times(int multiplier){
return new Dollar (amount * multiplier);
}
仮実装と明白な実装
- 仮実装:定数を返しておき、定数を変数で徐々に置き換えてゆく
- 明白な実装:実際の実装
この章で行ったこと
設計上の難点(副作用)をテストケースに変換した
仮実装でコンパイルを通す
リファクタリングしてテストを通す
source
DollarTest.java
public class DollarTest {
@Test
public void testMultiplication(){
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10,product.amount);
product = five.times(3);
assertEquals(15,product.amount);
}
}
Dollar.java
class Dollar {
int amount;
Dollar(int amount){
this.amount = amount;
}
Dollar times(int multiplier){
return new Dollar(amount * multiplier);
}
}