「振る舞い駆動開発」とは、TDDに触発されてDan North氏により提唱され発展した手法です。
BDDはTDDの一流派ともいえますが、TDDに対し以下の実現のための原則や工夫が加えられています。
一例として、前述のアウトサイドインTDDもBDDの一種に該当します。なおBDDはTDDから生まれた手法ではあるものの、TDDで欠落しがちになったアジャイルのテストファーストの目的・原則に立ち返るという、原点回帰の方向性も備えています。
ちなみに今日のBDDは、いろいろな意味や定義で使われる用語になってしまっています。分類としては、テストレベルやテストベースのレベルを基準に、コードレベルとユーザーレベルの2つに分類されることがあります。
コードレベルのBDDは、「ユニットテスト」(単体テスト)や、コードレベルの結合テストといったテストレベルを扱う、プログラミングを駆動するためのBDDです。コードレベルのBDDはTDDの一種であり、主に以下に注意が向けられます。
なおコードレベルのBDDのテストコードでは、振る舞いの記述に適したフレームワークを使用するのが一般的です。例えば、「RSpec」「CSpec」などのSpec系フレームワークや、「JBehave」などのBDDフレームワークがBDDでは定番ですが、それらは自然言語に近い構文でテストコードを記述できる特徴を持っています。
require './my_leap'
describe MyLeap do
it "should determine leap year if divisible by 4" do
MyLeap.leap?(8).should be_true
end
it "should not determine leap year if divisible by 100" do
MyLeap.leap?(200).should be_false
end
end
ユーザーレベルのBDDは、受け入れテストやEnd-To-Endのシステムテストといったテストレベルを扱う、ユーザー要求や外部仕様の実現を駆動するBDDです。テストファーストの一種ですが、主に以下の特徴を持っています。
また、ユーザーレベルのBDDは、シンプルなルールや原則で構成されるTDDと違って、ユーザー要求をどう獲得・分析して、設計に導いていくかといったプロセスも包含した手法となっています。
ユーザーレベルのBDDで記述されるテストの一例を下記に示します。
Feature: ウェブページの表示と遷移テスト
Google検索でウェブページの表示と遷移を確認します
Scenario: Searching for test
Given "https://www.google.com/"を開く
When "test"を入力してボタンをクリックする
Then "test - Google Search"というタイトルページが表示されること
ユーザーレベルのBDDでは、テストの記述に特定のフォーマットに合わせるセミフォーマルなアプローチが好まれます。
例えばアジャイルでは、しばしば「ユーザーストーリー」の形式でテストを記述します。テストの拡張性を重視する場合は「データ駆動テスト」や「キーワード駆動テスト」の構造をテストの記述に導入する場合もあります。
BDDでは、テストの記述において「Tests as Documentation」「Specification by Example」という2つの考え方が重視されます。
「Tests as Documentation」はテストをドキュメントとして扱うアプローチです。テストの可読性を上げ、テスト対象の振る舞いを分かりやすく記述することにより、テストをテスト対象の詳細仕様書のように扱えるようにします。これはテスト対象の保守に活用されます。
「Specification by Example」は、例示による要求や仕様の記述を活用するための包括的な考え方です。例示を使って要求獲得や要求仕様化を行うことで、ユーザーとのコラボレーションや変化への対応、ユーザー要求と設計との関連付けを促進することを目的としています。
前述のTests as Documentationは、Specification by Exampleで中心的なアプローチの1つです。Specification by ExampleはBDDやATDDを支える、さまざまなプロセスを定義しており、BDDの基礎を支える考え方と位置付けられています。
やや駆け足でしたが、TDDの発展や他への展開について解説しました。今後の連載では、今回挙げたBDDやアウトサイドインTDDについて、具体的な事例を用いて解説していく予定です。
テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
Railsで目指せ、情熱エンジニア(5):なぜリファクタリングは必要なのか?
Railsで目指せ、情熱エンジニア(7):Railsの人気テストフレームワーク6選!
Railsで目指せ、情熱エンジニア(8):実例で学ぶRailsアプリのテスト方法
UX Clip(28):JavaScriptのテストを開発工数に入れてもらうには?
特集:Visual Studio 2008単体テスト機能徹底活用(後編):VS 2008単体テスト機能でテスト駆動開発/NUnitからの移行
IT用語解説系マンガ:食べ超(3):テスト駆動開発で、みずから築いた壁にドーンCopyright © ITmedia, Inc. All Rights Reserved.