アジャイル,Trac,オープンソースなどの話。認定スクラムマスター。Twitterは@ryuzee
cakephpではSchema機能を使ってテーブルを作成することが出来る。
で、ついでにマスター系データもまとめて登録する方法が【CakePHP】お手軽便利なCakeSchemaに載っている。
ただ載っている方法には若干問題がある。
ということで僕なりにアレンジしたのが以下の方法。
schema.phpのafterメソッド
$model_names = array();
$prop = get_class_vars(get_class($this));
foreach($prop as $key => $value)
{
$s = Inflector::classify($key);
if (!($s == "Name" || $s == "File" || $s == "Path" || $s == "Log" || $s == "Connection" || $s == "Table"))
{
$model_names[] = $s;
}
}
if(!empty($event['create'])){
if(!isset($this->InitialValues)){
require_once($this->path.DS.'initial_values.php');
$this->InitialValues = new InitialValues();
}
$modelname = Inflector::classify($event['create']);
if($modelname == $model_names[count($model_names)-1])
{
foreach($model_names as $target_modelname)
{
$this->InitialValues->set($target_modelname);
}
}
}
}
肝は、全部のデータを最後のテーブルの作成完了後に作る、というだけ。
NameとかFileとか除外しているところはin_arrayで除外した方がいいけど、まぁいいか。
色々試行錯誤したんだけど、最終的に今回の開発は、以下のような環境で進めることにした。
開発用サーバはVMware Player上にCentOS5.3をインストールして、必要なミドルウェアの設定を行ったものを用意した。
VMwareの共有ディレクトリ機能を利用し、/mnt/hgfs/ディレクトリに、チェックアウトしたレポジトリのtrunkを割り当ててある。
レポジトリの構成については、以前Postしたようにtrunk以下に全てのソースコードやドキュメント、ツールが配置されている。
本番と同様のファイル配置にするために、/mnt/hgfs/以下の各ディレクトリに対してシンボリックリンクを張って同じ構成にしている。
この場合ファイルのパーミッション関係はテストできないので、本番環境のパーミッションテスト用のスクリプトを予め用意しておいた。
Eclipseについては、Pleiadesから入手したPHP開発用のものを利用した。特に変わった設定はしていないが、ソースコードについてはSubversiveを使って、Eclipse上からSubversionを操作できるようにしてある。なお、Eclipse上からのSubversion操作以外に仮想OS上の操作、開発用マシンからの操作と複数種類の操作方法が存在するが、この場合Subversionのバージョンが異なると問題になることがある。
従って僕の環境ではSubversionは全て1.5系に揃えてある。
TortoiseSVNは、標準では起動時にバージョンチェックを行い、新しいバージョンが出ているとアップデートを促してくるが、うかつにアップデートすると面倒なことになるので、設定を変更しておく。
またEclipseは各プロジェクト毎にインスタンスを分けておき、設定ファイル等もSubversionに放り込んでおいた。Eclipse本体もSubversionに登録しようとしたのだが、こちらについては、パスが長すぎるせいか登録に失敗するので、zipで固めて登録しておき、新しい開発者が追加になった場合もチェックアウト&解凍ですぐに利用できるようにした。
SubversionのFAQを見る限りWindows上からの255バイトを超えるパスのファイルについてもフルパスで指定することによって登録可能と書いてあったんだが・・・。
今回のプロジェクトはレガシーコードの改修なので、ユニットテストが用意されているわけでもなく、どうやって品質担保するかが課題。
改修していくモジュールについてはできる限り単体レベルでテストできるようにテスト追加とリファクタリングをしていくが、複雑度が高かったり、他のモジュールとの関連性が見えない中でむやみやたらにリファクタリングすると危険なので、まずはアプリケーションの動作レベルで検証できるようにSelenium RCとPHPUnitを組み合わせて、動作のテストを行えるよう準備した。
この際、PHPUnit_Extensions_Database_TestCaseを利用して、予め用意しておいたテスト用のfixtureをロードしてテストできるようにしてある。
以前はひたすら1つのDBにいろんなレコードを突っ込んでテストをしていたようだが、テストの再現性が確保できるはずもないので、最初の段階で仕込んである。
またテスト用のfixtureはCSV形式で用意する必要があるのだが、いちいち手でCSVを作成するのは困難なので、予めテーブルのスキーマを全て記述したExcelシートを用意し、マクロのようなもので複数CSVファイルに変換している。本当はPHPUnitを継承して、Excelをデータセットとして読み込めるようにすると尚良いのだが、今回は時間もなかったので見送った。将来的にはこの部分をもうちょっと工夫したいところ。
Selenium RCについては、htmlでテストケースを書くという手もあるのだが、データの初期化や細かいテストに不向きなので、phpでテストケースを記述している。もちろんテストケースの作成にはSelenium IDEを利用して、ベースとなるテストケースについては、ある程度自動で生成している。
Selenium RCでは複数のブラウザに対応しているが、自身でProfileをカスタマイズできることからFirefoxを利用してのテストとしている。(テストサーバがオレオレ証明書なんだが、現在のところSelenium RCでオレオレ証明書に対応できるのは、カスタマイズしたProfileを使えるFirefoxのみのようだ)
開発者が今後増えていくことを考えると、開発環境構築のスピードアップと均質化は重要だと考えている。
その観点で今回は自動で開発環境を整えるバッチファイルを用意して以下のことをやらせている。
これによって全ての開発者は、同じツールを使って同じディレクトリ構成で開発を行うことができるようになっている。
さぁどうなるかな。
CakePHPで一括でカバレージを測定するときに、Windows環境だと修正が必要と書いたけど、面倒なのでパッチ作っておいた。ご自由にどうぞ。
simpletest.patch
とうとう見つけたよ!
#7/8にcoverage_reporter.phpの修正について若干追記
XAMPP1.6.6
CakePHP1.2
SimpleTestの開発レポジトリにあるカバレージ測定ツールを使う。
標準のアーカイブには含まれていないので、svnから取得する。
取得したモジュールを適当な場所に配置する。今回はC:/dev/simpletestに配置した。
次に、php.iniを修正する。
※この設定が難しければPHPのコマンドラインパラメータに値を指定することが出来る。例は以下の通り。
なお、上記の例ではモデルとコントローラのディレクトリのみを対象としているが、自作のライブラリ等があればそれも指定する。
を入れておく。
となっているが、これを以下に修正する。
というのもWindowsの場合ドライブレターに:がつくのでファイル名に:が含まれてしまうことになり、正常にファイルが出力されないためだ。
phpUnderControl連携をしていて気づいた問題。
SimpleTestでは、assertWantedPattern等で、文字列中から該当する文字列を正規表現で探すといったテストが出来る。このテスト結果を表示する際に検索範囲文字列が100~200文字を超えると、間の文字列がカットされて...と表示されるのだが、日本語環境だと場合によって文字化けしてしまう。
simpletest/dumper.phpの118行目から
で文字列の切り出しをしているが、2バイト文字が一切考慮されていないため、このような問題が起こっている。
ということで修正は
とすれば良さそうだ。strlenをmb_strlenにし、文字コードを指定。同じくsubstrもmb_substrにして文字コードを指定。
※ソース全体がEUC-JPの場合とかを考慮すると本当はもうちょっと真面目に対応した方が良いかもしれないけど、僕は最近UTF-8しか使わないので。
Webベースのテストなら多少文字列が文字化けしていたくらいではどうってこともないが、phpUnderControl等のCIツールを使って、XMLをパースするような処理があったりすると文字コード関連のこの不具合は面倒なことになるので、気をつけよう。
4月から開発してきた案件が終わるのでちょっくら振り返りするぞ。
開発は楽しいねぇ。
前回以降もテストしているんだけど、「メモっとかないと忘れちゃうねー」的な話を以下列挙。
それにしても今回は真面目にテストしているぞ(笑
タイトルに深い意味は無いんだけど、CakePHPのSimpleTestでコードカバレージを真面目に取得してみたので、そのメモとか。
XAMPP1.7.0
PHP5.2.8
MySQL 5.1.30
Apache 2.2.10
このバージョンのXAMPPに含まれているXdebug2.0.3ではカバレージが取得できず、Apacheごと死んでしまう問題があるので、Xdebug2.0.0を利用する。
http://www.xdebug.org/download.phpにアクセスして、環境にあったモジュールを取得する。
僕の環境の場合は、XAMPPのPHP5.2.8だから、図の赤枠で囲んだリンクをクリックしてファイルを保存する。
php_xdebug-2.0.0-5.2.2.dllをphp_xdebug.dllにリネームしてphp\ext\の中に上書き保存する。
今やっている案件ではCakePHPを使ったアジャイル開発で、当然テストも自動化している。
テストの自動化を徹底的にやったので楽なんだけど、次回の案件のためにどういう観点でテストを組んでおくと良いか、またどこに嵌りがあるかメモとして残しておく。
他に思いついたら付け足そう。
著者/訳者:安藤 祐介 新原 雅司 堂園 俊郎
出版社:毎日コミュニケーションズ( 2009-06-27 )
定価:¥ 3,360
単行本(ソフトカバー) ( 400 ページ )
ISBN-10 : 4839932468
ISBN-13 : 9784839932466
著者/訳者:安藤 祐介 岸田 健一郎 新原 雅司
出版社:毎日コミュニケーションズ( 2009-04-08 )
定価:¥ 3,150
Amazon価格:¥ 3,150
単行本(ソフトカバー) ( 264 ページ )
ISBN-10 : 4839930651
ISBN-13 : 9784839930653
CakePHP ポケットリファレンス (Pocket Reference)
著者/訳者:株式会社ブルーオーシャン 岡田 佳典
出版社:技術評論社( 2008-06-18 )
定価:¥ 2,604
Amazon価格:¥ 2,604
単行本(ソフトカバー) ( 448 ページ )
ISBN-10 : 4774135038
ISBN-13 : 9784774135038
以前にも書いたんだけど、CentOS5系を利用していると、バリデーションのAlphaNumericが動作してくれない。その回答としては、環境に問題あるので、PCREをバージョンアップして、という風に書いたが、これだと、納品後どのサーバに配置するかによって、アプリケーションの動作に差が出てしまう。環境差によって差があるのであれば、それを検証するテスト書かなきゃいけなくなるので、今回は本体を修正して、環境非依存な状態にする方法を紹介する。
libsディレクトリの中にあるvalidation.phpを修正する。
修正前
if (is_array($check)) {
$_this->_extract($check);
}
if (empty($_this->check) && $_this->check != '0') {
return false;
}
$_this->regex = '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/mu';
return $_this->_check();
}
修正後。$_this->regexのところが普通の正規表現に変わっている。
ちゅーか、なんでPCREつかっているのか分からん。
日記 PHP オープンソース インストールマニアックス IIS Trac MySQL Perl Linux Agile・生産性向上 wordpress フリーソフト 自宅サーバ 書評 ブックマーク phpMyFaq TraM Plugin 早起き Delphi apache CakePHP Firefox Ruby eclipse セキュリティ プラグイン アジャイル mojavi Subversion Ajax/Web2.0 SQLServer Zope サーバ フレームワーク phpBB 仮想化 PostgreSQL OpenVZ scuttle CMS 文字化け 自宅 翻訳・日本語化 ApacheDS LDAP Excel 生産性向上 CodeIgniter XAMPP hacks taskfreak 修正 言語ファイル Ajax SBM ダウンロード HTML::FillInForm mod_security 情報共有