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

2020/3/28

SSHで公開鍵認証を設定する方法

これまでに何度かLinuxでサーバーを立てて遊んだりしていますが、毎回忘れてしまうのがSSHの公開鍵認証の設定方法です。一度設定してしまえば頻繁に触るものでもないので、ついつい忘却の彼方へ消えてしまいます(´・ω・`) この先、毎回調べなおすのも面倒なので、これを機に手順をまとめておくことにしました。ちなみに、サーバー(接続される側)がLinuxの想定です。 目次手順1:クライアント側で鍵ペアを作る手順2:サーバーに公開鍵を設定する手順3:SSHサーバーの設定 手順1:クライアント側で鍵ペアを作る まずは ...

この記事を読む

Flutter

2020/3/10

【Flutter】FutureBuilderで非同期にWidgetを生成する

ここ最近、Flutterでアプリを作ってきてある程度の知識がたまってきたので、徐々にこちらでもアウトプットしていこうと思います。 アプリの機能が複雑になってくると、外部との通信や重たい処理の終了を待ってからWidgetを生成したいときがあります。そんなときはFutureBuilderという仕組みを使うと簡単に非同期でWidgetが生成できます。 目次FutureBuilderの使い方builderについて非同期処理の状態を見る非同期処理の結果を取り出すまとめ参考 FutureBuilderの使い方 Fut ...

この記事を読む

日記 自作物

2020/3/7

FlutterでToDoアプリをつくってみた

最近、Flutterを使ったモバイルアプリの開発にハマっているのですが、前回このブログでも紹介した「SaltyStock」というアプリに続き、新しいアプリをリリースしました(・∀・) App Store‎CotoMemo‎CotoMemoはタブ型のToDoアプリです。仕事からプライベートまで、日々のやるべきこと(Coto)を気軽にメモ(Memo)する感覚で整理することができます。【主な機能】・タブによるタスク管理タブ毎にタスク整理ができるので、このアプリ1つで仕事もプライベートもあら... リリースしたの ...

この記事を読む

日記 自作物

2019/12/22

FlutterでiOS/Androidアプリを作ってみた

2019年の密かな目標の1つとして「スマホアプリを作ってリリースする」というのを掲げていたのですが、なんとか年内に達成することができました(・∀・) どうせ作るならiOS/Android両対応がいい!ということで、FlutterというGoogle製のフレームワークを使いました。開発したのは「SaltyStock」というアプリです。長期保有して塩漬け状態になっている株式銘柄を管理するというかなりニッチなアプリです笑。 「個人的にこういうのあったらいいな」というものを作ることができたので、概ね満足です。もし興 ...

この記事を読む

Linux

2020/3/10

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

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

この記事を読む

-Windows

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