開発の全工程の中で、あまり人気がないのがテスト工程だ。ソフトウェアの品質を証明するためのテストは、なぜ低く見られてしまうのか(編集部)
第1回「ユニットテストはなぜ必要なの?」では、ユニットテストの必要性を解説しました。今回は実際にテスティングフレームワークを使用して、テスト駆動開発を進め、その必要性と重要性を体験してみましょう。
ユニットテストを自動化するためのテスティングフレームワークは多くの言語で提供されており、JavaのJUnitや、Visual BasicのVBUnit、RubyのRubyUnit、PerlのPerlUnitなど、言語名を接頭辞にした「〜Unit」という名称のテスティングフレームワークが主流です。これらはたまたま名前が似ているというわけではなく、最初のユニットテストツールであるSmallTalk用のSUnitが基になっています。
これらは総称してxUnitと呼ばれ、ユニットテストの組み立て方やテストの要素などがSUnitから受け継がれています。つまり、言語が違っても、xUnitを使用することで、ある程度同じ水準でのテストが可能になるというわけです。
今回はPHP版xUnitであるPHPUnitを使ってユニットテストを作成します。PHPUnitもその名のとおりxUnitの特徴を踏襲したもので、ほかの言語でxUnitを使用したことがあれば違和感なく使えます。
PHPUnitはSebastian Bergmann氏によって開発され、www.phpunit.deから直接ダウンロード可能ですが、PEARチャンネルも用意されているので、pearコマンドによるリモートインストールが手軽でおすすめです。
まず、PHPUnitのチャンネルサーバ(pear.phpunit.de)をローカルのPEARシステムに登録します。channel-discoverオプションの後にチャンネルサーバのURLを入力します。
# pear channel-discover pear.phpunit.de [Enter]
Adding Channel "pear.phpunit.de" succeeded Discovery of channel "pear.phpunit.de" succeeded
次に、登録したチャンネル経由でPHPUnitパッケージをインストールします。pearコマンドにinstallオプションを付けて実行します。
# pear install phpunit/PHPUnit [Enter]
downloading PHPUnit-3.4.1.tgz ... Starting to download PHPUnit-3.4.1.tgz ... .....................done: 326,659 bytes install ok: channel://pear.phpunit.de/PHPUnit-3.4.1
インストールバージョンにより、PEAR本体のバージョン依存や、使用する機能によってはほかのパッケージが必要な場合がありますので、適宜環境を整えてください。
# pear upgrade PEAR [Enter]
# pear install --alldeps phpunit/PHPUnit [Enter]
インストールが成功すれば、ライブラリファイルがPEAR環境のPHPディレクトリに、また、phpunitコマンドがPEAR環境のBINディレクトリにコピーされます。それぞれ、以下のコマンドでディレクトリパスを確認できます。
# pear config-show | grep php_dir [Enter]
PEAR directory php_dir /usr/share/pear
# pear config-show | grep php_dir [Enter]
PEAR executables directory bin_dir /usr/bin/
PHPディレクトリのパスはPHPの設定ファイルphp.iniで、include_pathに追加しておくと、いちいちフルパスで書く必要がなくなります。同様にBINディレクトリもシステムのPATH変数に追加しておけば、コマンドをフルパスで呼び出す必要がなくなります。
正しくインストールが完了しているかどうかを確認するため、phpunitコマンドを引数なしで実行してみましょう。以下のようにコマンドヘルプが表示されていれば問題ありません。
% phpunit [Enter]
PHPUnit 3.4.1 by Sebastian Bergmann. Usage:phpunit [switches] UnitTest [UnitTest.php] phpunit [switches] (以下、省略)
xUnitでのテストの実体はテストケースと呼ばれる1つのクラスです。1つのテストケースには、複数のテストメソッドを定義し、そのテストメソッドの中に、いくつかのアサーションとよばれる比較処理を記述します。
PHPUnitではテストケースの基底クラスとして、「PHPUnit_Framework_TestCase」というクラスが用意されています。テストケースを作成する際は必ずこれを継承しなければなりません。
また、テストケース内に記述したテストメソッドはPHPUnitが自動で実行してくれるので直接テストメソッドを呼び出す必要はありません。ただし、関連するすべてのクラスの中から、自動実行させるべきテストケースのクラスを見つけ出させるために、次のいくつかのルールに沿って作成する必要があります。
まず、テストケースは原則として1つのクラスに対して1つ作成します。テストするクラス名の末尾に「Test」という文字列を付与したものがテストケース名となりクラス名として定義します。
また、ファイル名もテストケース名と同じでなければなりません。例えば、Employeeクラスをテストする場合のテストケースクラス名はEmployeeTestとし、ファイル名をEmployeeTest.phpとします。
ルール1:テストケースクラス名は「[テストするクラス名]Test」とする
ルール2:ファイル名は「[テストケースクラス名].php」とする
次に、テストメソッドにも命名規則があります。テストケース内にはテストメソッド以外にも、テストの実行に必要なメソッドを自由に定義できますので、テストとして実行すべきメソッドとそうでないメソッドを、命名規則によって明確にする必要があります。
テストメソッドの命名規則は文字列「test」を接頭辞とすればよく、その後に続く文字列は任意でかまいません。ただし、何のテストであるかをメソッド名だけで認識できるように、メソッド名を自然言語で簡潔に命名にすることが推奨されています。
ルール3:テストメソッドの名称は「test」で始まる文字列で、テスト内容が明確に判断できる名称にする
例)testAddEmployeesFromObject()
testFetchObjectWithFilter()
testRemoveAllObjects()
Copyright © ITmedia, Inc. All Rights Reserved.