ヘルパークラス
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) . " で実行中";