« [コラム] リファクタリングはどっちへ進むべきだろう? (了) | トップページ | [コラム] F# で TDD (@TDD道場#06) »

2011年1月 9日 (日)

[コラム] F# で NUnit するには

To write unit-tests with F# and NUnit, as follows.

  1. Add reference to nunit.framework
  2. To declare the class, use the "type" keyword. Then, add "TestFixture" attribute.
  3. To declare the instance-method, use the "member" key word. And, give "Test" attribute.

Please look at the following sample code. Enjoy Test-First!

Fsharp_and_csharpexpress F# は、 無償でも使えます。となると、 TDD.NET としてはテストファーストしてみないわけにはいけません。
といっても、 NUnit への参照を設定してあげれば、 Assert クラスを呼び出すことは普通にできます。 あとは、 TextFixture などの属性をちゃんと付けたクラス定義が出来ればよいだけですから、 分かってしまえば難しいことはありません。 いつもの FizzBuzz をテストするコードは、 次のようになります。 コメントに C# との対比を書きました

// TEST CODE
namespace FizzBuzzByFSharp

open System  //using 宣言
open NUnit.Framework
open FizzBuzzByFSharp.FizzBuzz

[<TestFixture()>]
type FizzBuzzTest() = //クラス宣言

  [<TestCase(1, "1")>]
  [<TestCase(2, "2")>]
  [<TestCase(3, "Fizz")>]
  [<TestCase(5, "Buzz")>]
  [<TestCase(15, "Fizz Buzz")>]
  member x.SayTest n expected :unit = //インスタンスメンバー関数 SayTest
    Assert.AreEqual(expected, FizzBuzz.Say(n))

クラス宣言には括弧 「()」 が必要です。 それが無いと、 引数無しのコンストラクターが生成されないため、 NUnit ランナーから呼び出せません。
インスタンスメンバー関数の 「x」 は、 y でも z でも、 お好きに。
上の例では、 テストメソッド SayTest の引数は、 n と exptected だと思って ( とりあえず ) OK です。 引数に型指定をしていませんが、 コンパイラーが型推論してくれます。 明示的に型指定をしたければ、 「n expected」 のところを 「(n:int) (expected:string)」 のように書きます。
また、 テストメソッド SayTest の戻り値の型として 「:unit」 と書いてあります。 これは void 型と同じだと思って ( とりあえず ) OK です。 戻り値の型も、 書かなくてもコンパイラーが型推論してくれます。

このテストコードでは、 テスト対象の製品コードは 「FizzBuzz.Say(n)」 となっています。 C# 的に言えばスタティックメソッドですね。 製品コードは次のようです。

// PRODUCT CODE
module FizzBuzzByFSharp.FizzBuzz //Moduleといえば、VBでおなじみ。 C# 的にはスタティッククラス

let Say (n:int) :string = //スタティックな関数 Say
  if (n % 15) = 0 then "Fizz Buzz"
  elif (n % 3) = 0 then "Fizz"
  // ...以下省略 (...omitted)

なお、 NUnit 2.5.5 で試しましたが、 まだ F# のプロジェクトファイルは認識してくれませんでした。 テストコードが入ったアセンブリを直接開く必要があります。

|

« [コラム] リファクタリングはどっちへ進むべきだろう? (了) | トップページ | [コラム] F# で TDD (@TDD道場#06) »

*コラム」カテゴリの記事

<NUnit>」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [コラム] F# で NUnit するには:

« [コラム] リファクタリングはどっちへ進むべきだろう? (了) | トップページ | [コラム] F# で TDD (@TDD道場#06) »