この記事の所要時間: 約 3分5秒
ユニットテストでプログラムで生成したデータを検証する方法です。
CSVファイルを検証するテストをPHPUnitで書いてみました。
< ?php
require_once "PHPUnit.php";
class DataTest extends PHPUnit_TestCase {
function DataTest($name) {
$this->PHPUnit_TestCase($name);
}
function testData() {
// データ読み込み
$fp = fopen('data.csv', 'r');
if (!$fp) {
die('data not found.');
}
// テストループ
$line = 0;
while(!feof($fp)) {
$line++;
$row = fgetcsv($fp, 4096);
if (empty($row)) {
continue;
}
if (count($row) != 3) {
$this->fail('Line: ' . $line);
continue;
}
// id は数値のみ
$id = $row[0];
$this->assertRegExp('/^[0-9]+$/', $id, $line);
// code は英数字のみ
$code = $row[1];
$this->assertRegExp('/^[A-Za-z0-9]+$/', $code, $line);
// name は値があれば良い
$name = $row[2];
$this->assertTrue(strlen($code) > 0, $line);
}
fclose($fp);
}
}
$suite = new PHPUnit_TestSuite('DataTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>
ポイントは「assert失敗時のメッセージにデータを特定する項目を含めておく」くらいでしょうか。(このソースでは行数を入れていますが、DBのRecordsetを検証する時はpkeyの値を入れています。)あとはdata.csvが何万行あろうが何回テストしようがphpunitがきっちりテストしてくれます。やっている事は単純なのですが効果は高いです。
他にも複雑なSQLで生成されるデータをPHPで取得して検証したり、DBに問い合わせてデータが正しいかを検証するという方法もあります。もちろん正となるデータを用意しておいてそれと比較するというのもありです。
あと、ここではPHPUnitを使いましたが、データを相手にテストを行うので別にSimpleTestでも良いですし、PerlでもRubyでも何でもOKです。Javaで開発したシステムのデータをPHPで検証する、なんてこともできますね。(LL言語の利用範囲がこんなところにも;-))
ロジックの自動テストも大事ですが、生成物の自動テスト(チェック)もあると心強いものです。
- Newer: 前の日曜日は何日?
- Older: livedoor Readerで「ピンを開く」数を増やす
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/11/php_testing_data.html/trackback
- Listed below are links to weblogs that reference
- ユニットテストでデータ検証 from Shin x blog

