この記事の所要時間: 約 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