Getting a Good Grasp of F# (仮)

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

F#のコードをユニットテストで検証する その4(xUnit)

前回xUnit.net を利用したユニットテストの続きです。前回とは違うやり方で、ひとつのテスト関数に複数のテストデータを渡す方法を試します。

サンプルコード その1
  1. module Sample3
  2. open Xunit
  3.  
  4. let SampleData01 : seq<obj array> =  
  5.         seq [
  6.             [| "";      0 |]
  7.             [| "ab";    2 |]
  8.             [| "ABC";   3 |]
  9.             [| "ABCD";  4 |]
  10.             [| "12345"; 5 |]
  11.         ]
  12.  
  13. [<Theory>]
  14. [<MemberData("SampleData01")>]
  15. let test01(str: string, expected: int) : unit =
  16.     Assert.Equal(str.Length, expected)

4~11行目で5個のテストデータを定義しています。

4行目の変数 SampleData01 で定義した5つのテストデータ(6~10行目)がテスト実行時に、15行目のテスト関数 test01 に渡されます。

15行目のテスト関数 test01 には Theoryアトリビュートが付いています。さらにMemberDataアトリビュートを使ってテストデータ群が格納された変数 SampleData01 の識別子名を文字列として指定して関連付けています。

4行目の変数の型注釈は以下のように書いても同じ意味です。コンパイルも通ります。

  1. let SampleData01 : System.Collections.Generic.IEnumerable<System.Object[]> =  

 

Visual Studio のテストエクスプローラーを実行してみます。

f:id:pongitsune:20160215211834p:plain

 次に、個々のテストデータの型をコンパイル時にチェックできるスタイルに書き直してみます。

サンプルコード その2
  1. module Sample4
  2. open Xunit
  3.  
  4. let SampleData02 = new TheoryData<string, int>()
  5. SampleData02.Add ("",      0)
  6. SampleData02.Add ("ab",    2)
  7. SampleData02.Add ("ABC",   3)
  8. SampleData02.Add ("ABCD",  4)
  9. SampleData02.Add ("12345", 5)
  10.  
  11. [<Theory>]
  12. [<MemberData("SampleData02")>]
  13. let test02(str: string, expected: int) : unit =
  14.     Assert.Equal(str.Length, expected)

4~9行目で5個のテストデータを定義しています。変数 SampleData02 にテストデータ群が格納されます 。5~9行目にかけて TheoryData クラスのAddメソッドを使ってテストデータを1つずつ追加しています。

4行目の TheoryData<string, int> において、test02 に渡すデータの型が string 型とint 型のペアであることを明示的に指定し、コンパイル時の型チェックが行われるようにしてあります。

テストを実行すると「サンプルコード その1」と同様の結果が得られます。

f:id:pongitsune:20160215214059p:plain