NemerleUnit で単体テスト


NemerleUnitNUnit を用いた単体テスト用のマクロです。 NemerleUnit を使うと自然言語のように単体テストを記述することが可能になります。

NemerleUnit.dll のコンパイル

NemerleUnit は zip や msi 形式で配布されるアセンブリ群の中に含まれていないので,自前でコンパイルしてやる必要があります。 NemerleUnit のソースコードはチェンジセット 430eb4a78f 時点で Nemerle 1.1.372.0-RC の Nemerle.Compiler API に対応していないので,以下の修正を加える必要があります。

// 修正前
def mods = AttributesAndModifiers(NemerleModifiers.Public, attrs);
// 修正後
def mods = Modifiers(NemerleAttributes.Public, attrs);

修正したら以下のようにコンパイルできます。

ncc /t:library /out:NemerleUnit.dll /r:nunit.framework.dll /r:Nemerle.Compiler.dll /i macros.n

使う

NemerleUnit 名前空間を using するだけで OK です。コンパイル時には NemerleUnit.dll と nunit.framework.dll を参照に指定します。

公式ページにある通り,以下のように記述できます。インデント構文を使った方が自然言語らしく表現できます。

#pragma indent

using NemerleUnit

setup
   def abc = ["a", "b", "c"]

teardown
   ()

test "length of an empty list"
   assert [].Length equals 0

test "length of a three element list"
   assert abc.Length equals 3

test "equals"
   assert abc equals ["a", "b", "c"]
   assert abc does not equal ["c", "b", "a"]

test "contains"
   assert abc.Contains("a")
   assert abc.Contains("b")
   assert abc.Contains("c")

通常の構文で書いた場合は以下のようになります。

using NemerleUnit;

setup
{
   def abc = ["a", "b", "c"];
}

teardown
{
   ();
}

test "length of an empty list"
{
   assert [].Length equals 0;
}

test "length of a three element list"
{
   assert abc.Length equals 3;
}

test "equals"
{
   assert abc equals ["a", "b", "c"];
   assert abc does not equal ["c", "b", "a"];
}

test "contains"
{
   assert abc.Contains("a");
   assert abc.Contains("b");
   assert abc.Contains("c");
}

上記のソースコードをコンパイルしてできたアセンブリを NUnit ランナーで読み込んでやると,以下のようになります。