ヘルパークラス

DomQuery

Tester\DomQuery は、CSS セレクタを使用して HTML または XML を簡単に検索するために SimpleXMLElement を拡張するクラスです。

# HTML 文字列から DomQuery を作成
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Title</h1>
		<div class="content">Text</div>
	</article>
');

# CSS セレクタを使用して要素の存在をテスト
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# DomQuery オブジェクトの配列として要素を検索
$headings = $dom->find('h1');
Assert::same('Title', (string) $headings[0]);

# 要素がセレクタに一致するかどうかをテスト(バージョン 2.5.3 以降)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# セレクタに一致する最も近い祖先を検索(2.5.5 以降)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

Tester\FileMock はメモリ内でファイルをエミュレートし、fopen()file_get_contents()parse_ini_file() などの関数を使用するコードのテストを容易にします。使用例:

# テスト対象クラス
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

	public function log(string $message): void
	{
		file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
	}
}

# 新しい空のファイル
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Login');
$logger->log('Logout');

# 作成された内容をテスト
Assert::same("Login\nLogout\n", file_get_contents($file));

Assert::with()

これはアサーションではなく、オブジェクトのプライベートメソッドとプロパティをテストするためのヘルパーです。

class Entity
{
	private $enabled;
	// ...
}

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // アクセス可能なプライベート $ent->enabled
});

Helpers::purge()

purge() メソッドは指定されたディレクトリを作成し、すでに存在する場合はその内容全体を削除します。一時ディレクトリを作成するのに役立ちます。たとえば、tests/bootstrap.php で:

@mkdir(__DIR__ . '/tmp');  # @ - ディレクトリはすでに存在する可能性があります

define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);

Environment::lock()

テストは並行して実行されます。ただし、テストの実行が重複しないようにする必要がある場合があります。通常、データベーステストでは、テストがデータベースの内容を準備し、実行中に別のテストがデータベースにアクセスしないようにする必要があります。これらのテストでは、Tester\Environment::lock($name, $dir) を使用します。

Tester\Environment::lock('database', __DIR__ . '/tmp');

最初のパラメータはロックの名前、2 番目はロックを保存するディレクトリへのパスです。最初にロックを取得したテストが実行され、他のテストはその完了を待つ必要があります。

Environment::bypassFinals()

final としてマークされたクラスまたはメソッドはテストが困難です。テストの開始時に Tester\Environment::bypassFinals() を呼び出すと、コードの読み込み中に final キーワードが省略されます。

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass はもはや final ではありません
{
	// ...
}

Environment::setup()

  • エラー出力の可読性を向上させます(色付けを含む)。そうでない場合は、デフォルトの PHP スタックトレースが出力されます。
  • テストでアサーションが呼び出されたかどうかのチェックを有効にします。そうでない場合、アサーションのないテスト(たとえば、忘れられたもの)も合格します。
  • --coverage を使用する場合、実行されたコードに関する情報の収集を自動的に開始します(後述)。
  • スクリプトの最後に OK または FAILURE ステータスを出力します。

Environment::setupFunctions()

テストを構造化できるグローバル関数 test()testException()setUp()tearDown() を作成します。

test('テストの説明', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

テストが直接実行されたか、Tester を介して実行されたかを判断できます。

if (getenv(Tester\Environment::VariableRunner)) {
	# Tester によって実行されました
} else {
	# 他の方法で実行されました
}

Environment::VariableThread

Tester は、指定された数のスレッドでテストを並行して実行します。スレッド番号に関心がある場合は、環境変数からそれを取得します。

echo "スレッド番号 " . getenv(Tester\Environment::VariableThread) . " で実行中";