すもぎのめも

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

NaturalSpec 入門

前回の記事 (テストのためのドメイン特化言語(DSL) - NaturalSpec の手引き) では、二つの小さな例で NaturalSpec を使用した。今回は、NaturalSpecの環境をセットアップして、自動テスト可能なシナリオを書く方法を示す。

1. IDEを選択する
最初に NaturalSpec のための統合開発環境を選択しよう。最新版の NaturalSpec は Visual Studio 2008、Visual Studio 2010、自由に利用可能な Visual Studio 2008 Shell またはフリーの IDE である SharpDevelop 3.0 で使用できるはずだ。

2. テスティングフレームワークのインストール
NaturalSpec は基盤となるテスティングフレームワークとして NUnit を使用しているため、NUnit 2.5 をインストールしなければならない。また、VisualStudio 内でテストランナーを使用するために、TestDriven.Net のインストールもお勧めする。

3. F# のインストール
NaturalSpec は完全に F# で書かれており、すべてのスペックも同様に F# で書かれている。 これはあなたが F# でのプログラミングを学ぶ必要があることを意味していないが、動作には F# コンパイラを必要とする。F# August 2010 CTPMicrosoft F# Developer Center からダウンロードできる。

4. NaturalSpec の最新バージョンをダウンロードする
NaturalSpec の最新ライブラリを含んだ圧縮ファイルは GitHub からダウンロードできる。

5. スペックを生成する
このパートはVisual Studio 2010を使用して書かれている。もし SharpDevelopかVisual Studio 2008 Shell を使用しているのであれば、いくつか異なる部分があるかもしれない。

Visual Studio 2010 を起動して F# クラスライブラリを作成しよう。

f:id:smallgeek:20120825233552p:plain
Module1.fs の名称を ListSpec.fs に変更し、Script.fsx はプロジェクトから削除する。

f:id:smallgeek:20120825233840p:plain
“Lib”というフォルダを作成し、その中に NaturalSpec のライブラリを解凍する。
NaturalSpec.dll と nunit.framework.dll をプロジェクトの参照に追加する。

f:id:smallgeek:20120825234517p:plain
ListSpec.fs に次のコードをコピーする。

TestDriven.Net をインストール済みなら、ソリューションエクスプローラーを右クリックしてスペックを実行できる。

TestDriven.Netが気に入らなければ、NUnitGUI ランナーを使用するといい。このように出力される。

f:id:smallgeek:20120825235159p:plain
テストランナーは、同じフォルダ内の ”Spec.txt” というファイルにスペックを生成しているはずだ。

 

まとめ

NaturalSpec を使用するには最低限、SharpDevelopF# コンパイラNUnit、それに NaturalSpec のライブラリが必要となる。

 

次回は NaturalSpec を使用して C# プロジェクト用のスペックを作成する方法を紹介する。

テストのためのドメイン特化言語(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 のようなスペックツールの使用を検討しているか。
私はあなたのフィードバックに非常に興味がある。