| Prev | Next |
アノテーションとはメタデータを表す特別な構文のことで、 プログラミング言語のソースコードに追加することができます。 PHP そのものにはソースコードにアノテーションする専用の仕組みはありませんが、 ドキュメンテーションブロックに @アノテーション名 引数 のようなタグを書くことでアノテーションを表すという記法が PHP コミュニティ内で一般に使われています。 PHP では、リフレクション API の getDocComment() メソッドを使えば関数、クラス、メソッド、属性 それぞれのドキュメンテーションブロックにアクセスすることができます。 PHPUnit などのアプリケーションでは、 この情報をもとに実行時の振る舞いを設定するのです。
本章では、PHPUnit がサポートするすべてのアノテーションについて解説します。
@assert アノテーションをメソッドのドキュメンテーションブロックで使うと、 雛形ジェネレータ (第 17 章 を参照ください) を実行したときに、不完全なテストケースではなく シンプルながらも意味のあるテストを自動生成することができます。
/**
* @assert (0, 0) == 0
*/
public function add($a, $b)
{
return $a + $b;
}
このアノテーションは、次のようなテストコードとなります。
/**
* Generated from @assert (0, 0) == 0.
*/
public function testAdd() {
$o = new Calculator;
$this->assertEquals(0, $o->add(0, 0));
}
@author アノテーションは @group アノテーション (「@group」 を参照ください) のエイリアスで、 テストの作者にもとづいたフィルタリングができるようになります。
グローバル変数の保存や復元を、テストケースクラスのすべてのテストで完全に無効にすることができます。 このように使います。
/**
* @backupGlobals disabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
// ...
}
@backupGlobals アノテーションは、テストメソッドレベルで使うこともできます。 これによって、保存と復元の操作をより細やかに制御できるようになります。
/**
* @backupGlobals disabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @backupGlobals enabled
*/
public function testThatInteractsWithGlobalVariables()
{
// ...
}
}
クラスの静的属性の保存や復元を、テストケースクラスのすべてのテストで完全に無効にすることができます。 このように使います。
/**
* @backupStaticAttributes disabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
// ...
}
@backupStaticAttributes アノテーションは、テストメソッドレベルで使うこともできます。 これによって、保存と復元の操作をより細やかに制御できるようになります。
/**
* @backupStaticAttributes disabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @backupStaticAttributes enabled
*/
public function testThatInteractsWithStaticAttributes()
{
// ...
}
}
@covers アノテーションをテストコードで使うと、 そのテストメソッドがどのメソッドをテストするのかを指定することができます。
/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
これを指定した場合は、指定したメソッドのみのコードカバレッジ情報を考慮することになります。
表 B.1 に @covers アノテーションの構文を示します。
表B.1 カバーするメソッドを指定するためのアノテーション
| アノテーション | 説明 |
|---|---|
@covers ClassName::methodName
|
そのテストメソッドが指定したメソッドをカバーすることを表します。
|
@covers ClassName
|
そのテストメソッドが指定したクラスのすべてのメソッドをカバーすることを表します。
|
@covers ClassName<extended>
|
そのテストメソッドが、指定したクラスとその親クラスおよびインターフェイスのすべてのメソッドをカバーすることを表します。
|
@covers ClassName::<public>
|
そのテストメソッドが、指定したクラスのすべての public メソッドをカバーすることを表します。
|
@covers ClassName::<protected>
|
そのテストメソッドが、指定したクラスのすべての protected メソッドをカバーすることを表します。
|
@covers ClassName::<private>
|
そのテストメソッドが、指定したクラスのすべての private メソッドをカバーすることを表します。
|
@covers ClassName::<!public>
|
そのテストメソッドが、指定したクラスのすべての非 public メソッドをカバーすることを表します。
|
@covers ClassName::<!protected>
|
そのテストメソッドが、指定したクラスのすべての非 protected メソッドをカバーすることを表します。
|
@covers ClassName::<!private>
|
そのテストメソッドが、指定したクラスのすべての非 private メソッドをカバーすることを表します。
|
テストメソッドには任意の引数を渡すことができます。 引数は、データプロバイダメソッド (例 4.4 の provider()) から渡されます。 使用するデータプロバイダメソッドを指定するには @dataProvider アノテーションを使います。
詳細は 「データプロバイダ」 を参照ください。
PHPUnit は、テストメソッド間の依存性の明示的な宣言をサポートしています。 この依存性とは、テストメソッドが実行される順序を定義するものではありません。 プロデューサーがテストフィクスチャを作ってそのインスタンスを返し、 依存するコンシューマーがそれを受け取って利用するというものです。 例 4.2 は、@depends アノテーションを使ってテストメソッドの依存性をあらわす例です。
詳細は 「テストの依存性」 を参照ください。
@expectedExceptionCode アノテーションを @expectedException と組み合わせて使うと、 スローされた例外のエラーコードについてのアサーションが可能となり、 例外をより狭い範囲に特定できるようになります。
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException Exception
* @expectedExceptionCode 20
*/
public function testExceptionHasErrorcode20()
{
throw new Exception('Some Message', 20);
}
}
@expectedExceptionMessage アノテーションは @expectedExceptionCode と似ており、 例外のエラーメッセージに関するアサーションを行います。
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException Exception
* @expectedExceptionMessage Some Message
*/
public function testExceptionHasRightMessage()
{
throw new Exception('Some Message', 20);
}
}
期待するメッセージを、例外メッセージの一部にすることもできます。 これは、特定の名前や渡したパラメータが例外に表示されることを確かめたいけれども 例外メッセージ全体は固定していない場合に便利です。
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException Exception
* @expectedExceptionMessage broken
*/
public function testExceptionHasRightMessage()
{
$param = "broken";
throw new Exception('Invalid parameter "'.$param.'".', 20);
}
}
あるテストを、ひとつあるいは複数のグループに属するものとすることができます。 @group アノテーションをこのように使用します。
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @group specification
*/
public function testSomething()
{
}
/**
* @group regresssion
* @group bug2204
*/
public function testSomethingElse()
{
}
}
特定のグループに属するテストのみを選んで実行するには、 コマンドラインのテストランナーの場合は --group スイッチあるいは --exclude-group スイッチを指定します。XML 設定ファイルの場合は、 それぞれ対応するディレクティブを指定します。
@outputBuffering アノテーションを使うと、PHP の 出力バッファリング をこのように制御することができます。
/**
* @outputBuffering enabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
// ...
}
@outputBuffering アノテーションは、テストメソッドレベルで使うこともできます。 これによって、出力バッファリングをより細やかに制御できるようになります。
/**
* @outputBuffering disabled
*/
class MyTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering enabled
*/
public function testThatPrintsSomething()
{
// ...
}
}
| Prev | Next |
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertEmpty()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertInstanceOf()
assertInternalType()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertStringMatchesFormat()
assertStringMatchesFormatFile()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertType()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
Copyright © 2005-2012 Sebastian Bergmann.