すもぎのめも

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

NaturalSpec を使用したパラメータ化されたシナリオ

前回の記事では NaturalSpec についての多くを書いた。今回はパラメータ化されたシナリオを使用する方法を示す。

1. 事前に定義されたシナリオを使用する
定義済みのパラメータ化されたシナリオを書くことによって、多くの異なるテストケースを持ったシナリオスイートを簡単に作成できる。

NUnit を使用してこれらのシナリオを実行した場合、次のように出力される


2. ScenarioTemplate 属性を使う
2つ目の、より短いオプションは NUnit の新しい TestCase 属性を継承した ScenarioTemplate 属性を使うことだ。

このコードは4つの異なるシナリオを作成し、NUnit はそれらを別々に表示・通知する。

f:id:smallgeek:20120826164409p:plain


3. ScenarioSource 属性を使用する
3つ目のオプションは、ScenarioSource属性を使用することだ。ここで、テストデータを生成する関数を定義する。

その後、NaturalSpec にどのテストデータをシナリオが使用するかを教えてやる必要がある。

f:id:smallgeek:20120826164920p:plain


まとめ
時に、異なるパラメータ群を使用してシナリオをテストすることは理にかなっている。 ScenarioTemplate 属性を使用すれば、簡単にシナリオをパラメータ化することができる。さらに柔軟性が欲しければ、事前に定義されたシナリオに、カスタマイズされたパラメータか、ScenarioSource 属性を合わせて使用すればいい。

NaturalSpec とモックオブジェクト

前回の投稿では、NaturalSpec手引きとして、開始手順と、NaturalSpec を使用した C# プロジェクトの自動テスト可能なシナリオの記述の仕方を示した。今回は、前回と同じ ”Car-Dealer” サンプルを使用して、NaturalSpec でモックオブジェクトを利用する。

モックオブジェクトは、テスト駆動開発(TDD)で重要なテクニックの1つであり、複雑な振る舞いのシミュレートを可能にする。


もしオブジェクトが次に示す特性のうち、どれか一つでも備えているのであれば、その場所にモックオブジェクトを使うと便利かもしれない。

  • 非決定的な結果を提供している (例:現在の時刻や温度)
  • 生成、または再現するのが難しい状態値を持つ(例:ネットワークエラー)
  • 遅い(例:テストの前に初期化を必要とする完全なデータベース)
  • まだ存在していないか、振る舞いを変更できる
  • テストの目的のために情報やメソッドが含まれていなければならない

 


サンプルでは、Dealer.SellCar() メソッドをモックとしたい。最初のステップは Dealer 用の C# インターフェイスを作成することだ。

NaturalSpec は基盤となるモックフレームワークとして Rhino.Mocks を使用しているため、スペックライブラリに Rhino.Mocks.dll への参照を追加しなければならない。

これでスペックを修正できる。

ご覧のとおり、(具象 Dealer の代わりにモックされた IDealer インターフェイスを取得するために)パート4を変更した。パート7では、モックに振る舞いを登録した。

私たちは、Bert.SellCar が引数に30000を指定して呼び出されるたびに、夢の車を戻り値とするようなそれを希望している。
もしモックされた関数が呼び出されたのなら、Verify 関数は確認を行う。
そのシナリオは失敗しないだろう。

NUnit runner でスペックを確認すると、次のように出力される。

NaturalSpec を使用して C# プロジェクトのスペックを生成する

前回の2つの記事では、NaturalSpec紹介し、使用方法を示した。今回は NaturalSpec を使用して C# プロジェクトの自動テスト可能なシナリオを記述する方法を示す。"最初にテストを書く" TDD の原則のように、私たちはスペックを初めに書き、"Red-Green-Refactor" のサイクルに身を委ねる。

"Red" – 失敗するシナリオのスペックを作成する
まずは、"Spec.CarSelling" という F# のクラスライブラリプロジェクトを作成し、プロジェクトの参照に NaturalSpec.dll と nunit.framework.dll を追加した (詳細は "NaturalSpec 入門" を参照してほしい)。

ここで最初のシナリオを書ける。

この段階でシナリオの準備が整っているが、コンパイルされていない。これは "Red" の段階の準備が整ったことを意味する。

"Green" – テストが通るパスを作成する
テストをグリーンにするために、"CarSellingLib" という C# のクラスライブラリを作成し、CarType という列挙体と Dealer、それに Car というクラスを定義する。YAGNI 原則にこだわって、スペックをグリーンにするためだけの最小の実装を行う (出力機能のために ToString メソッドも合わせて)。

スペックプロジェクトにプロジェクト参照を追加したら、そのユニットテストが通るだろう。これで "Green" ステップが完了する (スペックを実行する方法がわからなければ、"NaturalSpec 入門" を参照してほしい)。スペックが "Green" になったため、もっとシナリオを追加できる。

再び "Red" のフェーズにきた。

"リファクタリング" - 重複を排除し、パターンに従うようにコードを修正する
"Green" のスペックを作成したあと、いくつかのリファクタリングを行うと、プロジェクトコードはこのようになる。

スペックの出力は以下のとおり。

まとめ
NaturalSpec を使用して C# プロジェクトを "Red-Green-Refactor" サイクルで開発する方法を示した。この方法で簡単に自然言語でのスペックを取得できる。