パラメータ化テスト用のデータプロバイダー
dataProviderを使って、複数の入力で同じテストを実行します
「パラメータ化テスト用のデータプロバイダー」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
データプロバイダーとは
データプロバイダー は、テスト入力のセットを返すメソッドです。PHPUnit はデータセットごとにテストメソッドを1回呼び出すため、コードを繰り返さずに多くの入力の組み合わせをテストできます。
基本的なデータプロバイダー
プロバイダーは2次元配列を返します。各サブ配列が、テストメソッドの1回の呼び出しに対応します。
<?php
public static function additionProvider(): array
{
return [
"two positives" => [2, 3, 5],
"negative" => [-1, 1, 0],
"zeros" => [0, 0, 0],
];
}Attribute による関連付け(PHPUnit 10 以降)
#[DataProvider] Attribute を使って、テストとプロバイダーを関連付けます。
<?php
use PHPUnit\Framework\Attributes\DataProvider;
#[DataProvider("additionProvider")]
public function test_add(int $a, int $b, int $expected): void
{
$this->assertSame($expected, (new Calculator())->add($a, $b));
}名前付きデータセット
プロバイダーの配列で連想キーを使うと、各データセットに説明的な名前を付けられます。これらの名前はテスト出力に表示されます。
<?php
public static function emailProvider(): array
{
return [
"valid email" => ["user@example.com", true],
"missing @" => ["userexample.com", false],
"missing domain" => ["user@", false],
"international" => ["用户@例子.com", true],
];
}Generator を返す
プロバイダーは配列の代わりに Generator を返して、データセットを遅延生成することもできます。非常に大きなデータセットに便利です。
<?php
public static function largeProvider(): Generator
{
for ($i = 1; $i <= 1000; $i++) {
yield "case $i" => [$i, $i * 2];
}
}外部データソース
プロバイダーメソッド内で CSV、JSON、またはデータベースからテストデータを読み込み、実際のデータを使ってテストを実行できます。
<?php
public static function csvProvider(): array
{
$rows = array_map("str_getcsv", file("tests/fixtures/data.csv"));
return array_map(fn($r) => [$r[0], (int)$r[1], (int)$r[2]], $rows);
}複数のデータプロバイダー
Attribute を重ねて指定することで、1つのテストメソッドから複数のプロバイダーを参照できます。
プロバイダーは static である必要がある
PHPUnit はテストクラスのインスタンス化前にデータプロバイダーメソッドを呼び出すため、メソッドは static として宣言する必要があります。
エッジケースのテスト
プロバイダーを使って、0、負の数、空文字列、null、最大整数など、バグが発生しやすいエッジケースを体系的に網羅します。
データプロバイダーの出力
失敗時にはデータセット名が表示されます。CalculatorTest::test_add with data set "negative" ([-1, 1, 0]) のように表示されるため、どのケースが失敗したかを簡単に特定できます。
プロバイダーと setUp の組み合わせ
データプロバイダーと setUp は組み合わせて使用できます。各反復の前に setUp が実行されるため、各データセットに新しいテスト対象オブジェクトが用意されます。
パフォーマンスに関する考慮事項
プロバイダーはテストスイートの読み込み時に実行されます。プロバイダー内でコストの高い処理(HTTP 呼び出しやデータベースクエリ)を行うのは避け、ファクトリやフィクスチャを使用してください。
まとめ
データプロバイダーを使うと、テストの重複をなくせます。説明的な失敗メッセージには連想キーを使います。プロバイダーを static として宣言し、#[DataProvider] Attribute で関連付けます。
クイックチェック
データプロバイダーには、どの可視性修飾子が必要ですか?
よくある質問
「パラメータ化テスト用のデータプロバイダー」レッスンは無料ですか?
はい。「パラメータ化テスト用のデータプロバイダー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「パラメータ化テスト用のデータプロバイダー」で何を学びますか?
dataProviderを使って、複数の入力で同じテストを実行します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「パラメータ化テスト用のデータプロバイダー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- PHPUnitのセットアップと最初のテスト
- アサーションとテストメソッド
- パラメータ化テスト用のデータプロバイダー
- PHPUnitで依存関係をモックする