テスト駆動開発(TDD)を学ぶ
はじめまして。
わたしのコラムでは、ITスキルの中でもソフトウェアの開発技術に関することを扱います。ソフトウェア開発といっても、JavaやRuby等のプログラム言語、.NETやJ2EEなどの実装環境、Strutsなどのフレームワーク、さらに設計や開発手順等があります。この中でも、設計や開発手順などの基本的なスキルで、変動が少ないものについての議論をしていきます。
これらの技術の中で、わたしの専門としている領域を以下のように分類してみました。
- ソフトウェア開発
- テスト駆動開発
- リファクタリング
- ソフトウェア設計
- UMLモデリング
- デザインパターン
- 分析スキル
- ビジネスプロセス(UMLモデリング)
- ビジネスエンティティ(UMLモデリング)
- アーキテクチャ設計
- アーキテクチャパターン
- 開発プロセス
- イテレーティブ(繰り返し型プロセス)
- XP(アジャイルプロセス)
- スクラム(アジャイルプロセス)
■エンジニアの化石になるな!
ソフトウェア開発とは、プログラムを作るにあたってのスキルです。例えば、Javaのプログラムを作るのにオブジェクト指向を知らなくて、COBOLのような手続型のコードを書いていては、この時代にプログラム開発ができるスキルを持っているとはいえません。ただ、一般的にオブジェクト指向の利点を生かしたプログラム開発を開発現場では行っていないことが多いのです。それは、SEと名乗る設計者がオブジェクト指向を理解しておらず、10年以上前のVB+Oracleのような開発環境でしかプログラム開発をしたことがないことが原因だったりします。
このような時代遅れの開発しかやっていなかったら、エンジニアはどうなってしまうでしょうか。SEと名乗る設計者は管理者となり、プロジェクトの線引きだけをやるようになれば、何とか自分の将来の仕事はあり、逃げ切れるかもしれません。しかし、この時点でプログラム開発者であるエンジニアには、未来はありません。オブジェクト指向しか見たことがない新しい世代のエンジニアがあふれてきて、それを知らないエンジニアは化石になってしまいます。
それでは、化石にならないためには、何をすれば良いのでしょうか?
いくら現場のプロジェクトでプログラムを作っても無駄です。必要最小限の技術を勉強して習得すれば良いのです。そして、実践したくなったら、実践できる社内のプロジェクト、もしくは他の会社に移りましょう。学習と経験を積めば、立派なエンジニアになります。
ソフトウェア開発の中でも、オブジェクト指向技術は理解したとしましょう。たいていJavaやC++の入門書に、クラスだの継承だのという基本的なことは書いてあります。もし、知らない人がいたら、オブジェクト指向入門をインターネットで検索して、理解しておきましょう。簡単なプログラムを書き写して動かしてみれば、理解できるはずです。読んだだけで終わらせないでください。実際にやってみないと習得はできませんよ。これで、オブジェクト指向でプログラムを作ることはできるようになりましたね。
■最新の開発環境を使え!
次に必要なことは、プログラムをどのように作れば良いかということです。その前に、ソフトウェア開発環境の話をしなければいけません。もったいぶっていますが、単純にツールを使って、プログラムを作りましょうといっているだけです。一般的なオープンソースの開発環境をここでは紹介します。
それは、Eclipseです。Eclipseはオープンソースで無料で手に入り、Java、C++、Rubyなどの多くのプログラム言語に対応しています。さらに、これから説明していく開発技術にも対応しています。勉強するにはもってこいで、実際の多くのプロジェクトでも使われています。
※クリックで拡大
■プログラムを作る前にまずはToDo
プログラムを作るときに、皆さんははじめに何をしますか? メインクラスを書きますか。そうではありません。どんな機能がプログラムに必要なのかを考えるのです。頭の中で考えているだけだと忘れてしまうので、リストアップしましょう。それをToDoリストといいます。
<<ToDoリストの例>>
- 会社名を参照できる
- 従業員数を得る
- 従業員を増やす
- 会社を買収する
- 会社を移転する
■最新のプログラミングテクはこうだ!
次に、ToDoリストの1番目をプログラムにしていきます。
プログラムにするときには、プログラムを動くようにしないといけないので、ToDoリストの1番目の機能を満たすテストを作ります。ここでは、ToDoリストの1番目の項目は「会社名を参照できる」なので、会社名を得るテストを考えます。
そうすると、オブジェクトcmpをCompanyクラスから生成して、そのオブジェクトの会社名に"A trading"をセットします。そのオブジェクトの会社名がきちんとセットされたかどうかを確かめる比較(assertEquals)を行います。たったこれだけですが、オブジェクトの生成についての確認を行います。
@Test public void compareName() |
ToDoリストの2つ目は、計算機能です。オブジェクトには計算機能があります。その計算機能を使って、答えが合っているかを確認します。これも、1つ目と同じようにテストを作成して、その後に、実際の処理ロジックを書きます。それは、次のようになります。ここでは、Companyクラスの処理までは示しませんが、従業員数をセットするメソッドとゲットするメソッドを作りました。
@Test public void compareEmpNumber() |
■TDDテスト駆動開発を行なえ!
このように、必要な機能をリストアップして、それに基づいてテストを作成して、そのテストがきちんと動作する処理ロジックを書いていく、このようなプログラム開発方法をテスト駆動開発(Test-driven Development)、略してTDDと呼びます。この方法は、米国や欧州では主流となってきているシステム開発プロセスのアジャイル開発プロセスで使われています。開発プロセスとか方法論というと、なんだか難しそうですが、実際に見て、やってみると、思ったより難しくないことがわかります。このTDDを使って、プログラムを1つ作ってください。内容は、計算でも、文字列を表示することでも、何でもかまいません。実際にやってみることで習得して行くのです。
今回はソフトウェア開発スキルのテスト駆動開発のとっかかりを説明しました。次回は、TDDによるプログラム作成をもう少し掘り下げていきます。