TestCase

単純なテストでは、アサーションを次々に続けることができます。しかし、時にはアサーションをテストクラスにラップして構造化する方が有利な場合があります。

クラスは Tester\TestCase の子孫でなければならず、簡単に testcase と呼ばれます。クラスには test で始まるテストメソッドが含まれている必要があります。これらのメソッドはテストとして実行されます。

use Tester\Assert;

class RectangleTest extends Tester\TestCase
{
	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# テストメソッドの実行
(new RectangleTest)->run();

このように書かれたテストは、メソッド setUp()tearDown() でさらに強化できます。これらは、各テストメソッドの前後にそれぞれ呼び出されます。

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# 準備
	}

	public function tearDown()
	{
		# クリーンアップ
	}

	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# テストメソッドの実行
(new NextTest)->run();

/*


メソッド呼び出し順序
----------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

setUp() または tearDown() フェーズでエラーが発生した場合、テストは全体として失敗します。テストメソッドでエラーが発生した場合でも、tearDown() メソッドは実行されますが、その中のエラーは抑制されます。

テストの開始時に @testCase アノテーションを記述することをお勧めします。そうすれば、コマンドラインテストランナーは testcase の個々のメソッドを個別のプロセスで並行して複数のスレッドで実行します。これにより、テストプロセス全体が大幅に高速化される可能性があります。

<?php
/** @testCase */

メソッドアノテーション

テストメソッドには、テストを容易にするいくつかのアノテーションがあります。これらはテストメソッドに記述します。

@throws

これは、テストメソッド内で Assert::exception() を使用することと同等です。ただし、記述はより明確です。

/**
 * @throws RuntimeException
 */
public function testOne()
{
	// ...
}


/**
 * @throws LogicException  Wrong argument order
 */
public function testTwo()
{
	// ...
}

@dataProvider

テストメソッドを複数回実行したいが、異なるパラメータで実行したい場合、このアノテーションが役立ちます。(ファイル の同名のアノテーションと混同しないでください。)

その後に、テストメソッドの引数を返すメソッドの名前を指定します。メソッドは配列または Traversable を返す必要があります。簡単な例:

public function getLoopArgs()
{
	return [
		[1, 2, 3],
		[4, 5, 6],
		[7, 8, 9],
	];
}


/**
 * @dataProvider getLoopArgs
 */
public function testLoop($a, $b, $c)
{
	// ...
}

2 番目の @dataProvider アノテーションのバリアントは、パラメータとして INI ファイルへのパス(テストファイルからの相対パス)を受け入れます。メソッドは、INI ファイル内のセクションの数だけ呼び出されます。ファイル loop-args.ini

[one]
a=1
b=2
c=3

[two]
a=4
b=5
c=6

[three]
a=7
b=8
c=9

そして、INI ファイルを使用するメソッド:

/**
 * @dataProvider loop-args.ini
 */
public function testLoop($a, $b, $c)
{
	// ...
}

同様に、INI ファイルの代わりに PHP スクリプトを参照できます。これは配列または Traversable を返す必要があります。ファイル loop-args.php

return [
	['a' => 1, 'b' => 2, 'c' => 3],
	['a' => 4, 'b' => 5, 'c' => 6],
	['a' => 7, 'b' => 8, 'c' => 9],
];