バグ解消法、お役立ち情報など

PHPUnitのテストケースの引数を定義する方法

logo

はじめに

PHPのテストコード、書いていますか?

私はつい最近まで書いたことがありませんでした。

そんな私ですが、業務でPHPUnitのテストケースを触る機会がありました。

実際にテストケースを作成する際に困ったのが、「どうやってテストケース実行時に引数を定義するか?」という点です。

今回は「PHPUnitのテストケースの引数を定義する方法」についてお伝えします。

結論

引数はデータプロバイダメソッド内で定義できます。

ドキュメントはこちら。

2. Writing Tests for PHPUnit

引数としてどのデータプロバイダメソッドを使うかを指定する記述が、PHPUnit 10になって変わったようです。

PHPUnit 9.6以下の記述方法

テストクラス内
final class DataTest extends TestCase { /** * @dataProvider additionProvider */ public function testAdd(int $a, int $b, int $expected): void { $this->assertSame($expected, $a + $b); } public function additionProvider(): array { return [ [0, 0, 0], [0, 1, 1], ]; } }

@dataProvider アノテーションで指定します。

PHPUnit 10.0以降の記述方法

テストクラス内
final class NumericDataSetsTest extends TestCase { public static function additionProvider(): array { return [ [0, 0, 0], [0, 1, 1], ]; } #[DataProvider('additionProvider')] public function testAdd(int $a, int $b, int $expected): void { $this->assertSame($expected, $a + $b); } }

#[DataProvider()]のカッコ内にプロバイダーメソッド名を指定します。

これはPHP8で追加されたアトリビュート(属性)という機能だそうです。

おわりに

以上のようにデータプロバイダーを使用することで、引数を用いてテストを書くことができます。

もしPHPUnit 10以降をお使いであれば、アトリビュートで指定する方が良さそうですね。

リリースノートを見る限り、PHPUnit内部では先にアトリビュートが記載されているかを判定するとのことです。

PHPUnit 10 looks for PHP 8 attributes on a code unit first.

It falls back to annotations in code comments when no PHP 8 attributes are found on a code unit.

日本語訳

PHPUnit 10 では、まずコードユニットに PHP 8 の属性があるかどうかを調べます。

PHP 8 の属性が見つからなかった場合は、 コードコメントのアノテーションを使用するようになります。

Release Announcement for Version 10 of PHPUnit

バグ解消法、お役立ち情報など