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 ログファイルは、テストケースクラス FailureErrorTest
の testFailure および 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 SamplePHPUnit 2.3.0 by Sebastian Bergmann. Wrote test class skeleton for Sample to SampleTest.php.phpunit SampleTestPHPUnit 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 インタプリタのサンドボックス環境を使用することでこの問題を解決する予定です。