フェイクで素早くプログラムを動かせ
前回はTDDのプログラミングを実演しました。今回はいよいよ、TDDで作成したプログラムを動かします。単純に動かすだけなら、Eclipseの実行ボタンを押すだけです。TDDでは、はじめにJUnitのステータスバーをグリーンにするため、とにかく動かすだけに専念します。次に、仮の実装になっているロジック部分に、きちんとしたコードを入れていきます。今回は、コードをきちんとしていく方法を見ていきます。
TDDのプログラミングでは、テスト作成→フェイクで仮実装→きちんと実装→リファクタリング、という順番になります。これをリズムよく、素早くプログラミングしていきます。
それでは、前回のテストコードを見てみます。Companyオブジェクトを"A trading"という名前で生成して、アサーションできちんと名前が入っているかを確認しています。
public class CompositeTest { @Test public void CmpName() |
<<プログラムリスト>>
エラーはなくなったので、Eclipseの実行ボタンを押してみます。
<<画面ショット1>>
JUnitのステータスバーはレッドで失敗しました。
Companyクラス、すなわちスーパークラスのPartyクラスのgetName()は、return "";となっていて、空文字列を返しているだけなので、会社名は入っていません。そのため、"A trading"と比較しても、マッチしないのです。アサーションが失敗になったので、JUnitのステータスバーはレッドになりました。また、その下のウィンドウの失敗の内容を見てみると、"A trading"を期待したけど、""だったと表示されています。
TDDでは、この状況で失敗をなくすために、次のように考えます。まずは、ステータスバーをグリーンにです。そのためには、getName()で返す値を"A trading"にしてしまいます。今までのプログラミング常識では考えられないようなことをするのです。
public class Party { public String getName() { } |
<<プログラムリスト>>
getNameで、"A trading"を返してしまっているので、もちろんステータスバーはグリーンになりました。
<<画面ショット2>>
次に、別のテストを考えます。さっきのテストは、"A trading"だったので、今度は"B trading"と比較してみます。
@Test public void CmpNameOther() |
<<プログラムリスト>>
それでは、このテストコードを実行してみます。
<<画面ショット3>>
テストは2つなので、ステータスバーの上に、「実行:2/2 エラー:0 失敗:1」と表示されています。すなわち、"B trading"のテストが失敗しました。下のウィンドウの失敗の内容を見てみると、"B trading"を期待したけど、"A trading"だったと表示されています。
それでは、この失敗をなくすためには、どうすればよいでしょうか。それは、Companyオブジェクトを生成するコンストラクターを定義して、その中で会社名を保存します。getName()では、保存してある会社名を返すようにします。
修正していく過程で、Eclipseのお助け機能により、前回、自動的に挿入されたコメントを削除しました。
<<画面ショット4>>
Patyクラスのコードです。
public class Party { String _name; } |
<<プログラムリスト>>
ところが、このままでは、Companyクラスのコンストラクターがないというエラーが消えません。これを消すために、Companyクラスにコンストラクターを定義します。
public class Company extends Party { |
<<プログラムリスト>>
それでは、再度、実行ボタンを押します。
<<画面ショット5>>
このように、ステータスバーがグリーンになり、2つのテストが成功しました。ここまでで、Companyオブジェクト生成に関するテストができました。
TDDの基本は、このようなフェイクを使って、プログラムを動かし、テストを追加して、また動かします。この手順で、プログラムを完成に近づけていきます。はじめにすべてのテストを作成して一気に動かした方がよいと思うでしょうが、TDDは常にプログラムが動くことを確認しながら、機能を追加していきます。TDDをしていくと、いつでもプログラムが動作していて、プログラムのバグを取るために四苦八苦する必要もありません。もちろんチームで開発しているときに、みんなで開発しているコードは常に動作します。
これが、最新のプログラミングテクニックです。TDDをマスターすることにより、みなさんも、高速開発ができるエンジニアになりましょう。TDDは、ひとつのソフトウェアエンジニアリング革命と言えるかもしれません。
次回は、プログラムをさらに進化させるために、機能を追加していきます。