Windows

Specflowでビヘイビア駆動開発に触れてみた

ソフトウェア開発には、その考え方や特徴によって「○○開発」と名前が付いている開発プロセスがいくつかありますが、今回はビヘイビア駆動開発(BDD)というものに触れる機会があったので、その覚え書きです。

ビヘイビア駆動開発とは?

ビヘイビア駆動開発(以下、BDD)とは、ソフトウェアの「振る舞い」に注目した手法です。あらかじめ、開発したいソフトウェアの仕様を「振る舞い」として定義しておき、それを満たすコードを実装するというやり方を取ります。

事前にテストコードを作成する形になるので、テストファーストの開発手法の1つです。

SpecflowでBDDに触れてみる

一般的なテスト駆動開発と違い、BDDは自然言語に近い構文でテストを記述していくことが特徴的です。これを実現するためのフレームワークとして、今回はSpecflowというツールを使ってみます。

SpecflowはCucumberというBDDフレームワークのC#版で、VisualStudioに組み込んで使うことができます。ということで、さっそくBDDの一端に触れてみましょう(・∀・)

Specflowプラグインの導入

まずは、VisualStudioにSpecflowのプラグインを導入します。VS2010以降(Express版以外)に対応しているので、今回はVS2017(Community版)に導入してみました。導入自体は「ツール」>「拡張機能と更新プログラム」から検索してインストールするだけです。

テストプロジェクトの作成

続いて、テストプロジェクトを作成します。「ファイル」>「新規作成」>「プロジェクト」からC#の単体テストプロジェクトを選択します。

プロジェクトができたら、デフォルトで作成されるテストコード(UnitTest1.cs)は不要なので削除しておきます。

必要なファイルのインストール

Specflowの動作に必要なファイルをインストールしていきます。「ツール」>「NuGetパッケージマネージャー」>「パッケージマネージャーコンソール」を開いて、以下のコマンドを実行します。

PM> Install-Package SpecFlow -ProjectName <プロジェクト名>

プロジェクト中に「App.config」という設定ファイルができていれば、インストールは成功です。

Featureファイルの作成

ここからはテストシナリオの作成に入ります。まずはFeatureファイルというファイルを作ります。プロジェクトで「追加」>「新しい項目」>「Specflow Feature File」を選択します。

すると、以下のように英語で書かれたファイルが追加されますが、実はこれがテストシナリオそのものです。このように自然言語でテストシナリオを記述できるのが、BDDの特徴となります。

上記のテストシナリオでは、電卓の足し算を例にいくつかのキーワードでシナリオを定義しています。以下、各キーワードとそれに対応したシナリオの説明です。

キーワード 意味 シナリオ
Given 事前条件 電卓に50を入力する
And 追加の事前条件 電卓に70を入力する
When 試行 足し算のボタンを押す
Then 事後条件(期待する結果) 結果が120となっていること

一見するとテストコードに見えませんが、これをSpecflowが解釈してテストとして実行してくれます。これにはちょっとびっくりしました(゚_゚;)

Stepファイルの作成

もちろん、シナリオだけではテストができないので、シナリオと紐付けるテストコードを実装する必要があります。

まずは、テストそのものを実行するテストランナーを指定します。App.configを開き、以下のような記述を書き加えます。今回はVS2017にデフォルトで入っているMSTestを指定しました。

続いて、先ほど作成したFeatureファイルを開き「右クリック」>「Generate Step Definitions」を選択すると、以下のようなウインドウが開きます。シナリオ全てが選択されていることを確認し「Generate」を押下しましょう。

これでfeatureファイルに定義したシナリオに対応したテストコードのひな形が自動生成されます。ちゃんと各キーワードに対応したメソッドが用意されていることが分かります。

テスト対象の作成とテストコード実装

ここまでで、テストシナリオ+テストコードのひな形は作成できました。あとはテスト対象となるプログラムと、それに合わせたテストコードを実装していくだけです。

まずは電卓クラス。今回は簡単のために、2つの数の足し算のみを実装しました。

続いてテストコード。こちらは電卓クラスのインスタンスを最初に作成し、各シナリオに対応するメソッド中でそのインスタンスに対する操作をしています。最後の「Then」に対応するコードは計算結果のチェックなので、Assertを入れています。

テスト実行

ようやくテスト実行までこぎ着けました。「テストエクスプローラー」>「すべて実行」からテストを実行してみます。ちゃんと足し算ができているようですね(・∀・)

このように、自然言語に近い形で記述したテストシナリオに従ってテストを実行することができました。

まとめ

今回はだいぶ簡単な例ではありましたが、Specflowを使ってBDDの一端に触れてみました。

個人的に感じたところとしては、テストシナリオ自体を自然言語で書けるところはかなり魅力的でした。あとから振り返っても何をテストしたいのか一目瞭然なので、メンテナンス性も上がりそうです。

なかなかテスト手法に対して学ぶ機会は多くないので、今回はとても良い勉強になりました。興味のある方はこれを参考に試してみてはいかがでしょうか?

ではではノシ

関連記事

Linux

2019/10/6

Docker + Growiでイントラ向けWikiを立ち上げる

チーム開発をしていくうえで、課題の1つになるのが情報共有です。チームの歴史が長いと経験値は溜まっていきますが、それらが情報として整理されていないとメンバー交代時などに大きなコストが発生します。 そこで、イントラ向けのナレッジベース(Wiki)を探していたところ、Growiという良さげなOSSを見つけたので、お試し環境を立ち上げてみることにしました。手元の環境はUbuntu18.04ですが、Linuxであれば大体同じような手順になると思います。 目次1 Dockerのインストール2 Growiの準備2.1 ...

この記事を読む

Linux

2019/8/14

カゴヤVPSで自分専用の開発環境を立ち上げてみた

どこからでもアクセスできる自分専用の開発環境が欲しい…。 そんな願いを叶えるべく、VPSのことを調べていたのですが、いままで「なんか難しそう…」と尻込みしていました。しかし、最近は値段も安くて扱いやすいVPSも増えてきたので、この機会に試してみることにしました。 ということで、今回はVPSを契約して最低限の環境を立ち上げるまでの備忘録です。 目次1 VPSについて1.1 VPSって何?1.2 カゴヤのVPSを契約してみた2 手順1:インスタンスを立ち上げる3 手順2:インスタンスにSSH接続する4 手順3 ...

この記事を読む

Windows

2019/5/5

Windows10で不要なブートエントリを削除する

Windowsのブートまわりで少しハマったので覚え書きです。 私のメインPCはWindows10とUbuntuのデュアルブートだったのですが、とある事情でUbuntuを削除しWindowsのみの構成に戻すことにしました。ちなみに、デュアルブート時の環境はこんな感じ(だったはず)。 元に戻したくなったときのことを考え、別HDD(ドライブB)にUbuntuとGRUBを入れ、GRUB経由でWindowsとUbuntuを立ち上げる形にしていました。 そのため、起動ドライブをWindowsのドライブ(ドライブA)に ...

この記事を読む

C言語 プログラミング

2018/12/25

mmapの下処理にftruncate関数を利用する

以前このブログで公開した記事の中に、C言語のmmap関数の使い方についてまとめた記事がありました。 Corgi Lab. ~備忘録のための技術ブログ~  3 shares 3 users 4 pocketsファイルの読み書きにmmapを使ってみるプログラムのループ中でファイルに何かしらのデータを書き込むとき、そのたびにwriteをしていたのではディスクへのI/Oが頻発してしまい、パフォーマンスに影響することがあります。「C言語だとそんなときはmmapを使うと良い」と ...

この記事を読む

Mac Linux

2018/12/2

Mac mini (2012) にUbuntu18.04をインストールしてみた

今年のアップデートにより、ついに旧型となってしまったMac mini(2012年モデル)。私の自宅にも箱に収められたままひっそりと眠るMac miniがありました。 約6年前のモデルと言うことで、最近のマシンから見ればスペック的に見劣りするPCになってしまいましたが、Linux機として運用するならまだまだ輝けるはず! ということで、今回はMac miniをUbuntu専用マシンとして復活させてみたので、その備忘録です。 目次1 用意するもの2 Ubuntuのインストール3 インストール後のセットアップ3. ...

この記事を読む

-Windows

Copyright© Corgi Lab. ~備忘録のための技術ブログ~ , 2019 All Rights Reserved.