NanoTestがマクロ環境以外のテストでのバグも、コンパイラ警告として出力できるようになりました

前回のNanoTestの記事 : テストで検出したバグをコンパイラ警告として出力してくれるHaxeライブラリ、NanoTestを公開しました

このNanoTest、バージョン1.0に更新しました!

これまでのNanoTest

Haxeのマクロ上でテストを実行して、検出したエラーをコンパイラ警告として出力すれば、IDEのコンパイルエラー表示機能を使って表示できるよ。コンパイルエラーと同じように扱われるから、FlashDevelopでもIntelliJ IDEAでも、エラー行の強調とか、エラー行へのジャンプ機能とかが使えるよ。

マクロでテストをすることの重大な欠点

Haxeには出力する言語特有バグとか、挙動の違いとかがあるよ。
あと、各プラットフォーム依存のライブラリとかを使うとマクロを使ってのテストができないよ。

新しいNanoTest

新しいNanoTestではマクロ以外で実行したテストの結果をIDE上に出力することができるようになりました。これで、プラットフォーム依存な内容のテストも簡単にできるようになります。

NanoTestOnFlashDevelopNanoTestOnIntelliJIDEA

しくみ

  1. ターゲットのプラットフォームへコンパイルする
  2. ターゲットのプラットフォーム上でテスト実行して結果をテキストファイルに出力する
  3. マクロでファイルを読み込んで、エラーの情報があれば、コンパイラ警告として出力する

これだけです。とってもシンプル。だけど強力。

これにより、出力対象がNekoだろうと、C++だろうと、C#だろうと、Javaだろうと、JavaScriptだろうと、FlashだろうとIDE上でテストのデバッグができるようになります。

インストール方法

以下のコマンドを入力

haxelib install nanotest

使い方

Githubのsampleフォルダに、FlashDevelop用、Intellij IDEA用のサンプルプロジェクトがあるので、それをみればどうやって使えばいいかはわかると思います。

Nanotest | Github

一応、簡単に解説。

NanoTestRunner.readResult

バージョン1.0で新たに追加されたNanoTestRunner.readResultをマクロから呼び出すことでテキストファイルの内容にしたがって、IDE上でのデバッグが可能になります。

具体的には、hxmlで以下のような指定を行います。

-lib nanotest
--macro nanotest.NanoTestRunner.readResult(テスト結果ファイルのパス, ソースのパスの配列, ラベル)

“テスト結果ファイル”というのは、テストのときに標準出力される内容をファイルにリダイレクトしたものです。NanoTest, haxe.unit, MUnitのNeko出力の出力形式に対応しています。

“ソースのパスの配列”は、テストのコンパイル時に-cpで指定したディレクトリを配列で指定してください。

“ラベル”は任意の文字列です。プラットフォーム名などをラベルにしておくと失敗の警告にラベルが表示されるので、IDE上で表示する際にどのプラットフォームで失敗したのかわかり安くなります。

Haxe/JavaScriptの場合

# test_js.hxml

#1. JSターゲットでコンパイル
-main sample.TestSample
-js bin/test.js
-lib nanotest
-cp src
-cp test
-debug

#2. node.jsで実行して、結果をファイルに出力
--next
-cmd node "bin/test.js" 1>bin/report_js.txt

#3. 出力したファイルをマクロで読み込んで、テストの情報を読み取る
--next
-lib nanotest
--macro nanotest.NanoTestRunner.readResult('bin/report_js.txt', ['test', 'src'], 'JS')

Haxe/Flashの場合

Flashのデバッグをする場合は、flashlog.txtを使用しますので、Flashのデバッグプレーヤーが必要になります。

# test_swf.hxml

#1. SWFに出力
-main sample.TestSample
-swf bin/test.swf
-lib nanotest
-cp src
-cp test
-debug
-D fdb

#2. Flashを起動して、flashlog.txtのテスト結果をコピー。
--next
-cmd swf_debug bin/test.swf bin/report_swf.txt

#3. flashlogのコピーから結果を読み取り
--next
-lib nanotest
--macro nanotest.NanoTestRunner.readResult('bin/report_swf.txt', ['test', 'src'], 'Flash')

Windows用のFlashを起動するバッチファイル(swf_debug.bat)。test_swfと同じ階層に置く。

:: swf_debug.bat

"C:\Program Files (x86)\FlashDevelop\Tools\flexlibs\runtimes\player\11.9\win\FlashPlayerDebugger.exe" %1 
cp "%APPDATA%\Macromedia\Flash Player\Logs\flashlog.txt" %2

MUnitとの連携

NanoTest v1.0のしくみなら、テスト情報の含まれるテキストファイルさえあればコンパイラ警告として出力が可能です。つまり、実際のテストを行うライブラリがNanoTestでなくても構わないわけです。NanoTest v1.0では、MUnitのテスト時に標準出力される失敗行の情報から、コンパイラ警告を出力する機能がついてます(Neko出力にのみ対応)

1. 標準出力をテキストファイルにリダイレクトするようにMUnit実行。

haxelib run munit run 1>bin\test_result.txt

.munitはこんな感じ↓

version=2.1.0
src=test
bin=bin
report=report
hxml=munit.hxml
classPaths=src
resources=resources
templates=null
coveragePackages=null
coverageIgnoredClasses=null

2. 出力されたテキストをNanoTestで読み込み

以下のような、hxmlを実行する。

# nanotest.hxml

-lib nanotest
--macro nanotest.NanoTestRunner.readResult('bin/test_result.txt', ['src','test'], "MUnit")

これで、MUnitでのテスト内容を、IDE上でデバッグできます。

そのほかの変更

パッケージの変更

パッケージ名が変わりました。

shohei909.nanotest.* -> nanotest.*

メソッドチェーンで、テスト失敗時に詳細情報を出力できるように

class SampleCase extends NanoTestCase {
    public function testBasic() {
        var a = [1, 2, 3, 5];
        var b = [2, 2, 3, 3];
        for (i in 0...a.length) {
            assertEquals(a[i], b[i]).label(i);
        }
    }
}

assertから始まるメソッドから、.label()にメソッドチェーンでつなぐと、追加の情報が出力されます。

上の例では、以下のような出力がされるので、失敗したのが配列の0番目と3番目の要素だったことを知ることができます。

Test failed : expected 1 but was 2 [0]
Test failed : expected 5 but was 3 [3]

-D result_exit_code

出力ファイルをNanoTestでreadResultする際に、result_exit_codeのフラグをつけると、テスト失敗時に返り値1でプログラムが終了します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です