- 2009/11/24 23:28
- Progression | UnitTest
リリースしたコンテンツのコードがあまりにも酷いので、本で勉強しながらリファクタリングをしているのですが、
本で何度もリピートされるのが、ユニットテストやれ、やんねーヤツは死んでよしという言葉。
そこで、yossyさん a.k.a BeInteractiveの中の人の、AS3Unitを使ってみようか、と。
実際、AS3Unitのドキュメントに従いながらコードを書いていたのですが、ハタと行き詰まったので、メモ。
テストクラスって、クラス指定しかできない
サンプルで上がってたのは、以下のようなコード。
package
{
import flash.display.Sprite;
import org.libspark.as3unit.runner.AS3UnitCore;
// ドキュメントクラス
public class Main extends Sprite
{
public function Main()
{
AS3UnitCore.main(CalculatorTest);
}
}
}
CalculatorTestってクラスが、テスト用のクラスで、そのクラス自体をテストの仕組みに登録してるようです。
(AS3Unitライブラリがswcソースしか手に入れられないので、中が見れず、分析できてないです・・・)
で、CalculatorTestクラスはこんな感じ。
package
{
import org.libspark.as3unit.test;
import org.libspark.as3unit.assert.assertEquals;
use namespace test;
public class CalculatorTest
{
test function add():void
{
var calc:Calculator = new Calculator();
assertEquals(3, calc.add(1, 2));
}
}
}
Calculatorというのが、テストしたいクラスという事になります。
このソースを見ても分かるとおり、テストクラス(CalculatorTest)を別途作って、名前空間
テストしたいクラスのインスタンスを生成し、アサーションを入れる、ということになるようです。
リファクタリング本にもあったんですが、テストクラスの中で実際テスト対象にしたいインスタンスと同じ条件のインスタンスを作ってやる必要があるようです。
(ここら辺、認識を間違ってるかもしれないです・・・)
同じ条件のインスタンスを作る作り方が、そもそも手間すぎるし、
そんなの、条件が絡まりすぎてムリだよ、ママ・・・。
で、解決方法を捻り出してみたのが、コチラ。
package TestClass
{
import TestClass.TestTarget;
import org.libspark.as3unit.test;
use namespace test;
public class MyTest
{
private static var _instance: TestTarget;
public function MyTest()
{
}
public static function setInstance(instance: TestTarget):void {
_instance = instance;
}
test function doTest():void {
//_instance.myTest(); public アクセス制御子でも、テストはできる。
_instance.test::myTest();
}
}
}
package TestClass
{
import org.libspark.as3unit.test;
import org.libspark.as3unit.assert.assertEquals;
use namespace test;
public class TestTarget
{
private var _expectedThree:int;
public function TestTarget()
{
}
test function myTest():void{
// インスタンスメンバとか使ったアサーションとかを書く。
assertEquals(3, _expectedThree);
}
}
}
MyTestのクラスメンバにTestTargetインスタンスを保存して、
名前空間<test>なメソッド内で、インスタンスにテストを委譲すれば良さそうですね。
便宜上ここではTestTargetってクラスになってますけど、実際は、テストしたいクラスに、
名前空間<test>を使ったテストメソッドを書き加えるだけなんで、殆ど問題ないんじゃないでしょうか。
今回は、わざわざmyTestもアクセス制御子をnamespace<test>にしてますけど、別にpublicでも動きます。
が、安全のため、名前空間を指定した方が良いでしょうし、テスト用関数だと見た目で解り易いので、
<test>名前空間に指定してます。
< テストクラスのスタティックメンバにインスタンスを保存 > という作業自体は、Progressionで言えば、
シーンオブジェクトのテストしたいタイミングのイベントだったり、キャストの中だったり、どこでも書けそうです。
//テストしたいタイミングのところで、以下を記述 MyTest.setInstance(testTarget); AS3UnitCore.main(MyTest);
こんなの、常識かもしれませんねーww
でも、自分の覚書のために、メモメモ。
コメント:0
トラックバック:1
- この記事のトラックバック URL
- http://djakarta-trap.net/blog/2009/11/as3unit_fast_test/trackback/
- トラックバックの送信元リスト
- AS3Unitで、手を抜いてテストをする方法。 - djakarta-trap より
- pingback - AS3Unit: ActionScript 3.0上JUnit4の移植、単体テストを行うためのフレームワーク | DigiTechLog Dot Com より 2010/02/13
[...] 4、AS3Unitで、手を抜いてテストをする方法 [...]