Home > 開発環境
開発環境 Archive
PHPUnitでMockオブジェクトを使う
PHPUnit3がリリースされました。このバージョンにはMockがサポートされているのですが、PHPUnit3はPHP5を対象としているので残念ながらPHP4では動作しません。ですのでPHP4対応のPHPUnitでMockクラスを使う方法を探ってみました。
使うのはPHPUnitと並ぶユニットテストツールのSimpleTestです。こちらはPHP4対応でMockクラスがサポートされています。これをPHPUnitと組み合わせて使ってみます。
SimpleTestインストール
PEARパッケージが以前はあったようなのですが、sourceforgeにはそれらしいものが見当たりませんでした。
zuzara : symfonyチュートリアル実践【第14~16日目】を参考に以下のコマンドでインストールしました。
-
$ pear install http://jaist.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.0.tgz
PEARパッケージが見つからない場合でもsourceforgeからソースを取得してinclude_pathで参照できる位置に配置すればOKです。
PHPUnit用Mockクラス
SimpleTestのSimpleMockを継承してPHPUnitで使うMockクラスを記述します。
-
<?php
-
require_once 'simpletest/mock_objects.php';
-
-
class PHPUnitMock extends SimpleMock {
-
function PHPUnitMock($test, $wildcard) {
-
$this->SimpleMock($test, $wildcard);
-
}
-
}
-
SimpleTestOptions::setMockBaseClass('PHPUnitMock');
-
?>
テスト対象クラス
テスト対象のクラスはこちらです。selectCount()はテーブル名を引数に取り、テーブルのレコード数を整数で返します。擬似的に処理時間が100秒かかるようにしています。
-
<?php
-
class Database {
-
function selectCount($table) {
-
return null;
-
}
-
}
-
?>
テストケース
Databaseクラスのテストケースを記述します。Mockクラスを使用することに定義した処理結果[100]がすぐに返ってきます。
-
<?php
-
require_once 'PHPUnit.php';
-
require_once 'PHPUnitMock.php';
-
require_once 'Database.php';
-
-
Mock::generate('Database');
-
-
class DatabaseTest extends PHPUnit_TestCase {
-
function DatabaseTest ($name) {
-
$this->PHPUnit_TestCase($name);
-
}
-
-
function setup() {
-
}
-
-
function testQuery() {
-
$mock =& new MockDatabase($this);
-
$mock->setReturnValue('selectCount', 100, 'users');
-
-
$ret = $mock->selectCount('users');
-
$this->assertEquals($ret, 100);
-
}
-
}
-
-
$suite = new PHPUnit_TestSuite('DatabaseTest');
-
$result = PHPUnit::run($suite);
-
?>
SimpleTestはMockクラスの他にHTTPテストも行えるなど高機能なのですが、すでにPHPUnitを使用していたので今更移行するのも億劫でした。あとはコードカバレッジも使えると良いのですが。;-)
- コメント (Close): 0
- Trackbacks: 0
ユニットテストでデータ検証
ユニットテストでプログラムで生成したデータを検証する方法です。
CSVファイルを検証するテストをPHPUnitで書いてみました。
-
<?php
-
require_once "PHPUnit.php";
-
-
class DataTest extends PHPUnit_TestCase {
-
function DataTest($name) {
-
$this->PHPUnit_TestCase($name);
-
}
-
-
function testData() {
-
// データ読み込み
-
if (!$fp) {
-
}
-
-
// テストループ
-
$line = 0;
-
$line++;
-
continue;
-
}
-
-
$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];
-
}
-
-
}
-
}
-
-
-
$suite = new PHPUnit_TestSuite('DataTest');
-
$result = PHPUnit::run($suite);
-
?>
ポイントは「assert失敗時のメッセージにデータを特定する項目を含めておく」くらいでしょうか。(このソースでは行数を入れていますが、DBのRecordsetを検証する時はpkeyの値を入れています。)あとはdata.csvが何万行あろうが何回テストしようがphpunitがきっちりテストしてくれます。やっている事は単純なのですが効果は高いです。
他にも複雑なSQLで生成されるデータをPHPで取得して検証したり、DBに問い合わせてデータが正しいかを検証するという方法もあります。もちろん正となるデータを用意しておいてそれと比較するというのもありです。
あと、ここではPHPUnitを使いましたが、データを相手にテストを行うので別にSimpleTestでも良いですし、PerlでもRubyでも何でもOKです。Javaで開発したシステムのデータをPHPで検証する、なんてこともできますね。(LL言語の利用範囲がこんなところにも;-))
ロジックの自動テストも大事ですが、生成物の自動テスト(チェック)もあると心強いものです。
- コメント (Close): 0
- Trackbacks: 0
Subversion1.4.0にアップグレード
- 2006-10-11 (水)
- 開発環境
TortoiseSVNを1.4.0にアップグレードしたらSubclipseやsvnコマンドでエラーが出るようになりました。
-
Unsupported working copy format
-
svn: This client is too old to work with working copy 'xxxxxxxxxxxxxxx'; please get a newer Subversion client
subversion1.4.0のリリースノートを見ると作業コピー・リボジトリのフォーマットが変わったので、1.4クライアントからコミットしたファイルは以前のバージョンでは読めないようです。
そこでSubcliseとSubversionを1.4対応にアップグレードしました。
Subclipse
Subclipseでは1.1.7から1.4.0フォーマットに対応しました。しかし1.1.7はEclipse3.2が必要なのでまずはEclipseをアップグレードします。(ウチの環境は3.1)以前はAll-In-One Eclipseをインストールしていました。はじめから色々入っていて便利なのですが、結局Subversionクライアントしか使っていないので今度はSDKからインストールします。
まずはEclipse3.2+LanguagePackをEclipse downloads homeからダウンロード。あとはzipファイルを解凍してEclipseは完了です。Eclipseを起動後、[ソフトウェア更新][検索およびインストール][インストールする新規フィーチャーを検索]で更新アクセス先サイトに[http://subclipse.tigris.org/update_1.2.x]を設定します。そのまま進めばSubclipse1.1.7がインストールされます。
Subversion - CentOS
subversion1.1.4がRPMで入っていました。[rpm -Uvh]で関連ライブラリと共に1.4.0にアップグレードして完了です。このサーバにリポジトリがあるのですが、1.4.0アップグレード後も特に問題なく動作しています。
-
$ sudo rpm -Uvh apr-0.9.12-1.i386.rpm
-
$ sudo rpm -Uvh apr-util-0.9.12-1.i386.rpm
-
$ sudo rpm -Uvh subversion-1.4.0-1.i386.rpm
Subversion - FreeBSD
subversionをportsで入れていたので、portupgradeでアップグレード完了です。
-
# portupgrade -r subversion-1.3.2
- コメント (Close): 0
- Trackbacks: 0
ホーム > 開発環境
- 検索
- フィード
- メタ情報

