Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2014/06/30 (Mon)

Haxe 3.1.3 と MassiveUnit 2.1.0 で単体テスト(UnitTesting/UT)を行う

| Haxe 3.1.3 と MassiveUnit 2.1.0 で単体テスト(UnitTesting/UT)を行う - ひとり開発日記。 を含むブックマーク はてなブックマーク - Haxe 3.1.3 と MassiveUnit 2.1.0 で単体テスト(UnitTesting/UT)を行う - ひとり開発日記。

ある程度規模が大きく、複雑なHTML5アプリを作ろうと考えているのですが、ただ漫然とJavaScript(JS)書いてたら危険だよな、少なくとも、見通しよい記述で書け、かつ、単体テスト(UT)を辛くないレベルで書きたいよな、とも考えていて。 なので、堅牢かつ軽量な構文のHaxeでやれないかな、と思い付いたのです。

なんですけど、やっぱり資料が少な過ぎて…。

とりあえず、"Hello World"から、最小限のUTまでを行ってみたので、それを以下に書いてみます。

Haxeインストール

FlashDevelopのインストール

"Hello World"

2.x系の情報ですが、以下の二点に気を付ければ、問題なく通ります。

  1. build.hxml から --js-modern は削除する
  2. ビルド前に実行するコマンドライン」は "haxe $(ProjectDir)\build.hxml" でよい
    • Haxeを C:\Program Files にインストールしたりすると、$(CompilerPath)で置換されるパスに空白が入ることになり云々

クラスの追加

http://tinypic.com/r/5yg8s5/8

FlashDevelopのプロジェクトビューの、Main.hxがあるディレクトリ上で右クリック→「新規作成」→「New Class」を選んで、クラスを追加します。 今回は二値を足し合わせる、"SumInt"クラスを追加しました。

package helloworld;

class SumInt
{
    public var x : Int;
    public var y : Int;

	public function new(x:Int, y:Int) 
	{
		this.x = x;
		this.y = y;
	}

	public function add():Int {
		return this.x + this.y;
	}
}

Mainクラスも書き直し。

package helloworld;

import js.Lib;

class Main 
{
	static function main() 
	{
		var sumInt = new SumInt(4, 5);
		var s = sumInt.add();
		Lib.alert(s);
	}
}

プロジェクトを実行させると、"9"のalertが出ました。

MassiveUnit 2.1.0 でインストールと設定

MassiveUnit

A unit testing library that features a command-line runner for multiple platforms, continuous integration support and report generation.

no title

プロジェクトビューの、プロジェクトのトップで右クリック→「コマンドプロンプト」を選択すると、コマンドプロンプトが開くので、そこで以下を実行します。

C:\...\HelloWorld>haxelib install munit
C:\...\HelloWorld>haxelib run munit config
Massive Unit - Copyright 2014 Massive Interactive. Version 2.1.0
Configure munit project settings
--------------------
test src dir (defaults to 'test') :
output build dir (defaults to 'build') :
report dir (defaults to 'report') :
target class paths (comma delimitered, defaults to 'src') :
hxml file (defaults to 'test.hxml') :
resources dir (optional, defaults to 'null') :
templates dir (optional, defaults to 'null') :
coverage packages (optional, defaults to 'null') :
coverage ignored classes (optional, defaults to 'null') :

"haxelib run munit config"を実行すると、会話型の設定が走るんですが、基本的に全部デフォルト(Enterキーを押すだけ)でよいと思います。

http://tinypic.com/r/2vtcm7p/8

テスト系のクラスや設定ファイルが作られました。

MassiveUnit テスト実行

コマンドプロンプトJSだけに限って、テストを行ってみました。

C:\...\HelloWorld>haxelib run munit test -js
Massive Unit - Copyright 2014 Massive Interactive. Version 2.1.0
   haxe -main TestMain -lib munit -lib hamcrest -cp src -cp test -js build/js_test.js
Tests PASSED under js using summary client
------------------------------
PLATFORMS TESTED: 1, PASSED: 1, FAILED: 0, ERRORS: 0, TIME: 23.504

http://tinypic.com/r/4tuj5f/8

"haxelib run munit test -js"を実行すると、しばらくしてブラウザが立ち上がり、テスト結果が表示されます。

テストケース追加

上記だけでは、SumIntクラスのテストケースは作られないので、コマンドでテストケースの雛形を作成します。

C:\...\HelloWorld>haxelib run munit create -for helloworld.SumInt

http://tinypic.com/r/2me1xr5/8

SumIntTestクラスが作られました。

	@Test
	public function testExample():Void
	{
		Assert.isTrue(false);
	}

デフォルトで用意されているtestExampleメソッドは、必ず失敗するようになっているので、書き換えます。 後、テストケースメソッド名も、分かりやすいものにします。

	@Test
	public function testAdd():Void
	{
		this.instance = new SumInt(2, 7);
		var s = this.instance.add();
		Assert.areEqual(9, s);
	}

再度"haxelib run munit test -js"を実行すると、テストが通りました。

気になったこと

  1. Hexeの単体テストの記述、日本語の記事が全然無かった…。
  2. コマンドプロンプトじゃなくて、FlashDevelopと統合してくれないかな…。
  3. Assertクラス、FlashDevelopでも、メソッドのサジェスチョンが効かないっぽいのは何故でしょう…。
トラックバック - http://program.g.hatena.ne.jp/halflite/20140630