🐁

go test で docker 起動

2022/11/26に公開

はじめに

https://www.mizdra.net/entry/2022/11/24/153459

本物のDBでテストするの大切ですよね。

ent.だとテスト用にSQLiteを使うことができるのですが
やっぱり本物のDB(本物により近い環境)でテストはしたいという気持ちがあります。

https://entgo.io/docs/testing/

テスト用にDBコンテナを常駐させてもよいと思いますが、

  • 動作確認用で起動させるDBと別にしたい
  • ポート番号の管理をよしなにしたい
  • テスト実行のたびにデータ削除がめんどくさい
  • データ削除のためトランザクションを貼るのがめんどくさい
  • Makefileなどに一連のスクリプトを記述するのもめんどくさい

という気持ちもあります。

https://github.com/moby/moby

mobyを使うことでGoコード内でdockerを操作して
上記のもろもろが解消できそうだったので試してみました。
とりあえず動けばいいやで作成したのでエラー処理やdefer処理は雑です。

こーど

  1. setup()にてイメージプル -> コンテナ起動(本当はここでマイグレーション実行)
  2. m.Run()にてテスト実行
  3. teardown()にてコンテナストップ -> 削除

https://github.com/takokun778/fs-go-moby/blob/main/main_test.go

しーあい

https://github.com/takokun778/fs-go-moby/blob/main/.github/workflows/test.yml

ぽいんと

  • コンテナが起動するまで待機
    テスト実行したら固まりました。
  • GitHubActionsでservicespostgresimageを指定
    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

りぽじとり

https://github.com/takokun778/fs-go-moby

Discussion