BDDとAAAパターンの関連性と実装方法
Go
テスト
testify
BDD
知識
運用
原則
Behavior-Driven Testing(BDD)とAAA(Arrange-Act-Assert)パターンは相互補完的な関係にあり、異なるレベルでテストの品質を向上させる。
概念の違い
BDD(Behavior-Driven Testing)
- テストの哲学・アプローチ
- 「システムがどう振る舞うべきか」を記述
- ビジネス視点での仕様定義
AAA(Arrange-Act-Assert)パターン
- テストコードの構造化手法
- テストの実装を整理するテンプレート
- 技術的な実装パターン
マッピング関係
| BDD(Given-When-Then) | AAA パターン | 役割 |
|---|---|---|
| Given(前提条件) | Arrange | テストの初期状態を設定 |
| When(実行内容) | Act | テスト対象の振る舞いを実行 |
| Then(期待結果) | Assert | 振る舞いの結果を検証 |
実装例
BDDスタイルの記述(仕様)
gherkin
Feature: メモ管理
Scenario: カテゴリ付きメモの作成
Given ユーザーがログインしている
And カテゴリ"Go"を指定している
When メモを作成する
Then メモが保存される
And カテゴリが関連付けられるAAAパターンでの実装
go
func (suite *MemoInteractorTestSuite) TestCreate() {
suite.Run("正常系: カテゴリ付きメモの作成", func() { // BDD的な命名
// Arrange: Given(前提条件)
userID := uint(1)
input := request.PostMemoCreateRequest{
Title: "Test Title",
Categories: []request.PostMemoCategory{{Name: "Go"}},
}
// Act: When(実行)
result, err := suite.interactor.Create(suite.ctx, userID, input)
// Assert: Then(期待結果)
suite.NoError(err)
suite.True(result)
})
}組み合わせの利点
1. 意図の明確化
- BDD: テスト名で「何を」テストするか明確に
- AAA: テストの「どのように」を構造化
2. 異なるレベルでの価値提供
ビジネスレベル(BDD)
- プロダクトオーナーが理解可能
- 受け入れ基準として機能
- 仕様のドキュメント化
実装レベル(AAA)
- 開発者にとって読みやすい
- 一貫性のあるテスト構造
- デバッグが容易
3. 段階的な抽象化
plaintext
レベル1: ビジネス要件(BDD)
"ユーザーはカテゴリを指定してメモを作成できる"
レベル2: テストシナリオ(BDD + AAA構造)
"正常系: カテゴリ付きメモの作成"
- Given: ログイン済みユーザー
- When: カテゴリ付きメモ作成
- Then: 成功
レベル3: 実装詳細(AAA)
Arrange: モック設定、テストデータ準備
Act: interactor.Create()呼び出し
Assert: 戻り値の検証まとめ
BDDとAAAは対立する概念ではなく、異なるレベルで協調する:
- BDD: テストの「Why(なぜ)」と「What(何を)」を定義
- AAA: テストの「How(どのように)」を構造化
この組み合わせにより、ビジネス価値を明確にしながら、技術的にも整理されたテストコードを実現できる。