振る舞い駆動開発(BDD)とは?
振る舞い駆動開発は、ソフトウェアの振る舞いを平易で構造化された言語で記述し、開発者、テスター、ステークホルダーが1つの信頼できる情報源を共有できるようにします。
振る舞い駆動開発、略してBDDはTDDから生まれました。テストファーストの習慣を維持しつつ、テストを読みやすい振る舞いの記述として、通常はプログラマーでない人でも追える Given-When-Then 形式で再構成します。目標は、ビジネスが求めるものと、コードが実際に行うことのギャップを埋めることです。
テストから振る舞い仕様へ
BDDは焦点を「この関数は正しい値を返すか」から「システムはユーザーが期待するとおりに振る舞うか」へと移します。シナリオはドメイン言語で書かれるため、プロダクトオーナーがそれを読み、意図した振る舞いを記述していることを確認できます。
Given-When-Then の構造
- Given: 開始時のコンテキストまたは状態。
- When: アクションまたはイベントが起こる。
- Then: 観測可能な結果が続くべきである。
- シナリオは関連する結果のために複数の Then 句を連ねられます。
実践例
チェックアウトのシナリオは、ほとんど散文のように読めます。Cucumberのようなツールは各行をstep定義のコードにマッピングし、それがシステムを駆動して結果をチェックします。
Feature: Checkout
Scenario: Empty cart
Given a customer with an empty cart
When they open the checkout page
Then they should see "Your cart is empty"BDDが役立つ場面
BDDは要件が曖昧または対立している場合に光ります。シナリオを一緒に書くことで、修正が安価なうちに意見の相違が早期に表面化します。生きた仕様も正確なまま保たれます。現実からずれたシナリオはCIで失敗するからです。
継続的インテグレーションにおけるBDD
BDDシナリオはパイプライン内で自動化された受け入れテストとして実行されます。システムをエンドツーエンドで動かすため、これらは遅くなりがちで、時折フレーキーになります。高速で隔離されたrunnerで実行し、一時的な失敗をリトライすることで信頼できるものに保てます。Latchkeyはこれらの重いスイートを並列に実行し、一時的なフレークを自動リトライできるので、1回のネットワークの瞬断が良好なbuildを赤くすることはありません。
重要なポイント
- BDDは振る舞いを読みやすい Given-When-Then シナリオで記述します。
- 開発者、テスター、ステークホルダーを1つの仕様に整合させます。
- シナリオはCIで自動化された受け入れテストとして実行されます。