はじめに
PHPUnitのデータプロバイダとは
アサーションを何度も書く必要がなくなる便利なアノテーションのこと。
PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方
ジェネレータ関数とは
ジェネレータ関数は一度だけ値を返すのではなく、
必要に応じて何度でも値を変えて返すことができる便利な関数のこと。
PHP: ジェネレータの構文 - Manual
使い方を簡単な計算式のテストで比較
データプロバイダを使わない書き方
//引き算を行うファンクション
function sub($a, $b) {
return $a - $b;
}
//テストファンクション
public function testSub()
{
//テストデータの配列
$patterns = [
[1, 2, 1],
[2, 3, 1],
[5, 8, 3],
];
foreach ($patterns as list($expected, $a, $b)) {
$this->assertEquals($expected, sub($a, $b));
}
}
メリット:
・ソースコードが短くかける
デメリット:
・どこでテストが落ちたかわかりにくい
データプロバイダのみの書き方
//引き算を行うファンクション
function sub($a, $b) {
return $a - $b;
}
/**
* @dataProvider provideSubitionTestParams
* テストファンクション
*/
public function testSub($expected, $a, $b)
{
$this->assertEquals($expected, sub($a, $b));
}
//テストデータを渡すデータプロバイダ用のファンクション
public function provideSubitionTestParams()
{
return [
[1, 2, 1],
[2, 3, 1],
[5, 8, 3],
];
}
メリット:
・どこで落ちたかわかりやすい
・setUp/tearDownが有効活用できる
→データプロバイダで記述すると、それぞれが1つのテスト扱いになるため、毎回setUp/tearDownが実行されます。
デメリット:
・ソースコードが長くなる
データプロバイダとジェネレータ関数を組み合わせた書き方
//引き算を行うファンクション
function sub($a, $b) {
return $a - $b;
}
/**
* @dataProvider provideSubitionTestParams
* テストファンクション
*/
public function testSub($expected, $a, $b)
{
$this->assertEquals($expected, sub($a, $b));
}
//テストデータを渡すデータプロバイダ用のファンクション
public function provideSubitionTestParams()
{
//ジェネレータ関数でテストデータを定義
yield "テストケース1" => [1, 2, 1];
yield "テストケース2" => [2, 3, 1];
yield "テストケース3" => [5, 8, 3];
}
メリット:
・どこで落ちたかわかりやすい
・setUp/tearDownが有効活用できる
→データプロバイダで記述すると、それぞれが1つのテスト扱いになるため、毎回setUp/tearDownが実行されます。
・メモリの節約になる
デメリット:
・ソースコードが長くなる
さいごに
データプロバイダとジェネレータ関数を組み合わせたことにより、
網羅的にかつ、大量のアサーションを書かずに可読性の高いテストコードがかけます。
自分なりにデータプロバイダを駆使して、
もっといい感じにテストしていきたい・・・