Prev Next

第7章 テストの構成

PHPUnit の目指すところ (第 2 章 を参照ください) のひとつに 「自由に組み合わせられる」ということがあります。つまり、 例えば「そのプロジェクトのすべてのテストを実行する」「プロジェクトの中の ある部品を構成するすべてのクラスについて、すべてのテストを実行する」 「特定のひとつのクラスのテストのみを実行する」など、 数や組み合わせにとらわれずに好きなテストを一緒に実行できるということです。

PHPUnit フレームワークの PHPUnit_Framework_TestSuite クラスを使用すると、複数のテストを階層構造でテストスイートにまとめることができます。 実際の例として、PHPUnit 自身のテストスイートを見てみましょう。

例 7.1Tests/AllTests.php の一部を抜粋したもの、そして 例 7.2Tests/Framework/AllTests.php の一部を抜粋したものです。

例 7.1: AllTests クラス

<?php
require_once 'PHPUnit/Framework.php';

require_once 'Framework/AllTests.php';
// ...

class AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('PHPUnit');

$suite->addTest(Framework_AllTests::suite());
// ...

return $suite;
}
}
?>

例 7.2: Framework_AllTests クラス

<?php
require_once 'PHPUnit/Framework.php';

require_once 'Framework/AssertTest.php';
// ...

class Framework_AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('PHPUnit Framework');

$suite->addTestSuite('Framework_AssertTest');
// ...

return $suite;
}
}
?>

Framework_AssertTest クラスは、 基底クラス PHPUnit_Framework_TestCase を継承した標準的なテストケースクラスです。

  • phpunit AllTestsTests ディレクトリで実行すると、すべてのテストを実行します。

  • phpunit Framework_AllTests AllTests.phpTests/Framework ディレクトリで実行すると、 PHPUnit_Framework_* クラスのテストのみを実行します。

  • phpunit Framework_AssertTest AssertTest.phpTests/Framework ディレクトリで実行すると、 PHPUnit_Framework_Assert クラスのテストのみを実行します。

  • phpunit --filter testFail Framework_AssertTest AssertTest.phpTests/Framework ディレクトリで実行すると、 Framework_AssertTest クラスの testFail という名前のテストのみを実行します。

スイートレベルのセットアップ

PHPUnit_Framework_TestSuite クラスには、 ふたつのテンプレートメソッド setUp() および tearDown() が存在します。 これらはそれぞれ、テストスイートの最初のテストの実行前と テストスイートの最後のテストの実行後にコールされます。

例 7.3: MySuite クラス

<?php
require_once 'MyTest.php';

class MySuite extends PHPUnit_Framework_TestSuite
{
public static function suite()
{
return new MySuite('MyTest');
}

protected function setUp()
{
print "\nMySuite::setUp()";
}

protected function tearDown()
{
print "\nMySuite::tearDown()";
}
}
?>

例 7.3 のテストスイート MySuite に追加されたテストケースクラス MyTest には、ふたつのテストメソッド testOne()testTwo() のほかに setUp() メソッドと tearDown() メソッドが定義されているものとします。 この出力を見れば、これら 8 つのメソッドがどの順にコールされるのかがわかります。

MySuite::setUp()
MyTest::setUp()
MyTest::testOne()
MyTest::tearDown()
MyTest::setUp()
MyTest::testTwo()
MyTest::tearDown()
MySuite::tearDown()

PHPUnit_Framework_TestSuite クラスの setUp() メソッドで $this->sharedFixture に保存した変数は、 テストスイートオブジェクトに登録したすべてのテストから $this->sharedFixture でアクセスできます (「Fixture の共有」 を参照ください)。

TestSuitesetUp() および tearDown() メソッドは、 (たとえばフィルタリングなどの結果として) テストスイート内のテストが実行されなかった場合でもコールされることに注意しましょう。

Prev Next
1. 自動テスト
2. PHPUnit の目標
3. PHPUnit のインストール
4. PHPUnit 用のテストの書き方
データプロバイダ
例外のテスト
PHP のエラーのテスト
5. コマンドラインのテストランナー
6. Fixtures
tearDown() よりも setUp()
バリエーション
Fixture の共有
7. テストの構成
スイートレベルのセットアップ
8. テストケースの拡張
出力内容のテスト
パフォーマンス低下のテスト
9. データベースのテスト
データセット
Flat XML データセット
XML データセット
操作
データベースのテストのコツ
10. 不完全なテスト・テストの省略
不完全なテスト
テストの省略
11. モックオブジェクト
自己シャント
スタブ
12. テストの進め方
開発中のテスト
デバッグ中のテスト
13. テストファーストプログラミング
銀行口座の例
14. コードカバレッジ解析
カバーするメソッドの指定
コードブロックの無視
ファイルのインクルードや除外
15. テストのその他の使用法
アジャイルな文書作成
複数チームでのテスト
16. ログ出力
XML 形式
コードカバレッジ (XML)
JavaScript Object Notation (JSON)
Test Anything Protocol (TAP)
GraphViz マークアップ
テストデータベース
17. 雛形ジェネレータ
アノテーション
18. PHPUnit と Selenium
Selenium RC
PHPUnit_Extensions_SeleniumTestCase
19. 継続的インテグレーション
CruiseControl
phpUnderControl
Apache Maven
20. PHPUnit の実装
21. PHPUnit API
概要
PHPUnit_Framework_Assert
PHPUnit_Framework_Test
PHPUnit_Framework_TestCase
PHPUnit_Framework_TestSuite
PHPUnit_Framework_TestResult
パッケージの構成
22. PHPUnit の拡張
PHPUnit_Framework_TestCase のサブクラスの作成
アサートクラスの作成
PHPUnit_Extensions_TestDecorator のサブクラスの作成
PHPUnit_Framework_Test の実装
PHPUnit_Framework_TestResult のサブクラスの作成
PHPUnit_Framework_TestListener の実装
新しいテストランナーの作成
A. アサーション
B. XML 設定ファイル
テストスイート
グループ
コードカバレッジ対象のファイルの追加や除外
ログ出力
PMD ルール
PHP INI 項目やグローバル変数の設定
C. PHP 4 用の PHPUnit
D. 目次
E. 参考文献
F. 著作権