テスト駆動開発
2009年07月29日
FMS:ユニットテストフレームワークを書いています
たぶんどこにも需要はないのだろうけど、
Flash Meia Serverにユニットテストが無いのは残念なので書いて見てます。
SSASUnitか、FMSUnitと命名予定。
JavaScriptの文法(とくにオブジェクト指向まわり)がなんとなく理解できて楽しいですが、継承先でオーバーライドを防ぐ手立てが内容なので、フレームワークも軟らかいものにならざるを得ないような気がする。
いまのところ、
・テストクラス実行前後の処理
・テストメソッド実行前後の処理
・AssertEqual
・テストレポート(簡易)
をシンプルに実装。
ある程度アサーションが実装できたら恥を偲んで公開しようと思います。
FMS周りの目標はユニットテストフレームワークとEclipseプラグインなのでようやく一方が動き出した感じ。

Flash Meia Serverにユニットテストが無いのは残念なので書いて見てます。
SSASUnitか、FMSUnitと命名予定。
JavaScriptの文法(とくにオブジェクト指向まわり)がなんとなく理解できて楽しいですが、継承先でオーバーライドを防ぐ手立てが内容なので、フレームワークも軟らかいものにならざるを得ないような気がする。
いまのところ、
・テストクラス実行前後の処理
・テストメソッド実行前後の処理
・AssertEqual
・テストレポート(簡易)
をシンプルに実装。
ある程度アサーションが実装できたら恥を偲んで公開しようと思います。
FMS周りの目標はユニットテストフレームワークとEclipseプラグインなのでようやく一方が動き出した感じ。

2009年01月11日
Flex:Applicationクラスへのアクセス
ASunitを用いてビューもテストケースを書くようにしようと決意して、ユニットテストを作っていたらxamlというかApplicationクラスのパラメータにアクセスできない。
テストケース以外のときはxaml内のmx:scriptタグの中で、コントローラークラスにthisとしてApplicationクラスを渡していたのだけど、テストの場合そのやり方は使えない。
Hogeというプロジェクトの場合、new Hoge()してあげれば行けるか試してみたらHogeクラスは作れたものの、その中のパラメーターにはアクセスできない。
表示してないからかな・・・?
というわけで調べてみたら、
という呼び出し方で、どこからでもスタティックにアクセスできるじゃないですか・・・今までのやり方が無駄だったのですね。
一つ勉強になりました。
テストケース以外のときはxaml内のmx:scriptタグの中で、コントローラークラスにthisとしてApplicationクラスを渡していたのだけど、テストの場合そのやり方は使えない。
Hogeというプロジェクトの場合、new Hoge()してあげれば行けるか試してみたらHogeクラスは作れたものの、その中のパラメーターにはアクセスできない。
表示してないからかな・・・?
というわけで調べてみたら、
Application.application
という呼び出し方で、どこからでもスタティックにアクセスできるじゃないですか・・・今までのやり方が無駄だったのですね。
一つ勉強になりました。
2008年11月10日
AS3でテスト作成
ActionScript3でユニットテストを行えるライブラリも色々と出ているようですが、AS3Unitでいつの間にか非同期のテストを行えるようになっていました。
どういうことかというと、これまでのAS3Unitだとメソッドを呼び出した結果がイベントとして取得するものであった場合テストすることができなかったのですが、非同期テストが追加されたことで可能になりました!!
これでAS3のテストケースがようやく実践的に作れるようなったと思います。
というわけで簡単なテストケースを作成してみました。
コードはこちら
src\As\Test\Model\SlideShowTextTest.asというクラスがサンプルです。
どういうことかというと、これまでのAS3Unitだとメソッドを呼び出した結果がイベントとして取得するものであった場合テストすることができなかったのですが、非同期テストが追加されたことで可能になりました!!
これでAS3のテストケースがようやく実践的に作れるようなったと思います。
というわけで簡単なテストケースを作成してみました。
コードはこちら
src\As\Test\Model\SlideShowTextTest.asというクラスがサンプルです。
2008年07月31日
AIR:AIRでUnitテストを走らせてみた
ActionScript3用のUnitテストフレームワークとしては、
Spark projectのAS3Unitが有名だが、
AIRでも同様に利用できるのか試してみた。
結論を先に言うと、簡単なテストケースを通すことは成功しました!!
FlexBuilder3の場合は
AS3Unit 1.2 for FlexSDK3 (as3unit-1.2-sdk3.swc)
を落としてきて、swcファイルを[プロパティ]→[Flexビルドパス]→[ライブラリパス]で追加してあげるか、既にパスの通っている場所に設置すればOK。
後は、上記AS3Unitのホームにあるドキュメント等を参考にテストクラスを作成すればテストケースが走るはずです。
詳細な説明は後ほどサイトにまとめようと思います。

Spark projectのAS3Unitが有名だが、
AIRでも同様に利用できるのか試してみた。
結論を先に言うと、簡単なテストケースを通すことは成功しました!!
FlexBuilder3の場合は
AS3Unit 1.2 for FlexSDK3 (as3unit-1.2-sdk3.swc)
を落としてきて、swcファイルを[プロパティ]→[Flexビルドパス]→[ライブラリパス]で追加してあげるか、既にパスの通っている場所に設置すればOK。
後は、上記AS3Unitのホームにあるドキュメント等を参考にテストクラスを作成すればテストケースが走るはずです。
詳細な説明は後ほどサイトにまとめようと思います。

2007年03月25日
テストケース作成最初の一歩
前回の「cakePHP:テスト駆動開発をするには?」は、cakePHP内でテスト駆動開発を行うためのTest Suiteを動作させる環境構築で終わったので今回は、
さわりだけテストケースを記述して、レッド→グリーンの流れを紹介します。
search_dir_file_name.test.php
というテストケースを記述するファイルの中身は
<?php
?>
だけだったので、当たり前にテスト失敗(レッド)が表示されていました。
今回はコードを修正して、
require_once 'controllers/components/search_dir_file_name.php';
class SearcDirFileNameTest extends UnitTestCase
{
var $Obj;
function setUp() {
$this->Obj = new SearcDirFileName();
}
function test_getDirAllFileNames() {
$this->assertTrue($this->Obj->getDirAllFileNames($dummy), 'function call ok');
}
}
require_onceでテストもとのコードを読み込んでおいて、
テスト用のクラスは
extends UnitTestCase
と、テストケース作成用のクラスを継承しています。
クラス内の最初の関数setUp()はテストの最初に呼び出される関数で、
コンストラクタのようなものだと捉えて良いと思います。
ちなみにデストラクタに相当する関数は、今回は書かれていませんが、
tearDown()
です。
次の、function test_getDirAllFileNames()関数がテストのための関数で最初にtest_とつけ、その後をテスト対象の関数名にします。
関数の中身ですが、
$this->assertTrue($this->Obj->getDirAllFileNames($dummy), 'function call ok');
というのがテストの内容です。
テスト元クラスのgetDirAllFileNames()の関数を呼び出してtrueが返ってくればOKという意味になります。
このassertTrueというのがTrueならばという部分です。
他にも、
assertEqual() // 二つの引数を渡しそれがイコールかどうか
assertNull() // Nullかどうか
など色々なassert関数があるので、ソースコードやサイトを見てみると良いと思います。
テストケースが書けたので、
前回のようにtests_controller.php経由でテストを実行。
この段階ではまだレッドです。
テスト元のファイルは何も返さないのでtrueを返すように変更してみます。
テスト元のファイル
cake/app/controllers/components/search_dir_file_name.php
の関数部分を
function getDirAllFileNames($dir) {
return true;
}
に変更。
これでもレッド。
エラー文を読むと、$dummyが定義されていないのが問題のようなので、
テストケースの関数内に
$dummy = 'test';
を追加すると…

グリーンだよぉ!!(ドリフ風外国人口調で)
関数の呼び出しに成功しました。
それでは次の機能は変数がちゃんと渡っているかを確認してみましょう…
という風にレッド→グリーンを確認しながらテストケース作成、コードを修正という作業を繰り返していくことになります。
関数の呼び出しの確認という例では簡単すぎて利点が伝わらないと思いますが、
そこは専門書や、サイトで調べてみてください。
さわりだけテストケースを記述して、レッド→グリーンの流れを紹介します。
search_dir_file_name.test.php
というテストケースを記述するファイルの中身は
<?php
?>
だけだったので、当たり前にテスト失敗(レッド)が表示されていました。
今回はコードを修正して、
require_once 'controllers/components/search_dir_file_name.php';
class SearcDirFileNameTest extends UnitTestCase
{
var $Obj;
function setUp() {
$this->Obj = new SearcDirFileName();
}
function test_getDirAllFileNames() {
$this->assertTrue($this->Obj->getDirAllFileNames($dummy), 'function call ok');
}
}
require_onceでテストもとのコードを読み込んでおいて、
テスト用のクラスは
extends UnitTestCase
と、テストケース作成用のクラスを継承しています。
クラス内の最初の関数setUp()はテストの最初に呼び出される関数で、
コンストラクタのようなものだと捉えて良いと思います。
ちなみにデストラクタに相当する関数は、今回は書かれていませんが、
tearDown()
です。
次の、function test_getDirAllFileNames()関数がテストのための関数で最初にtest_とつけ、その後をテスト対象の関数名にします。
関数の中身ですが、
$this->assertTrue($this->Obj->getDirAllFileNames($dummy), 'function call ok');
というのがテストの内容です。
テスト元クラスのgetDirAllFileNames()の関数を呼び出してtrueが返ってくればOKという意味になります。
このassertTrueというのがTrueならばという部分です。
他にも、
assertEqual() // 二つの引数を渡しそれがイコールかどうか
assertNull() // Nullかどうか
など色々なassert関数があるので、ソースコードやサイトを見てみると良いと思います。
テストケースが書けたので、
前回のようにtests_controller.php経由でテストを実行。
この段階ではまだレッドです。
テスト元のファイルは何も返さないのでtrueを返すように変更してみます。
テスト元のファイル
cake/app/controllers/components/search_dir_file_name.php
の関数部分を
function getDirAllFileNames($dir) {
return true;
}
に変更。
これでもレッド。
エラー文を読むと、$dummyが定義されていないのが問題のようなので、
テストケースの関数内に
$dummy = 'test';
を追加すると…

グリーンだよぉ!!(ドリフ風外国人口調で)
関数の呼び出しに成功しました。
それでは次の機能は変数がちゃんと渡っているかを確認してみましょう…
という風にレッド→グリーンを確認しながらテストケース作成、コードを修正という作業を繰り返していくことになります。
関数の呼び出しの確認という例では簡単すぎて利点が伝わらないと思いますが、
そこは専門書や、サイトで調べてみてください。
2007年03月24日
cakePHP:テスト駆動開発をするには?
前置き: テスト駆動開発とは
これまでの作業でcakePHPの表示部分を軽く触ってみました。
静的にフッターを表示したので、
次は動的に…と、ようやくプログラムらしい段階に来たのですが、そのまえにTDDを行えるようにしてみます。
TDDというのはTestDrivenDevelopmentの略で、
日本語でいうところの「テスト駆動開発」です。
職業プログラマーでない場合、
聞きなれない言葉だと思いますが、
コードを書く前に、テストケースを準備するという一見変わった手法です。私もまだまだ勉強中ですが、テスト駆動開発を行うと、
・クラス構造が綺麗になる(自然とテストできるようなクラス=整理されたクラスになる)
・少しづづ構築するので、事象を分断して捉えやすくなる(プログラムを書くというのは複雑さとの戦いです。細かく分断すること、分断して再構築を繰り返すことは複雑さに対する良い武器です)
・修正にたいしての退行テストを補助してくれる
なんて利点があります。
テスト駆動開発の詳しい解説はケント・ベックの「テスト駆動開発入門」や「アジャイルソフトウェア開発の奥義」がオススメです。
前置きが長くなりましたが、
cakePHPでのTDDについて、調べたところ公式にツールが用意されているようです。
ファイルをDL、解凍、とりあえずドキュメントが含まれているだろうと探してみましたが…無い?
公式ページにも詳細が無かったので、ファイルに含まれているかと思いきや簡単なREADMEファイルに何点か…テスト用のファイル名は「.test.php」というファイルにするらしいです…って、それだけでわかるかい!!
ネットを探しても解説ページのようなものは見つからない。
日本語だけでなく英語のサイトにも十分な情報が見つからなかったので、
ソースを読みながら探ってみることにします。
cakePHPでTDDを行う
解凍するとappディレクトリの下に、
cakePHPで見慣れたcontroller、viewなどのディレクトリがあります。
なんとなく、これをcakePHP内に配置するのだろうなぁと予想しながらapp/vendorsを見るとsimpletestというディレクトリが、
どうやらcakePHPの単体テストではsimpletestを利用するようです。phpの単体テストツールとしてはphpunitと双肩の有名所ですが、私はphpunitしか使ったことが無いので苦労しそう。
次はapp/testsに潜ってみます。
ファイルがいっぱいですが、再びcakePHPでは見慣れたappやlibディレクトリがあります。これがテスト用のファイルを置く場所なんだろうなぁと思いながら、既存のcakePHPのappディレクトリの下にファイルを配置していきます。
app/testsはディレクトリごと移動。それ以外は上書きしないように中身のファイル、ディレクトリをコピー。
配置したファイルの中にcontrollers/tests_controller.phpがありましたのでアクセスしてみます。
(user_dir)/tests/index
CakePHP Test Suite v 1.0.0.0
なんて書かれたなんとなくそれらしいページにアクセスできました。
ダウンロードしたファイルは1.0.0.5だったのですが、それよりも気になる点は…
Notice: Only variable references should be returned by reference in (user_dir)/cake/app/tests/lib/test_manager.php on line 360
エラーがでています。
該当ファイルを読んでみると、テストケースが無いためにエラーが出ているようなのでテストケースを追加してみます。
CSSやJavaScriptの読み込みを動的に読み込むクラスが必要なので、
それを作ります。
cake/app/controllers/components/search_dir_file_name.php
というファイルを追加。中身はクラスの宣言のみのからっぽ
class SearcDirFileName {
function getDirAllFileNames($dir) {
}
}
続いて、上記クラス用のテストケースを
cake/app/tests/app/cases/controllers/components/search_dir_file_name.test.php
追加。ファイル名はあの淡白なREADMEに従って末尾を.test.phpにします。
中身はさらにシンプルに
<?php
?>
シンプルというレベルではありませんね…。
これでもう一度/tests/indexにアクセスするとエラーが消えて、
先ほど作成したファイル名のリンクが表示されました。
どうやらここでテストを管理できるようです。

画像がリンク切れになっているのが気になりますが、
とりあえずsearch_dir_file_name.test.phpのリンクをクリック、

テスト失敗のレッドが表示されました。
まぁ、中身がありませんから失敗でOK。これが成功するとグリーンになるのですが、今回はテストが動作したことでいったん終了。
これでテスト駆動開発をする下地ができました。

