Slide 1

Slide 1 text

testcontainers のススメ Go Connect #4 2024. 12. 10

Slide 2

Slide 2 text

2 自己紹介 Sugar Sato (@satoIsSugar) ● 2023年 BuySell Technologies入社 ● 基盤チーム所属(Portal/Account/Approval) PjM ○ アソシエイトマネージャー ● Go / Angular / Serverless ○ Go歴: Go 年目くらい ● 熱帯植物 ○ ビカクシダ ● 猫 ○ Lambda (♀ 2才)

Slide 3

Slide 3 text

3 プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込 買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム

Slide 4

Slide 4 text

本題に入りまして、、、 「みんなテストは好きか〜?」

Slide 5

Slide 5 text

好きだ〜🙌 好きじゃないぞ〜! 正直どっちでもない ど ち らか とい え ば 好 きか も テストこそ正 義 ! 逃げられない戦いがそこにある できることなら逃げたい カバ レ ッジ ! カバレッジ! mock!! testable!! カ バ レ ッジ ! カバレッジ! そ の 術 は オ レに 効 く テ ス タ ブ ル モック! モック! 0!! C1!!

Slide 6

Slide 6 text

あれ? 先月そんな話してたような?

Slide 7

Slide 7 text

またもやテスト関連の話をしようと思います ※ 取り組み話多め

Slide 8

Slide 8 text

01 技術選定の背景 02 testcontainers とは 03 まとめ 目次 Index

Slide 9

Slide 9 text

技術選定の背景 01

Slide 10

Slide 10 text

そもそもなぜ必要なの?

Slide 11

Slide 11 text

11 なぜ必要だったか ● テスト時間の短縮 ● Cloud Functions のテスト ○ 複雑な SQL クエリに対してテストしたい 実際のリソースでテストできて 当時に勢いがあった ory/dockertest が良さそうかも 背景

Slide 12

Slide 12 text

12 ory/dockertest とは “Dockertest helps you boot up ephemeral docker images for your Go tests with minimal work.” 特徴 ● 「最小限の作業で一時的なDockerイメージを起動」 ● イメージさえあれば簡単に起動できる ● シンプルな書き心地 ● リリース頻度が高くない... ○ あんまりメンテされてない? ○ 後に切り替えることへのきっかけに... ● テスト終わってもコンテナが残る ○ Purge を自分でする必要

Slide 13

Slide 13 text

13 ory/dockertest とは

Slide 14

Slide 14 text

14 ory/dockertest とは

Slide 15

Slide 15 text

15 テスト時間の短縮 ory/dockertest 導入前後のテスト実行時間比較 導入前 • Hasura を使っていた ○ PostgreSQL コンテナ↑ ○ remote schema コンテナ↑ ○ Hasura コンテナ↑ ○ Hasura CLI でマイグレーション ※ Hasura: PostgreSQL サーバーから自動的に GraphQL サーバーを建てるもの 導入後 • Hasura や Remote Schema 環境の依存 度↓ ○ 但し Hasura のマイグレーション ファイルを使う ○ そのため完全に依存をなくすのは厳 しい 7〜8分 程度時間がかかっていた 2〜3分 程度になった!

Slide 16

Slide 16 text

そんなわけで ory/dockertest を「当初」に選定された

Slide 17

Slide 17 text

なぜ ory/dockertest から 乗り換える必要があったの?

Slide 18

Slide 18 text

18 dependabot が PR 作成 ory/dockertest から乗り換える理由 PR マージ Cloud Functions のテストが失敗しだす 原因調査 dockertest で依存している docker パッケージ更新が原因... STEP1 STEP2 STEP3 STEP4 STEP5 時系列

Slide 19

Slide 19 text

19 dependabot が PR 作成 ory/dockertest から乗り換える理由 PR マージ Cloud Functions のテストが失敗しだす 原因調査 dockertest で依存している docker パッケージ更新が原因... STEP1 STEP2 STEP3 STEP4 STEP5 docker パッケージの更新により 使えないメソッドや型が出てきた? ※ v3.11.0 のリリースで改善済み 時系列

Slide 20

Slide 20 text

20 ory/dockertest から乗り換える理由 docker のバージョンに 対応できない リリース頻度が遅く メンテナンス性の問題がある 要因1 要因2 ory/dockertest を脱却して他のパッケージを使おう! 方針

Slide 21

Slide 21 text

testcontainers とは 02

Slide 22

Slide 22 text

22 testcontainers とは “Unit tests with real dependencies” 特徴 活用事例 ● Elastic - Testing of the APM Server, and E2E testing for Beats ● Telegraf - Integration testing the plugin-driven server agent for collecting & reporting metrics ● Intel - Reference implementation design E2E testing for microservice-based solutions ● OpenTelemetry - Integration testing of the OpenTelemetry Collector receivers ● e2e や integration test に使われる ● 企業スポンサー多数 ● リリース頻度が高い ● SDK が豊富 (Go / Java / Node / Ruby / Python / Rust) ● examples が豊富 ○ 注) ちょっと探しづらい... ○ godoc から見るのがおすすめ ● ory/dockertest に比べると書くことが多い

Slide 23

Slide 23 text

23 testcontainers とは

Slide 24

Slide 24 text

24 testcontainers とは

Slide 25

Slide 25 text

25 testcontainers とは

Slide 26

Slide 26 text

26 testcontainers moduleから使う

Slide 27

Slide 27 text

27 testcontainers とは testcontainers/testcontainers-go vs ory/dockertest testcontainers: 3707↑ dockertest: 4187↑

Slide 28

Slide 28 text

28 比較されることも... ● 『dockertest のススメ』 ○ “追記: 2024-07-20 Testcontainers を使いましょう” ● 『GoにおけるDBテスト dockertest vs testcontainers 比較してみた』 ○ “dockertest の方が実行速度がはやい?” testcontainers とは testcontainers/testcontainers-go vs ory/dockertest 書くことが少しふえるものの testcontainers-go だと事細かに設定できる

Slide 29

Slide 29 text

重い腰あげて移行するか〜 👴

Slide 30

Slide 30 text

30 testcontainers への移行 移行するのにどれくらいかかった? 2〜3日

Slide 31

Slide 31 text

31 testcontainers への移行 移行するのにどれくらいかかった? 2〜3日 そこまでプロダクトの規模が 大きくなかったのでサクッとおわった

Slide 32

Slide 32 text

32 testcontainers 使用箇所 プロジェクトとして使っている箇所 決裁 ● API ○ Cloud  Spanner CMS ● API ● Cloud Functions ○ PostgreSQL (Cloud SQL)

Slide 33

Slide 33 text

サクッと移行できて 安定的に運用できているんで変えて良かった〜 🙌

Slide 34

Slide 34 text

まとめ 03

Slide 35

Slide 35 text

35 まとめ 課題は、まだたくさんある ● 各テストケースごとに testcontainers を起動するためテスト実行時間がながい ● コンテナの起動を並列化する チームへの浸透 ● モックでいいじゃんってならないために必要性をきちんと解いていく testcontainers の利便性 ● リリース頻度が活発 ● ドキュメントが豊富 ○ Docker 公式からもブログが出ている ● テストケースごとにコンテナを起動する ○ flaky なテストを回避しやすい

Slide 36

Slide 36 text

幸せなテストライフを!

Slide 37

Slide 37 text

Thank You

Slide 38

Slide 38 text

38 引用 ● https://hasura.io/ ● https://testcontainers.com/ ● https://golang.testcontainers.org/ ● https://github.com/ory/dockertest ● https://github.com/testcontainers/testcontainers-go ● https://zenn.dev/shiguredo/articles/go-test-dockertest ● https://zenn.dev/jy8752/articles/419ab77b2b6a61 ● https://www.docker.com/ja-jp/blog/testcontainers-best-practices/