7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPUnitのData Providersを使ってパラメタライズドテストを行う

Posted at

パラメタライズドテストとは?

ほとんど同じテスト内容でデータだけを変えたテストを多く実施したい時に
テストに配列等を渡して実施できるテスト機能のことです。

このようなケースでパラメタライズドテストを使わずにテストを書くと、
ほぼ同じ内容のテストケースを大量に書くことになります。

テストを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)

外部資料

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?