第4章 コマンドラインのテストランナー

phpunit コマンドを実行すると、PHPUnit のコマンドライン版テストランナーが起動します。 コマンドラインのテストランナーを使用したテストの様子を以下に示します。

phpunit ArrayTest
PHPUnit 2.3.0 by Sebastian Bergmann.

..

Time: 0.067288

OK (2 tests)

テストがひとつ実行されるたびに、PHPUnit コマンドラインツールはその経過を示す文字を出力します。

.

テストが成功した際に表示されます。

F

テストメソッドの実行中、アサーションに失敗した際に表示されます。

E

テストメソッドの実行中、エラーが発生した際に表示されます。

I

テストが「不完全」あるいは「未実装」とマークされている場合に表示されます (7章不完全なテスト を参照ください)。

PHPUnit は、失敗 (failures)エラー (errors) を区別します。 「失敗」は PHPUnit のアサーションに違反した場合で、 「エラー」は予期せぬ例外や PHP のエラーが発生した場合となります。 この区別は、時に有用です。というのは、「エラー」は一般的に「失敗」 より修正しやすい傾向があるからです。 もし大量の問題が発生した場合は、まず「エラー」を最初に片付け、 その後で「失敗」を修正していくのが最良の方法です。

以下のコードで、コマンドライン版テストランナーのスイッチの一覧を見てみましょう。

phpunit --help
PHPUnit 2.3.0 by Sebastian Bergmann.

Usage: phpunit [switches] UnitTest [UnitTest.php]
  --coverage-data <file> Write Code Coverage data in raw format to file.
  --coverage-html <file> Write Code Coverage data in HTML format to file.
  --coverage-text <file> Write Code Coverage data in text format to file.

  --testdox-html <file>  Write agile documentation in HTML format to file.
  --testdox-text <file>  Write agile documentation in Text format to file.
  --log-xml <file>       Log test progress in XML format to file.

  --loader <loader>      TestSuiteLoader implementation to use.

  --skeleton             Generate skeleton UnitTest class for Unit in Unit.php.

  --wait                 Waits for a keystroke after each test.

  --help                 Prints this usage information.
  --version              Prints the version and exits.
phpunit UnitTest

UnitTest という名前のクラスで定義されている テストを実行します。このクラスは、UnitTest.php という名前のファイルの中に定義されているものとします。

UnitTest は、PHPUnit2_Framework_TestCase を継承したクラスであるか、あるいは PHPUnit2_Framework_Test オブジェクト、例えば PHPUnit2_Framework_TestSuite のインスタンスを返す public static suite() というメソッドを保持するクラスでなければなりません。

phpunit UnitTest UnitTest.php

UnitTest という名前のクラスで定義されているテストを実行します。 このクラスは、指定したファイルの中で定義されているものとします。

--coverage-data--coverage-html および --coverage-text

実行したテストについてのコードカバレッジ情報の収集・解析を制御します (9章コードカバレッジ解析 を参照ください)。

--testdox-html および --testdox-text

実行したテストについて、HTML あるいはプレーンテキスト形式のドキュメントを生成します (11章テストのその他の使用法 を参照ください)。

--log-xml

テストの実行結果を XML 形式のログファイルに出力します。

以下に、ArrayTest のテストによって生成された XML ログファイルの例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="ArrayTest" tests="2" failures="0" errors="0" time="0.020026">
    <testcase name="testNewArrayIsEmpty" class="ArrayTest" time="0.014449"/>
    <testcase name="testArrayContainsAnElement" class="ArrayTest" time="0.005577"/>
  </testsuite>
</testsuites>

この XML ログファイルは、テストケースクラス FailureErrorTesttestFailure および testError という 2 つのテストによって生成されたもので、 失敗とエラーが発生したことを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="FailureErrorTest" tests="2" failures="1" errors="1" time="0.013603">
    <testcase name="testFailure" class="FailureErrorTest" time="0.011872">
      <failure message="" type="PHPUnit2_Framework_AssertionFailedError"></failure>
    </testcase>
    <testcase name="testError" class="FailureErrorTest" time="0.001731">
      <error message="" type="Exception"></error>
    </testcase>
  </testsuite>
</testsuites>
--loader

PHPUnit2_Runner_TestSuiteLoader を実装したクラスのうち、 実際に使用するものを指定します。

標準のテストスイートローダーは、現在の作業ディレクトリおよび PHP の設定項目 include_path で指定されているディレクトリからソースファイルを探します。 PEAR の命名規則に従い、Project_Package_Class クラスがソースファイル Project/Package/Class.php に対応します。

--skeleton

(UnitTest.php に記述された) Unit クラスに対して、テストケースクラス UnitTest の雛形を記述したファイル UnitTest.php を作成します。 作成されたテストケースクラスの中のテストケースは、不完全な状態です (7章不完全なテスト を参照ください)。

以下に、Sample クラスをテストするクラスの雛形を作成する例を示します。

phpunit --skeleton Sample
PHPUnit 2.3.0 by Sebastian Bergmann.

Wrote test class skeleton for Sample to SampleTest.php.

phpunit SampleTest
PHPUnit 2.3.0 by Sebastian Bergmann.

I

Time: 0.007268
There was 1 incomplete test case:
1) testSampleMethod(SampleTest)


OK, but incomplete test cases!!!
Tests run: 1, incomplete test cases: 1.

既存のコードのテストを記述する際は、 以下のようなコードを何度となく繰り返し記述することになるでしょう。

public function testSampleMethod() {
}

PHPUnit は、既存のコードを解析して テストケースクラスの雛形にそれらを記述します。

--wait

各テストが終了するたびにキー入力待ちの状態になります。これは、 テストランナーが終了すると同時にウィンドウが閉じてしまうような場合に便利です。

注意

テストしようとしているコードに PHP の文法エラーがあった場合は、 コマンドラインのテストランナーは何もエラー情報を表示せずに終了します。 標準のテストスイートローダーは、テストスイート自体のソースファイルについては PHP の文法チェックをしますが、テストスイートが include しているその他のファイルについてはチェックしません。将来のバージョンでは、 PHP インタプリタのサンドボックス環境を使用することでこの問題を解決する予定です。