ユニットテストでコードをテストする方法はわかりました。でも、 テストそのものをテストするにはどうしたらいいのでしょう? テストされていないコードを見つけるには? 言い換えれば、まだテストで カバーされていない部分を見つけるには? 完全にテストができたことをどうやって確認するの? これらのすべての疑問に対する答えとなるのが、コードカバレッジ解析という手法です。 コードカバレッジ解析を行うと、 コードのどの部分がテストされたのかを調べることができるようになります。
PHPUnit のコードカバレッジ解析では、Xdebug 拡張モジュールが提供するステートメントカバレッジ機能を利用しています。 ステートメントカバレッジというのは、たとえば 100 行のコードで構成されるメソッドがあった場合に、 もしテストで実際に実行されたのがそのうちの 75 行だけだったなら、 そのメソッドのコードカバレッジは 75 パーセントだと考えるということです。
図9.1「テストで完全にカバーできていない BankAccount クラス」
は、BankAccount クラス
(例8.3「完全な BankAccount クラス」
を参照ください) のコードカバレッジレポートを、PHPUnit
のコマンドライン版テストランナーで --coverage-html
を指定することによって HTML 形式で出力したものです。実行可能な行は黒、
実行可能でない行はグレーで表示されており、実際に実行された行が強調表示されています。
このコードカバレッジレポートからわかることは、テストを完璧にするには
setBalance()、depositMoney()
および withdrawMoney()
に正当な値を渡した場合のテストを追加する必要があるということです。
BankAccountTest クラスに追加すべきテストを
例9.1「テストで完全にカバーされている BankAccount クラス」
に示します。これによって、BankAccount
クラスのテストケースを完全に網羅できるようになります。
例9.1 テストで完全にカバーされている BankAccount クラス
<?php
require_once 'PHPUnit2/Framework/TestCase.php';
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit2_Framework_TestCase {
// ...
public function testSetBalance() {
$this->ba->setBalance(1);
$this->assertEquals(1, $this->ba->getBalance());
}
public function testDepositAndWidthdrawMoney() {
$this->ba->depositMoney(1);
$this->assertEquals(1, $this->ba->getBalance());
$this->ba->withdrawMoney(1);
$this->assertEquals(0, $this->ba->getBalance());
}
}
?>
図9.2「完全にテストでカバーされた BankAccount クラス」
を見ると、BankAccount
クラスのコードが完全にテストされていることがわかります。
Phing を使用してより詳細なコードカバレッジレポートを生成する方法を、 12章PHPUnit と Phing で説明します。