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の一端に触れてみました。

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

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

ではではノシ

関連記事

日記 自作物

2020/5/14

GitHubのコントリビューション数をグラフ化してみた

先日、ブログのトップページにGitHubの草を表示してみたという記事をあげました。 Corgi Lab. ~備忘録のための技術ブログ~ブログ内にGithubの草を生やしてみた今回はちょっとした小ネタです。お気づきの方もいるかもしれませんが、PC限定でブログのページ上部にGithubのコントリビューションを表示してみました。俗にいう「草を生やす」というやつです。特に深い意図はありませんが、これがあるだけでぐっと技術系ブログ色が... GitHubの草(コントリビューション)は日々の活動が可視化されるので、個 ...

この記事を読む

RaspberryPi

2020/5/6

Raspberry Pi4上のUbuntu ServerでCPUクロックを制限する方法

Raspberry Pi4は消費電力が大きく発熱がちょっと心配です。そのため、用途によっては意図的にCPUの動作クロックを絞って消費電力と発熱を抑えるという運用もアリかと思います。 CPUクロックの設定方法の多くはRaspbianを例に挙げていますが、Ubuntu Serverでも同じ方法で設定できたので、備忘録として残しておきたいと思います。 動作環境は、 ・Raspberry Pi4本体:モデルB(メモリ4GB) ・OS:Ubuntu Server 20.04 です。 目次CPU状態のチェッククロック ...

この記事を読む

RaspberryPi Linux

2020/5/2

RaspberryPi4でUbuntu Server 20.04を動かしてみた

新しい遊び道具として、RaspberryPi4(ModelB 4GBメモリ)を買いました。 前モデルと比べて大幅に性能アップしているということで、学習用のLinux環境としても実用的なものになりそうです。ということで、今回はRaspbian(ラズパイの標準OS)ではなく、Ubuntu Serverをインストールして使ってみたいと思います(・∀・) 目次OSイメージのダウンロードSDカードにイメージを書き込む初期起動+設定固定IPアドレスを設定する OSイメージのダウンロード まずはUbuntu Serve ...

この記事を読む

日記

2020/5/14

ブログ内にGithubの草を生やしてみた

今回はちょっとした小ネタです。 お気づきの方もいるかもしれませんが、PC限定でブログのページ上部にGithubのコントリビューションを表示してみました。俗にいう「草を生やす」というやつです。 特に深い意図はありませんが、これがあるだけでぐっと技術系ブログ色が強まるので、遊び半分で組み込んでみました。そこまで難しくないので、その方法を紹介しようと思います。 目次生やすだけなら簡単ちょっとひと工夫画像の取得はwget+Cronであとはブログ内に貼るだけ後日談:自分でグラフをつくってみました 生やすだけなら簡単 ...

この記事を読む

Flutter

2020/4/12

【Flutter】リリースチャンネルについて調べてみた

この記事を書いている2020/04/12時点で、FlutterのiOS実機ビルドが以下のようなエラーで通らなくなっています(´・ω・) Building for iOS, but the linked and embedded framework 'App.framework' was built for iOS Simulator. どうやら、最新のXcode11.4とstableチャンネルの組み合わせが原因らしく、Flutterのチャンネルを切り替えてあげればOKとのことでした。 とりあえず、stab ...

この記事を読む

-Windows

© 2020 Corgi Lab. ~備忘録のための技術ブログ~