すもぎのめも

いろいろあったことをメモしています

シンタックスから NaturalSpec を理解する

テスティングフレームワークのうち、BDD 向けに作成されたものは、スペックをリーダブルにするためのシンタックスを提供しています。NaturalSpec からもいくつかのシンタックスが提供されています。これらの使い方を知ることで、NaturalSpec に親しみ、読みやすいスペックを素早く作成する力を養うことができると個人的には考えています(英語力もあるとなお良い)。


AAA (Arrange-Act-Assert) パターン

Given

シグネチャ
'a -> 'a
解説
テストコンテキスト(テスト対象オブジェクト)を使用してテストを開始することを表します。英語では Given を接続詞的に使用すると、「...を仮定すれば」という意味になります。Given が関数として実行された時間から、テストにかかった時間が計測されます。

As

シグネチャ
'a -> 'a
解説
Given と名称が異なるのみで、機能は同じシンタックスです。表現したい仕様に合わせて選択するのがいいと思います。何かパラメーターを与えるときは Given で、テストコンテキストを○○として扱う、といったときは As を選ぶとか。

When

シグネチャ
'a -> 'a
解説
AAA パターンの Act フェーズで使用します。

It

シグネチャ
'a -> 'a
解説
AAA パターンの Assert フェーズで使用します。大文字で始まるシンタックスは、出力結果を改行します。

Whereas

シグネチャ
'a -> 'b -> 'a
解説
AAA パターンの Assert フェーズで使用します。whereas は 2つのものを比較するときに用いられる接続詞。 Whereas シンタックスは 'a 型の引数と 'b 型の引数を受け取って 'a 型の値を返す関数として実装されていますが、'b 型の引数は使用されず、1番目の 'a 型の引数が戻り値として返されます。

equal

シグネチャ
'a -> 'a -> AssertType * 'a * 'a * 'a
解説
2つの値が等しいかどうかをテストするようにスペックを構築します。should や should'nt と合わせて使用します。

be

シグネチャ
('a -> bool) -> 'a -> AssertType * bool * bool * 'a
解説
'a 型の値を受け取って bool を返す関数を使用して、結果が true になるかどうかをテストするようにスペックを構築します。 should や should'nt と合わせて使用します。

have

シグネチャ
('a -> bool) -> 'a -> AssertType * bool * bool * 'a
解説
be と名称が異なるのみで、機能は同じシンタックスです。表現したい仕様に合わせて選択するのがいいと思います。

should

シグネチャ
('a -> 'b -> AssertType * 'c * 'd * 'e) -> 'a -> 'b -> 'e
解説
equal、be、have のいずれかと期待値、テストする値を受け取って、期待値通りであることをテストします。

shouldn't

シグネチャ
('a -> 'b -> AssertType * 'c * 'd * 'e) -> 'a -> 'b -> 'e
解説
should の否定であり、結果が期待値とは異なることをテストします。

Verify

シグネチャ
'a -> unit
解説
スペックを検証します。テストがすべて OK なら、出力結果に "OK" を追加します。NG の場合は例外を発生させます。Verify はスペックの最後に記述します。


流動的なヘルパー

castingAs

シグネチャ
obj -> 'a
解説
obj 型の引数を 'a 型に変換します。また、出力結果に "casting as 型名" を追加します。

doing

シグネチャ
'a -> 'a
解説
出力結果に "doing" を追加します。

getting

シグネチャ
'a -> 'a
解説
出力結果に "getting" を追加します。

nothing

シグネチャ
'a -> 'a
解説
出力結果に "nothing" を追加します。

solving

シグネチャ
'a -> 'a
解説
出力結果に "nothing" を追加します。


その他

toSpec

シグネチャ
string -> unit
解説
出力結果に任意の文字列を追加します。関数を BDD スタイルで記述する場合に、副作用として toSpec 関数を呼び出し、出力結果に追加したい文字列を指定してください。

改訂履歴

2013/01/04 Given の説明に英語での意味を追加。