Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

F#のコードをユニットテストで検証する その1

デフォルトのVisual Studio 2013の環境で、F#のコードのユニットテストを実行してみます。以下は普通のコンソールアプリケーションのプロジェクトに含まれているコードです。
Microsoft.VisualStudio.TestTools.UnitTesting名前空間を使うので、予め Microsoft.VisualStudio.QualityTools.UnitTestFramework への参照をプロジェクトに追加しておきます。

コードの例
  1. module Test01
  2. (* 参照の追加:Microsoft.VisualStudio.QualityTools.UnitTestFramework *)
  3. open Microsoft.VisualStudio.TestTools.UnitTesting
  4.  
  5. let rangeData = [1..10]
  6.  
  7. [<TestClass>]
  8. type ``A unit testing exercise``() =
  9.     let mutable myList = []
  10.  
  11.     [<TestInitialize>]  
  12.     member this.setup(): unit =
  13.         // テストの準備
  14.         myList <- rangeData
  15.  
  16.     [<TestMethod>]
  17.     member this.body() : unit =
  18.         let sum = List.fold (+) 0 myList  // リスト要素の総和を求める
  19.         Assert.AreEqual(55 , sum)
  20.  
  21.     [<TestCleanup>]  
  22.     member this.teardown(): unit =
  23.         // テストの後始末
  24.         ()

F#ではキーワード type を使ってclass宣言を行います。8行目の``A unit testing exercise``ユニットテストに用いるクラス名です。ユニットテストで使うことを明示するために TestClassアトリビュートを付加しておきます。クラス名をバッククォート記号「`」二つずつを前後に使って囲っているのは識別子名にホワイトスペースが含まれているからです。F#ではバッククォート記号で識別子名を囲むことによって識別子に使えない文字を混ぜることができます。

12行目のTestInitializeアトリビュートの付いたメソッドsetupはテスト実行前に必要な処理を書きます。F#ではアトリビュート識別子は [< ... >] で囲みます。
メソッドシグネチャは(unit -> unit)。

17行目のTestMethodアトリビュートの付いたメソッドbodyはテストで使われる本体部分です。
メソッドシグネチャは(unit -> unit)。ここではリストの要素(1から10までの整数)の総和を求めて55に等しいかを Assert.AreEqual メソッドを使って検査しています。

22行目のTestCleanupアトリビュートの付いたメソッドteardownはテスト完了後に必要な後処理を書きます。この例では特に何もしないので()を返しています。
メソッドシグネチャは(unit -> unit)。

テストを実行するために、メニューバーから「テスト」→「ウィンドウ」→「テストエクスプローラー」を選択してテスト画面を開きます。

f:id:pongitsune:20160210204115j:plain

テストクスプローラー上で「すべて実行」をクリックするとソースコードはビルドされユニットテストが実行されて結果が表示されます。以下はこのテストが成功した場面。

f:id:pongitsune:20160210204322j:plain

ここで先ほどのコード19行目の Assert.AreEqual を Assert.AreNotEqual に書き変えてわざとテストを失敗させてみます。再度テストを実行すると以下のような結果が得られます。

f:id:pongitsune:20160210204655j:plain