Getting a Good Grasp of F# (仮)

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

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

前回と同じく Visual Studio 2013 のテストエクスプローラーから xUnit.net を使ったユニットテストを行います。今回は1つのテスト関数に複数のテストデータを渡す方法を試します。

xUnit.net を使ったコードの例
  1. module Sample2
  2. open Xunit
  3.  
  4. let fibonacci (nth: int) : int=
  5.     let rec auxFib (acc1: int) (acc0: int) (count: int) : int =
  6.         match count with
  7.         | 0 -> acc0
  8.         | 1 -> acc1
  9.         | _ -> auxFib (acc1 + acc0) acc1 (count - 1)
  10.     auxFib 1 0 nth
  11.  
  12. [<Theory>]
  13. [<InlineData( 0,  0)>]
  14. [<InlineData( 1,  1)>]
  15. [<InlineData( 2,  1)>]
  16. [<InlineData( 3,  2)>]
  17. [<InlineData( 4,  3)>]
  18. [<InlineData( 5,  5)>]
  19. [<InlineData( 6,  8)>]
  20. [<InlineData( 7,  13)>]
  21. [<InlineData( 8,  21)>]
  22. [<InlineData( 9,  34)>]
  23. [<InlineData(10,  55)>]
  24. [<InlineData(11,  89)>]
  25. [<InlineData(12,  144)>]
  26. [<InlineData(13,  233)>]
  27. [<InlineData(14,  377)>]
  28. [<InlineData(15,  610)>]
  29. let ``Fibonacci number``(nth: int, expected: int) : unit =
  30.         let actual = fibonacci nth
  31.         Assert.Equal(expected, actual)

 4行目の fibonacci というフィボナッチ数列の第 n 項(n は0以上の整数)を求める関数をユニットテストの対象とします。

12行目 Theory アトリビュートをテスト関数 ``Fibonacci number`` (29行目から始まる)に付加します。

Theory 以降に続く13~28行目の InlineData アトリビュートの引数で指定したテストデータが ``Fibonacci number`` の引数として渡ります。InlineData からデータを渡す回数分のテストが実行されます。ここでは16個のテストデータを置いたので16回のテストが実行されることになります。

 テストデータ用のフィボナッチ数の値は、サイト「THE ONーLINE ENCYCLOPEDIA OF INTEGER SEQUENCES® 」からお借りしました。

ユニットテストの実行結果

f:id:pongitsune:20160214214938p:plain

テスト関数の定義は一つですが16回のテストが実行されていることがわかります。