ユーザーアイコン

mizuko

4日前

0
0

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スタイルの記述(仕様)

Feature: メモ管理 Scenario: カテゴリ付きメモの作成 Given ユーザーがログインしている And カテゴリ"Go"を指定している When メモを作成する Then メモが保存される And カテゴリが関連付けられる

AAAパターンでの実装

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. 段階的な抽象化

レベル1: ビジネス要件(BDD) "ユーザーはカテゴリを指定してメモを作成できる" レベル2: テストシナリオ(BDD + AAA構造) "正常系: カテゴリ付きメモの作成" - Given: ログイン済みユーザー - When: カテゴリ付きメモ作成 - Then: 成功 レベル3: 実装詳細(AAA) Arrange: モック設定、テストデータ準備 Act: interactor.Create()呼び出し Assert: 戻り値の検証

まとめ

BDDとAAAは対立する概念ではなく、異なるレベルで協調する:

  • BDD: テストの「Why(なぜ)」と「What(何を)」を定義
  • AAA: テストの「How(どのように)」を構造化

この組み合わせにより、ビジネス価値を明確にしながら、技術的にも整理されたテストコードを実現できる。