PHPUnitでテストクラス雛型自動生成。from既存のソースから。

ユニットテストについても少しだけ書く。

テストコード、まず書くのがめんどくさいという人は多いと思う。
ので、それを軽減する方法を。

テストコードのスケルトンを自動生成する。
それには追加でPEARパッケージを導入する。


pear install phpunit/PHPUnit_SkeletonGenerator

これだけ。
既に存在するソースからテストコードのひな型を作るときはコマンドラインから、


phpunit-skelgen --test --bootstrap -- "" ""

とする。

"" の二つはディレクトリ、ファイル共に存在している必要があるので、先に空でもいいので作っておこう。
それすらもめんどくさいという人は、以下みたいなラッパーで簡略化してしまおう。

genTest.php

<?php
$bootstrap = "</path/to/bootstrap.php>";
$libs = "</path/to/existing_class_dir>";
$tests = "</path/to/test_class_dir>";

$params = $_SERVER['argv'];
$class_name = $params[1];

// convert [php5.3 namespace separator] to [path separator].
if (false !== strpos($class_name, '\\')) {
    $cls_str = str_replace('\\', '/', $class_name);

// other, ["_" separator] to [path separator].
} else {
    $cls_str = str_replace('_', '/', $class_name);
}

if (!file_exists("${tests}/${cls_str}Test.php")) {
    $dir = pathinfo("${tests}/${cls_str}Test.php", PATHINFO_DIRNAME);
    if (!file_exists($dir)) {
        mkdir($dir, 0777, true);
    }
    touch("${tests}/${cls_str}Test.php");
}

exec("phpunit-skelgen --test --bootstrap ${bootstrap} -- ${class_name} ${libs}/${cls_str}.php ${class_name}Test ${tests}/${cls_str}Test.php", $output, $ret);

foreach ($output as $row) {
    echo $row . PHP_EOL;
}

これを用意したら、


php genTest.php

で既存のクラスファイルに対応したテストクラスファイルが自動生成されるようになる。
楽ちん。

このように、どんどん自動化してゆくと色んなことが楽しくなると思う。

※if you can, 最初にテストコードを書きましょう。