🐁
go test で docker 起動
はじめに
本物のDBでテストするの大切ですよね。
ent.
だとテスト用にSQLite
を使うことができるのですが
やっぱり本物のDB(本物により近い環境)でテストはしたいという気持ちがあります。
テスト用にDBコンテナを常駐させてもよいと思いますが、
- 動作確認用で起動させるDBと別にしたい
- ポート番号の管理をよしなにしたい
- テスト実行のたびにデータ削除がめんどくさい
- データ削除のためトランザクションを貼るのがめんどくさい
- Makefileなどに一連のスクリプトを記述するのもめんどくさい
という気持ちもあります。
moby
を使うことでGo
コード内でdocker
を操作して
上記のもろもろが解消できそうだったので試してみました。
とりあえず動けばいいやで作成したのでエラー処理やdefer
処理は雑です。
こーど
-
setup()
にてイメージプル -> コンテナ起動(本当はここでマイグレーション実行) -
m.Run()
にてテスト実行 -
teardown()
にてコンテナストップ -> 削除
しーあい
ぽいんと
- コンテナが起動するまで待機
テスト実行したら固まりました。 - GitHubActionsで
services
でpostgres
imageを指定
CIで以下のエラーが発生したので指定してみました。Error response from daemon: No such image: postgres:14.6-alpine
- GitHubActionsではランダムポート起動が不発
ローカル環境で実行する際にランダムポートで起動するようにしてみましたが、GitHubActionsでは以下のエラーが発生しました。Error starting userland proxy: listen tcp4 0.0.0.0:43911: bind: address already in use
おわりに
マイグレーションやデータ準備はしていないのでテスト実行時間はすごい短いですが、
プロジェクトが大きくなった場合は常駐で起動しているテスト用DBを設けた方がよいかもしれません。
(もしやgateway
ごとにコンテナ立ててテストを並列に実行させたりもできちゃう?)
かんきょー
go version go1.19.3 darwin/arm64
Docker version 20.10.20
りぽじとり
Discussion