テスト駆動開発入門を読み写経しながらTDDのサイクルを学んだことをメモしておきます。一部アジャイルサムライを読んでメモした箇所もあります。
目次
TDDのサイクル
テスト駆動開発は「レッド」「グリーン」「リファクタリング」のサイクルで回していきます。これは全てのストーリーの受け入れ条件を満たすまで繰り返します。
TDDにおいてまだ存在していなコードのテストを書くのに戸惑いますが、必要なコードがすでにそこにあるかのごとく書くことを意識すると良いみたいです。
レッド
新しいコードを書く前に、まずは失敗するテストコードを書きます。
新しいコードの意図をテストで示します。
グリーン
どんな方法でも良いのでテストが成功するコードを書きます。
素早くバーをグリーンに変えることが最優先になります。
リファクタリング
テストが成功する状態を維持しつつ簡潔・明快なコードにします。
持ち込んだ重複を取り除き、素早くグリーンになるようにします。
TDDのルール
失敗するテストを一つ書くまでは、新しいコードを一切書かない
テストを書くということは、追加しようとしているコードの価値について真剣に考えることになり、そうすることで凝りすぎた解決策に走ることを避けることができます。
ここで大事なのは、本当に必要なコード以外書いてはいけないということです。
危なっかしいところを全てテストする
TDDでは文字通り全てをテストするわけはなく、危なっかしいところを全てテストします。
いかにも壊れてしまいそうな箇所や特定の条件下で特殊な挙動をする箇所がある場合、そうした意図を伝えるためにテストを書きます。
テストを作成する
実際にテスト駆動開発入門を読みながらTDDを学びます。VSCodeにJavaの実行環境を構築し、実際にコードを書いてテストを実行していきます。
まずはテストを作成します。テスト駆動開発入門に則って5ドルを2回回すと10ドルと等しくなることをテストします。
・DollarTest.java
1 2 3 4 5 6 7 8 9 | public class DollarTest { @Test public void testMultiplication() { Dollar five = new Dollar(5); five.times(2); assertEquals(10, five.amount); } } |
失敗することを確認する
テストを作成したら、まだ実装していないので当たり前ですがテストが失敗することを確認します。ここまでがTDDサイクルで言う「レッド」であるという認識です。
テストが通るように実装する
テストを作成し、失敗することを確認したら実際に処理を実装をしていきます。
・Dollar.java
1 2 3 4 5 6 7 8 9 | public class Dollar { int amount; Dollar(int amount) { } void times(int multiplier) { } } |
シンタックス系のエラーはなくなりましたが、テスト結果が正しくありません。期待されている値は10ですが、0となっています。
期待されている値が10になるように実装していきます。
1 2 3 4 5 6 7 8 9 | public class Dollar { int amount = 5 * 2; Dollar(int amount) { } void times(int multiplier) { } } |
テストが通りました。ここまでがTDDサイクルで言う「グリーン」であるという認識です。
リファクタリングする
テストが成功したといえど、amountの初期値を10にしているため引数の値が変わればテストが失敗します。そのため、どんな値でも対応できるようにリファクタリングをしていきます。
1 2 3 4 5 6 7 8 9 10 11 | public class Dollar { int amount; Dollar(int amount) { this.amount = amount; } void times(int multiplier) { amount *= multiplier; } } |
リファクタリングをしたら再度テストを実行し、テストが成功することを確認します。