パラメタライズドテストとは?
ほとんど同じテスト内容でデータだけを変えたテストを多く実施したい時に
テストに配列等を渡して実施できるテスト機能のことです。
このようなケースでパラメタライズドテストを使わずにテストを書くと、
ほぼ同じ内容のテストケースを大量に書くことになります。
テストをDRYにするかどうかは議論が分かれるところだと思いますので
その辺りについては特に触れません。
経緯
普段ほとんどいじらないPHPを書くことになったのですが、
PHPUnitでパラメタライズドテスト(Parameterized Test)を書く時ってどうするんだろう?
ということで調べてみました。
CodeIQ MAGAZINEの以下の記事でData Providerを利用したパラメタライズドテストが紹介されていました。
和田卓人さん出題のテスト駆動開発問題『現在時刻とロケールに依存するテスト』をPHPを使ってオブジェクト指向で解答してみました - CodeIQ MAGAZINE
なるほど、ということでData Providerを利用してみることにしました。
サンプル
お題はFizzBuzzです
コード
プロダクトコード
<?php
namespace App;
class FizzBuzz
{
public function __construct($limit)
{
$this->limit = $limit;
}
public function fizzbuzz()
{
return array_map(function($i)
{
switch (true) {
case $i % 15 == 0:
return "FizzBuzz";
case $i % 5 == 0:
return "Buzz";
case $i % 3 == 0:
return "Fizz";
default:
return $i;
}
}, range(1, $this->limit));
}
}
テストコード
<?php
use App\FizzBuzz;
class FizzBuzzTest extends TestCase
{
/**
* @dataProvider providerFizzbuzz
*/
public function testFizzbuzz($limit, $expected)
{
$fb = new FizzBuzz($limit);
$actual = $fb->fizzbuzz();
$this->assertEquals($expected, $actual);
}
public function providerFizzbuzz()
{
return [
'case limit 3' => [3, [ "1", "2", "Fizz" ]],
'case limit 5' => [5, [ "1", "2", "Fizz", "4", "Buzz" ]],
'case limit 15' => [15,
[ "1", "2", "Fizz", "4", "Buzz",
"Fizz", "7", "8", "Fizz", "Buzz",
"11", "Fizz", "13", "14", "FizzBuzz"
]
]
];
}
}
テスト実行
$ phpunit tests/FizzBuzzTest.php
...
Time: 3.63 seconds, Memory: 10.00MB
OK (3 tests, 3 assertions)