phpの色んなユニットテスト比較

  • 6
    いいね
  • 3
    コメント

phpでテストを書きたいとき。
1ファイルで済むような小規模な奴にPHPUnitはオーバースペック感があります。
大は小を兼ねるので別にいいんですが、それ以外の選択肢もあるようなので
いい機会だと思いまとめてみました。

以下のテストはこの関数を対象とします。

/**
 * recursive version of implode()
 *
 * @param string $glue
 * @param array $pieces
 * @return string
 */
function implode_recursive($glue, array $pieces) {
    $result = array();
    array_walk_recursive($pieces, function($value) use(&$result) {
        $result[] = $value;
    });
    return implode($glue, $result);
}

コードはgithubに置いてあります。
「こういうのもあるよー」などコメントで教えていただければ幸いです。

1. assert

<?php

require './implode_recursive.php';

$test = array(
    "hoge",
    "fuga",
    array(
        array(
            1,
            2,
        ),
        "foo",
        "bar",
        array(),
        "qux",
    ),
    "piyo",
);

assert('implode_recursive(",", array()) === ""');
assert('implode_recursive(",", $test)   === "hoge,fuga,1,2,foo,bar,qux,piyo"');
assert('implode_recursive("",  $test)   === "hogefuga12foobarquxpiyo"');
  • メリット: 言語組み込みなので、phpだけあればできる。他のものが要らない。
  • デメリット: レポートが貧弱(というかない)ので結果が期待とどう違ったのかわからない。
    • この点はphp7で改善されているっぽい。

向いている用途: snippetや1ファイルに収まるくらいのスクリプトに。

詳細: http://php.net/manual/ja/function.assert.php

2. phpt

php言語本体の公式テスト形式。pearコマンドで実行する。

--TEST--
implode_recursive() -- basic test for implode_recursive()
--FILE--
<?php

require './implode_recursive.php';

$test = array(
    "hoge",
    "fuga",
    array(
        array(
            1,
            2,
        ),
        "foo",
        "bar",
        array(),
        "qux",
    ),
    "piyo",
);

var_dump(implode_recursive(",", array()));
var_dump(implode_recursive(",", $test));
var_dump(implode_recursive("",  $test));
?>
--EXPECT--
string(0) ""
string(30) "hoge,fuga,1,2,foo,bar,qux,piyo"
string(23) "hogefuga12foobarquxpiyo"
  • メリット: var_dumpの結果をdiffするシンプルさ・わかりやすさ。 公式の安心感・安定性。ドキュメント性もよい。
  • デメリット: 日本ではあまり馴染みがないらしくググっても情報が少ない。

向いている用途: 小〜中規模以上。phpunitに馴染めない人(?)

3. PHPUnit

<?php

require_once './implode_recursive.php';

class implode_recursive_test extends PHPUnit\Framework\TestCase
{

    public $test = array(
        "hoge",
        "fuga",
        array(
            array(
                1,
                2,
            ),
            "foo",
            "bar",
            array(),
            "qux",
        ),
        "piyo",
    );

    function test_empty_array() {
        $this->assertEquals("", implode_recursive(",", array()));
    }

    function test_nested_array() {
        $expect = "hoge,fuga,1,2,foo,bar,qux,piyo";
        $this->assertEquals($expect, implode_recursive(",", $this->test));
    }

    function test_nested_array_with_no_glue() {
        $expect = "hogefuga12foobarquxpiyo";
        $this->assertEquals($expect, implode_recursive("", $this->test));
    }

}
  • メリット: 定番・多機能・開発が活発。テストスイートの管理、カバレッジ取得など便利。
  • デメリット: 開発が活発な故に機能の陳腐化が早い。コード量もたくさん必要。

向いている用途: 中〜大規模か。