0Pricing
PHP Academy · レッスン

パラメータ化テスト用のデータプロバイダー

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. PHPUnitのセットアップと最初のテスト
  2. アサーションとテストメソッド
  3. パラメータ化テスト用のデータプロバイダー
  4. PHPUnitで依存関係をモックする
← PHP Academyに戻る