PHPUnitのテストケースの引数を定義する方法
はじめに
PHPのテストコード、書いていますか?
私はつい最近まで書いたことがありませんでした。
そんな私ですが、業務でPHPUnitのテストケースを触る機会がありました。
実際にテストケースを作成する際に困ったのが、「どうやってテストケース実行時に引数を定義するか?」という点です。
今回は「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 の属性が見つからなかった場合は、 コードコメントのアノテーションを使用するようになります。