| Prev | Next |
PHPUnit の目指すところ (第 2 章 を参照ください) のひとつに 「自由に組み合わせられる」ということがあります。つまり、 例えば「そのプロジェクトのすべてのテストを実行する」「プロジェクトの中の ある部品を構成するすべてのクラスについて、すべてのテストを実行する」 「特定のひとつのクラスのテストのみを実行する」など、 数や組み合わせにとらわれずに好きなテストを一緒に実行できるということです。
PHPUnit では、さまざまな方法でテストを組み合わせてテストスイートにまとめることができます。 本章では、その中でもよく使われる手法を説明します。
おそらく、テストスイートをとりまとめるもっとも簡単な方法は すべてのテストケースのソースファイルを一つのテストディレクトリにまとめることでしょう。 PHPUnit はテストディレクトリを再帰的に探索し、 テストを自動的に見つけて実行します。
Object_Freezer ライブラリのテストスイートを見てみましょう。このプロジェクトのディレクトリ構成を見ると、 テストケースクラスが Tests ディレクトリにまとめられていることがわかります。 その中のディレクトリの構造は、テスト対象のシステム (SUT) がある Object ディレクトリ以下の構造と同じになっています。
Object Tests |-- Freezer |-- Freezer | |-- HashGenerator | |-- HashGenerator | | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php | |-- HashGenerator.php | | | |-- IdGenerator | |-- IdGenerator | | `-- UUID.php | | `-- UUIDTest.php | |-- IdGenerator.php | | | |-- LazyProxy.php | | | |-- Storage | |-- Storage | | `-- CouchDB.php | | `-- CouchDB | | | | |-- WithLazyLoadTest.php | | | | `-- WithoutLazyLoadTest.php | |-- Storage.php | |-- StorageTest.php | `-- Util.php | `-- UtilTest.php `-- Freezer.php `-- FreezerTest.php
PHPUnit のコマンドラインテストランナーに テストディレクトリの場所を指示してやるだけで、 このライブラリのすべてのテストを実行できます。
phpunit Tests
PHPUnit 3.4.14 by Sebastian Bergmann.
............................................................ 60 / 75
...............
Time: 0 seconds
OK (75 tests, 164 assertions)
Tests/FreezerTest.php にあるテストケースクラス Object_FreezerTest で宣言されているテストだけを実行するには、 次のコマンドを実行します。
phpunit Tests/FreezerTest
PHPUnit 3.4.14 by Sebastian Bergmann.
............................
Time: 0 seconds
OK (28 tests, 60 assertions)
実行したいテストをより細かく指示するには --filter スイッチを使います。
phpunit --filter testFreezingAnObjectWorks Tests
PHPUnit 3.4.14 by Sebastian Bergmann.
.
Time: 0 seconds
OK (1 test, 2 assertions)
この方式の欠点は、テストの実行順を制御できないことです。 そのため、テストの依存性に関する問題を引き起こすことがあります。 「テストの依存性」 を参照ください。
PHPUnit の XML 設定ファイル (付録 C) を使ってテストスイートを構成することもできます。 例 7.1 に、最小限の例を示します。これは、 Tests を再帰的に探索して *Test.php というファイルにある *Test クラスをすべて追加する設定です。
例 7.1: XML 設定ファイルを用いたテストスイートの構成
<phpunit>
<testsuites>
<testsuite name="Object_Freezer">
<directory>Tests</directory>
</testsuite>
</testsuites>
</phpunit>
この方式の欠点は、テストの実行順を制御できないことです。 そのため、テストの依存性に関する問題を引き起こすことがあります。 「テストの依存性」 を参照ください。
どのテストを実行するのかを明示的に指定することもできます。
例 7.2: XML 設定ファイルを用いたテストスイートの構成
<phpunit>
<testsuites>
<testsuite name="Object_Freezer">
<file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file>
<file>Tests/Freezer/IdGenerator/UUIDTest.php</file>
<file>Tests/Freezer/UtilTest.php</file>
<file>Tests/FreezerTest.php</file>
<file>Tests/Freezer/StorageTest.php</file>
<file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file>
<file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file>
</testsuite>
</testsuites>
</phpunit>
PHPUnit フレームワークの PHPUnit_Framework_TestSuite クラスを使うと、テストスイートオブジェクトの階層としてテストを管理することができます。
例 7.3 は、Package というパッケージを含むプロジェクトのトップレベルの AllTests クラスの例です。
例 7.3: トップレベルの AllTests クラス
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Package/AllTests.php';
// ...
class AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('Project');
$suite->addTest(Package_AllTests::suite());
// ...
return $suite;
}
}
?>
トップレベルの AllTests クラスがパッケージレベルの Package_AllTests クラスを集約し、 さらにそれがパッケージ内のクラス群のテストケースクラスを集約します。
例 7.4: Package_AllTests クラス
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Framework/ClassTest.php';
// ...
class Package_AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('Package');
$suite->addTestSuite('Package_ClassTest');
// ...
return $suite;
}
}
?>
Package_ClassTest クラスは、 基底クラス PHPUnit_Framework_TestCase を継承した標準的なテストケースクラスです。
phpunit AllTests を Tests ディレクトリで実行すると、すべてのテストを実行します。
phpunit AllTests を Tests/Package ディレクトリで実行すると、 Package_* クラスのテストのみを実行します。
phpunit ClassTest を Tests/Package ディレクトリで実行すると、 Package_Class クラスのテストのみを実行します (これは Package_ClassTest クラスで宣言されています)。
phpunit --filter testSomething ClassTest を Tests/Package ディレクトリで実行すると、 Package_ClassTest クラスの testSomething という名前のテストのみを実行します。
PHPUnit_Framework_TestSuite クラスには二つのテンプレートメソッド setUp() および tearDown() が用意されています。 これらはそれぞれ、テストスイート内の最初のテストを実行する前と 最後のテストを実行した後にコールされます。
例 7.5: MySuite クラス
<?php
require_once 'MyTest.php';
class MySuite extends PHPUnit_Framework_TestSuite
{
public static function suite()
{
return new MySuite('MyTest');
}
protected function setUp()
{
print __METHOD__ . "\n";
}
protected function tearDown()
{
print __METHOD__ . "\n";
}
}
?>
例 7.5 にあるテストスイート MySuite に追加されたテストケースクラス MyTest には、二つのメソッド testOne() および testTwo() があり、さらに setUp() メソッドと tearDown() メソッドもあります。この出力結果を見れば、これらのメソッドがどの順でコールされるかがわかります。
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 の共有」 を参照ください)。
TestSuite の setUp() メソッドと tearDown() メソッドは、 フィルタリングなどによってスイート内のテストがひとつも実行されなかった場合でもコールされます。
| Prev | Next |
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertType()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
Copyright © 2005-2011 Sebastian Bergmann.