Skip to content

Go-DDDマーケットプレイスアプリケーション Go Cucumber (Godog) セットアップガイド

このガイドでは、プロジェクトでの振る舞い駆動開発(BDD)テスト用のGo Cucumber(Godog)のセットアップと使用方法について説明します。

振る舞い駆動開発(BDD)とは?

振る舞い駆動開発は、ソフトウェアプロジェクトにおいて開発者、QA、および非技術的またはビジネス参加者間のコラボレーションを促進するアジャイルソフトウェア開発プロセスです。ステークホルダーとの議論を通じて、望ましいソフトウェアの振る舞いについて明確な理解を得ることに焦点を当てています。

BDDはテスト駆動開発(TDD)の拡張であり、実装の詳細よりもシステムの振る舞いの側面を強調しています。

Cucumber/Godogとは?

Cucumberは、Gherkinと呼ばれる自然言語形式でテストケースを記述できるようにすることでBDDをサポートするツールです。GodogはCucumberのGo言語実装です。

Gherkinは、人間が読みやすい形式でテストシナリオを定義するためのシンプルなキーワードセットを使用します: - Feature:高レベルのビジネス要件を説明します - Scenario:特定のテストケースを説明します - Given:初期コンテキストを設定します - When:イベントまたはアクションを説明します - Then:期待される結果を説明します - And:追加のコンテキスト、イベント、または期待を追加します

プロジェクトでのGodogのセットアップ

1. Godogパッケージのインストール

Godogパッケージをあなたのgoモジュールに追加します:

cd app/backend
go get github.com/cucumber/godog

2. Featuresディレクトリの作成

フィーチャーファイルとステップ定義のためのディレクトリ構造を作成します:

mkdir -p features/steps

3. フィーチャーファイルの作成

フィーチャーファイルはGherkin構文で書かれ、アプリケーションの振る舞いを記述します。featuresディレクトリにフィーチャーファイルを作成します。例えば、features/product/product_management.feature

注意: 日本語でフィーチャーファイルを書く場合は、ファイルの先頭に # language: ja を追加してください。これにより、Gherkinキーワード(「フィーチャ」、「シナリオ」、「前提」、「もし」、「ならば」、「かつ」)を日本語で使用できるようになります。詳細については、Japanese Cucumber Support を参照してください。

# language: ja
フィーチャ: 商品管理
  システム内の商品を管理するために
  ユーザーとして
  商品の作成、読み取り、更新、削除ができる必要があります

  シナリオ: 新しい商品を作成する
    前提 商品の詳細を持っています
      | name        | price |
      | テスト商品  | 10.99 |
    かつ 出品者を持っています
    もし 新しい商品を作成します
    ならば 商品がシステムに保存されるべきです
    かつ IDで商品を取得できるべきです

  シナリオ: 既存の商品を更新する
    前提 既存の商品を持っています
    もし 商品の詳細を更新します
      | name           | price |
      | 更新された商品 | 15.99 |
    ならば 商品の詳細がシステムで更新されるべきです

  シナリオ: 商品を削除する
    前提 既存の商品を持っています
    もし 商品を削除します
    ならば 商品がシステムから削除されるべきです

4. ステップ定義の実装

ステップ定義は、フィーチャーファイルで説明されているステップを実装するGo関数です。features/stepsディレクトリにファイルを作成します。例えば、features/steps/product_steps.go

package steps

import (
    "fmt"
    "github.com/cucumber/godog"
    "github.com/google/uuid"
    "github.com/sklinkert/go-ddd/internal/domain/entities"
    "strconv"
)

// ProductContext は商品関連のステップの状態を保持します
type ProductContext struct {
    productDetails map[string]string
    product        *entities.Product
    seller         *entities.Seller
    validatedSeller *entities.ValidatedSeller
    err            error
}

// NewProductContext は新しいProductContextを作成します
func NewProductContext() *ProductContext {
    return &ProductContext{}
}

// RegisterSteps は商品ステップをgodogスイートに登録します
func (p *ProductContext) RegisterSteps(ctx *godog.ScenarioContext) {
    ctx.Step(`^商品の詳細を持っています$`, p.iHaveProductDetails)
    ctx.Step(`^出品者を持っています$`, p.iHaveASeller)
    ctx.Step(`^新しい商品を作成します$`, p.iCreateANewProduct)
    ctx.Step(`^商品がシステムに保存されるべきです$`, p.theProductShouldBeSavedInTheSystem)
    ctx.Step(`^IDで商品を取得できるべきです$`, p.iShouldBeAbleToRetrieveTheProductByID)
    ctx.Step(`^既存の商品を持っています$`, p.iHaveAnExistingProduct)
    ctx.Step(`^商品の詳細を更新します$`, p.iUpdateTheProductDetails)
    ctx.Step(`^商品の詳細がシステムで更新されるべきです$`, p.theProductDetailsShouldBeUpdatedInTheSystem)
    ctx.Step(`^商品を削除します$`, p.iDeleteTheProduct)
    ctx.Step(`^商品がシステムから削除されるべきです$`, p.theProductShouldBeRemovedFromTheSystem)
}

// ステップ定義関数を実装します...
// (完全な実装はfeatures/steps/product_steps.goファイルを参照してください)

5. テストランナーの作成

Godogテストスイートをセットアップして実行するテストランナーを作成します。featuresディレクトリにファイルを作成します。例えば、features/godogs_test.go

package features

import (
    "github.com/cucumber/godog"
    "github.com/cucumber/godog/colors"
    "github.com/sklinkert/go-ddd/features/steps"
    "os"
    "testing"
)

func TestFeatures(t *testing.T) {
    opts := godog.Options{
        Output:      colors.Colored(os.Stdout),
        Format:      "pretty",
        Paths:       []string{"features"},
        Randomize:   0,
        StopOnFailure: false,
    }

    suite := godog.TestSuite{
        Name:                 "godogs",
        TestSuiteInitializer: InitializeTestSuite,
        ScenarioInitializer:  InitializeScenario,
        Options:              &opts,
    }

    if suite.Run() != 0 {
        t.Fatal("non-zero status returned, failed to run feature tests")
    }
}

func InitializeTestSuite(ctx *godog.TestSuiteContext) {
    // テストスイートのセットアップをここで初期化します
}

func InitializeScenario(ctx *godog.ScenarioContext) {
    // 商品ステップを初期化します
    productContext := steps.NewProductContext()
    productContext.RegisterSteps(ctx)
}

テストの実行

Godogテストを実行するには、標準のGoテストコマンドを使用します:

cd app/backend
go test ./features -v

GodogでのBDDのベストプラクティス

  1. 振る舞いに焦点を当てる:実装の詳細ではなく、システムの振る舞いを記述するフィーチャーファイルを書きます。

  2. ドメイン言語を使用する:非技術的なステークホルダーにも理解できるように、フィーチャーファイルではドメインの言語を使用します。

  3. シナリオを独立させる:各シナリオは独立しており、前のシナリオの状態に依存しないようにします。

  4. 複数の例にテーブルを使用する:同じシナリオの複数の例をテストするためにGherkinテーブルを使用します。

  5. ドメインごとにフィーチャーを整理する:フィーチャーファイルをドメインまたは機能領域ごとに整理して、見つけやすく保守しやすくします。

  6. ステップ定義を再利用する:重複を減らすために、複数のフィーチャーファイル間でステップ定義を再利用します。

  7. 状態を共有するためにコンテキストを使用する:同じシナリオ内のステップ間で状態を共有するためにコンテキストオブジェクトを使用します。

結論

GodogはGoプロジェクトでBDDを実装するための強力な方法を提供します。このガイドに従うことで、プロジェクトでGodogをセットアップし、すべてのステークホルダーが理解できる方法でシステムの振る舞いを文書化するBDDテストの作成を開始できます。