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

More than 1 year has passed since last update.

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));
}

}


  • メリット: 定番・多機能・開発が活発。テストスイートの管理、カバレッジ取得など便利。

  • デメリット: 開発が活発な故に機能の陳腐化が早い。コード量もたくさん必要。

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