単体テストの考え方/使い方を読んで、テストの書き方、アーキテクチャについて再考するためのリポジトリ。モック、クリーンアーキテクチャを使わないような構成で簡単なAPIを書いてみる。
例の如くガチャのシュミレーションAPIを作成する。
- ガチャを抽選する(ランダム性のテスト)
- ガチャの決済APIを呼び出す(プロセス外依存を含んだテスト)
指定のガチャからアイテムを抽選する。
- gachaId ガチャID
POST
% curl -XPOST localhost:8080/gacha/1/draw | jq
{
"id": 2,
"name": "item2",
"rarity": "N"
}
- ガチャの抽選ロジック
以下の一連の呼び出しをテスト
- ガチャデータの取得 -> ガチャの抽選 -> 抽選したアイテムデータの取得 -> (決済APIの呼び出し)
ゴールデンテストを使用してAPIリクエストからレスポンス取得までの一連の流れをテスト
-
wire 依存性の解決
-
sqlboiler ORM
-
golang-migtate マイグレーション
-
Taskfile タスクランナー
-
dotenv direnv 環境変数の管理
-
testify アサーションに
-
dockertest 結合テスト用にDB準備
-
gomock モック
-
goldie ゴールデンテスト
-
Go1.20
-
MySql
-
docker
go install github.com/google/wire/cmd/wire@latest
brew install golang-migrate
go install github.com/volatiletech/sqlboiler/v4@latest
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-mysql@latest
brew install go-task
go install go.uber.org/mock/mockgen@latest
% task
task: Available tasks for this project:
* generate: execute `go generate` command. generate mock by `gomock` and di by `wire`.
* hello: Hello Test Task.
* db:connect: Connect MySQL container.
* db:run: Run MySQL container.
* db:stop: Stop MySQL container.When stop, container remove.
* generate:di: execute `wire gen` command.
* migrate:create: Create migration file.Migration name must be specified as an argument.ex) task migrate:create -- create_user_table
* migrate:down: Execution migration down.
* migrate:force: Execute force migration version.Migration version must be specified as an argument.ex)task migrate:force -- 2
* migrate:up: Execution migration up.
* migrate:version: Check current migration version.
* test:all: execute all tests.
* test:e2e: execute e2e tests.
* test:integration: execute integration tests.
* test:unit: execute unit tests.
* update:golden: update golden file.