すもぎのめも

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

テストのためのドメイン特化言語(DSL) - NaturalSpec の手引き

テスト駆動開発 (TDD) は "Red-Green-Refactor" のサイクルに準ずる有名なソフトウェア開発手法だ。振る舞い駆動開発 (BDD) は自然言語を用いてユニットテストのシナリオを表すアイデアを引き合わせる TDD から派生した手法だ。
BDD に使用できる有名なテスティングフレームワークには、xUnit.netNUnitStorvQMSpecNSpecNBehave などがあげられる。これらは流れるようなインターフェースで記述できるため、読みやすいコードを提供してくれる。さらに、いくつかのフレームワークでは、パスしたユニットテストから自然言語を用いて仕様を生成する機能を提供している。

仕様とはなんだろうか?

"仕様とは素材、製品、またはサービスが満たすべき要件の明確な集合だ"

American Society for Testing and Materials (ASTM) の定義による

ドメインエキスパートと開発者がコミュニケーションをとるためには、仕様が重要なドキュメントとなる。しかし、どのように仕様への準拠を検証すればよいのだろうか? その答えは、ユニットテストを書くことだが、前述のフレームワークを使用して、ユニットテストから仕様のシナリオへと変換するには、やるべきことがたくさんある。

有名なジョエル・テストの7つ目の問いは「仕様があるか?」だ。

NaturalSpec の思想は、ドメイン特化言語ユニットテストに使用することで、ドメインエキスパートたちが受け入れ可能なユニットテストにおいて、彼らのシナリオを直接表現できるようにすることである。NaturalSpec はすべて F# で書かれている ― しかし、使用にあたって F# を学ぶ必要もプログラミングを学ぶ必要もない。

例1-リストを検証する
小さな例を考えてみよう。 新しいリストの実装をテストしたいとき、仕様は以下のようになる。

ここでは BDDスタイルを使用し、シナリオを完全な自然言語で表現した。コメントは Arrange、Act、Assert の “AAA” パターンに従うシナリオを示している。

"Given" というキーワードでテストコンテキスト(テストしたいオブジェクト)を生成できる。サンプルでは5つの要素を持つリストを生成した。"When" というキーワードで、テストコンテキストを用いて、何か処理を行う関数を呼び出せる。
このケースでは、3を削除したいと考えている。 アサート部分("It should" もしくは "It shouldn't" というキーワード)では、いくつかの期待値を指定できるが、それらはテストコンテキストの操作を保持するべきだ。

このシナリオを NUnit ランナー (私は TestDriven.Net を使用している) を介して実行すると、以下のように出力される。


例2-階乗を計算する関数を検証する

階乗を計算する関数を実装したいときはこのとおり。

合わせて NaturalSpec の出力は以下のとおり。


さあ、はじめよう

もちろん、C# のプロジェクトに対しても NaturalSpec を使用できる。"NaturalSpec を使用して C# プロジェクトのスペックを作成する" に小さなサンプルがあるので参照してほしい。
 
自動で検証可能な仕様を書くのが初めてなら、NaturalSpec を GitHub よりダウンロードして、"NaturalSpec 入門" チュートリアルに従ってもいい。

この構文を気に入ってもらえるか、何を変更すべきか。あなたが NaturalSpec のようなスペックツールの使用を検討しているか。
私はあなたのフィードバックに非常に興味がある。