うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

SpecFlowについて

F# Advent Calendarの15日目です。
F# Advent Calendar 2012 : ATND

SpecFlowとは

Documentation · techtalk/SpecFlow Wiki · GitHub
SpecFlowはCucumber系の.NET用テスティングフレームワークです。
元はCuke4NukeというCucumberクローンがあり、そこから派生したものになります。
F#でもC#でも使えます。
Cucumber系なので、featureファイルとそれに対応するStepファイルを書きます。

  • feature : 自然言語で、Given, When, Thenを記述する
  • step : featureのGiven, When, Thenに対応するメソッドを実装する


VisualStudioにて拡張マネージャからSpecFlowをインストールします。

SpecFlowの基本的な説明

C#のクラスライブラリプロジェクトを作成して、NuGetからSpecFlowをインストールします。
そして追加からfeatureファイルを選択して、だいたい次のような感じで書きます。

Foo.feature

// フィーチャーの概要説明を記述するタグ。ドキュメントコメントみたいな。
Feature: SpecFlowのリファレンステスト
  FeatureファイルはVisual Studioのadd onツールをインストールすることで、右クリックの追加からファイルを新規作成できます。

  
// シナリオ。テストメソッドみたいなもの。
Scenario: ここはテストメソッド名になります。
  Given Given句はセットアップ的な事をやるよ
  When テストの実行になるのでだいたいはここでパラメタライズをかくことになって期待結果も書くよ
  |Foo|Bar|
  |1  |2  |
  |2  |4  |
  |0  |0  |
  Then テスト実行時とは別に結果を確認したいものを書く事になるよ
  


ここまで出来たら、Scenario部分にカーソルをあてて、右クリック -> [Generate Step Definition]を選択するとC# のスケルトンコードを生成してくれます。
で、今回はF# なので、Stepコードは別プロジェクトとして実現させます。
F# のプロジェクトを作成し、先ほど作成したC# プロジェクトを参照します。
その上で下記のようなコードを作成します。

C#プロジェクトにあるApp.configに下記を追加

<specFlow>
  <stepAssemblies>
    <stepAssembly assembly="{F#プロジェクトの名前}" />
  </stepAssemblies>
</specFlow>


F#プロジェクトで下記のような実装コード(Stepコード)を実装。
Foo.fs

[<Techtalk.SpecFlow.Binding>]
module Foo

open NUnit.Framework
open TechTalk.SpecFlow

	let [<Given>] ``Given句はセットアップ的な事をやるよ``() = // ここの名前でFeatureファイルと紐付けを見ています。
	    Console.WriteLine "Given句だよ"

	let [<When>] ``Whenテストの実行になるのでだいたいはここでパラメタライズをかくことになって期待結果も書くよ``(table:Table) = 
	    Console.WriteLine "When句だよ"

	let [<Then>] ``テスト実行時とは別に結果を確認(.+)``() = // メソッド名のマッチには正規表現っぽいものを使えるよ。 
	    Console.WriteLine "Then句だよ"

これで、プロジェクトを右クリックして[Run Spec Scenario]を実行してもらえると、テストが実行されるはずです。
実行されない場合は、テストランナーが決定されていないと思うので、メニューバーのオプションからSpecFlowを選択して、設定してください。
ステップコードがNUnitでなければならないという制約はないので、好きなテスティングフレームワークや、独自のコードでよいです。


僕自身はこれはC#で書く事が多いですが、F#でもたまに書きます。
Spockなんかよりは書きにくいなぁと感じる事もあるのですが、まぁまぁいいかなぁと思って使っています。