2010年10月27日水曜日

PythonによるGoogle App Engingeのテスト駆動開発

GAE/P で、テスト駆動開発をeclipseで効率よく進める方法を自分なりに模索してました。

個人的な結論:
doctestは便利だけど、ソースが見づらくなりがちなので、無し。
unitttest + nose(+NoseGAE)のほうが、テストコードと本番コードを分離できるので良い。
さらに、GAETestBase(+gaeunit.py)は、便利そうなので、解読中。
ただ、どうもkayにバンドルされているものの方が一部よさそうなので、
標準のものと見比べながら都合の良いテストモジュールを作成中。

試行錯誤の際につまったこと:

問題1:
ただnosetestsを実行すると、PYTHONPATHが足らなくて盛大にこける。
解決1:
実行前にSET PYTHONPATH=???;???・・・で適当に足すと通るようになる。

問題2:
でもどうせならNoseGAEという便利なものがあるらしいので入れてみる。
しかし、nosegaeをいれて、nosetests --with-gaeとやると、
エラー(ImportError: No module named dev_appserver)が発生。
解決2:
http://d.hatena.ne.jp/sinsoku/20100714/1279036364
google_appengineのデフォルトのパスの指定がunix用になっているので、指定する。
指定方法1:
nosetests --with-gae --gae-lib-root="C:\Program Files\Google\google_appengine"
指定方法2:
D:\Documents and Settings\自分のWindowsID\.nosercに、以下のように記載する:
[nosetests]
gae-lib-root=C:\Program Files\Google\google_appengine

問題3:
単体実行すると動作するテストコード達が、
nosetests --with-gae --gae-lib-root="C:\Program Files\Google\google_appengine"
から実行すると、なにやら盛大に全部エラーになる。
解決3:
イッシーのテストコードの書き方がおかしいのかもしれませんが、
以下のように起動すると、とりあえず普通にテストしてくれました。
nosetests --with-gae --gae-lib-root="C:\Program Files\Google\google_appengine" --without-sandbox
でも、sandbox環境を使わないと、NoseGAEの意味が半減しているような?

問題4:
nosetestsをEclipseから実行するのがめんどう
解決4:
その1:
WindowsXPのショートカット・キー登録機能を使う:
http://www.atmarkit.co.jp/fwin2k/win2ktips/150use_shortcut/use_shortcut.html
その2:
WindowsXPのスタートメニューを利用:
http://www.geocities.co.jp/SiliconValley/4900/s-cut.html
その3:
eclipseの外部ツール登録して起動:
①nosetestsを外部ツールとして登録
②外部ツールを実行
③「最後に起動された外部ツールを実行」にショートカットを設定
http://www.ryuzee.com/contents/blog/553
その4:
eclipseのプロジェクトのビルド設定に組み込んで起動:
http://d.hatena.ne.jp/Nilfs/20100413

イッシーは、その2とその3にしました。
その4は、他の処理(カバレッジの取得とか)でも勝手に動いてしまったりするのが気になりました。

問題5:
nosetestsの実行結果がしょぼくて、ぱっと見てエラーかどうかがわからない。
Red/Green/Refactor、っていうけど、赤くもならないし緑にもならない。赤くらい欲しいな。
red-noseを入れても、XPのコマンドラインでは、ansiエスケープシーケンスを処理できないので、色がつかない。
Eclipseから実行すると、みんなエラー扱いになる。
解決5:
以下のようなバッチファイルを作成。
①nosetestsの実行し、出力結果を一時ファイルに出力させる
②一時ファイルを見て、中身にエラーが含まれていた場合:
コマンドラインの背景色を赤に変える
エラー出力に一時ファイルの内容を出力する
③一時ファイルを見て、中身にエラーが含まれていなかった場合:
コマンドラインの背景色を緑に変える
標準出力に一時ファイルの内容を出力する
④一定時間(デフォルト30秒)たってからコマンドラインを閉じる

具体例は、次のエントリで書きます。

検討中の課題:
課題1:
バッチから起動したnosetestsが、なんか重い
対策1:
原因は、一時ファイルに対して、ウィルスチェックが走っていることらしい。
回避策を検討。(たぶん拡張子を変えればいける)
あと、テストが完了してからでないと結果を見れないのは、標準出力を使っているから仕方が無い。
その点は色をつけるのとトレードオフなので、あきらめる。

課題2:
nosetestsで実行したカバレッジは、eclipseではうまく使えない?
対策2:
どうもnoseとeclipseで使っているカバレッジの仕様が違うようなので、仕方が無い?
カバレッジの取得は、eclipseの機能を使うかな。
http://zakizaki.cocolog-nifty.com/software/2010/10/pydevtrac-plugi.html
特に、
ウィンドウ→設定→実行/デバッグ→起動→起動操作=常に前回起動したアプリケーションを実行する
とやると、簡単にこれで起動できる。
んー。カバレッジはこっちでやろう。
色にこだわらなければ、テストの実行もeclipseの機能でよいかも。

0 件のコメント:

コメントを投稿