PHPUnit は、テストメソッド間の依存性の明示的な宣言をサポートしています。
この依存性とは、テストメソッドが実行される順序ということではありません。
テストメソッド間の依存関係を明示的に宣言することにより、あるテストメソッドの結果を、それに依存するテストメソッドが受け取り再利用できるというものです。
テスト対象コード
sample.php
<?php
class Sample
{
protected $id;
protected $name;
public function __construct($id, $name)
{
if (is_int($id)) {
$this->id = $id;
$this->name = $name;
} else {
throw new InvalidArgumentException();
}
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
}
- int型のIDにより適正にインスタンス化できることをテストしたい
- int型のIDでない場合は例外が発生することをテストしたい
- 適正にインスタンス化できた場合はID,Nameを取得できることをテストしたい
テストコード
sampleTest.php
<?php
require_once 'Sample.php';
class SampleTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function int型のIDにより適正にインスタンス化できる()
{
$sample = new Sample(1, 'hoge');
$this->assertInstanceOf('Sample', $sample);
return $sample;
}
/**
* @test
* @expectedException InvalidArgumentException
*/
public function string型の場合は例外が発生する()
{
new Sample('邪王炎殺黒龍波', '邪王炎殺拳');
}
/**
* @test
* @depends int型のIDにより適正にインスタンス化できる
*/
public function IDを取得できる($sample)
{
$this->assertEquals(1, $sample->getId());
}
/**
* @test
* @depends int型のIDにより適正にインスタンス化できる
*/
public function Nameを取得できる($sample)
{
$this->assertEquals('hoge', $sample->getName());
}
}
このように、@dependsアノテーションを活用することによって、テストメソッド間の依存関係を表現することができます。
今回の例では、あるテストメソッドが生成したインスタンスを使いまわし依存関係にあるテストでインスタンスのプロパティをテストしています。
これにより「インスタンス生成の検証」と「プロパティの検証」を別々に記述できるのでテスト失敗時に問題のアサーションを発見しやすくなります。また、モックオブジェクトを生成せずに、実際のソフトウェアにおける依存関係を忠実に表現したテストがシンプルに作成できます。