Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

ユニットテスト並行化の導入と運用:Goでの事例紹介

Shoki Hata
September 12, 2023

 ユニットテスト並行化の導入と運用:Goでの事例紹介

テストパフォーマンス向上のためのテスト戦略 〜自動化の秘訣 Lunch LT〜 の登壇資料になります。

Shoki Hata

September 12, 2023
Tweet

More Decks by Shoki Hata

Other Decks in Programming

Transcript

  1. Copyright Kanmu, Inc. All right reserved. 2 畠 翔紀 software

    engineer at Kanmu, Inc. @sho-hata @sho_hata_ 自己紹介
  2. Copyright Kanmu, Inc. All right reserved. 4 おことわり ユニットテストの並行化を 無理なく導入・運用するための情報を提供すること

    ・Go言語でのユースケースをお伝えします ・本紹介で紹介するアプローチは、他言語でも 可能ですので適宜読み替えていただければと思います
  3. Copyright Kanmu, Inc. All right reserved. Poolチーム紹介 6 1 ・PdM:1名

    ・デザイナー:1名 ・Bizdev(事業開発):1名 ・フロント/バックエンドエンジニア: 4名 ・SRE:1名
  4. Copyright Kanmu, Inc. All right reserved. 並列・並行という用語について 9 2 テキストを入れたり。テキストを入れたり。テキストを入れた

    り。テキストを入れたり。テキストを入れたり。テキストを入 れたり。テキストを入れたり。テキストを入れたり。 ・並行:複数の処理を独立に実行できる構成のこと ・並列:複数の処理を同時に実行すること 参考: “Concurrency is not Parallelism”, Heroku’s Waza conference,Rob Pike(2012)
  5. Copyright Kanmu, Inc. All right reserved. テストを並行化すると、どのようなメリットがある? 10 2 テキストを入れたり。テキストを入れたり。テキストを入れた

    り。テキストを入れたり。テキストを入れたり。テキストを入 れたり。テキストを入れたり。テキストを入れたり。 ・テスト時間の短縮が期待できる ・テスト対象/テストコードが並列実行に対応している  ことを担保できる ・システムリソースの効率的な利用ができる ・CI/CDパイプラインを最適化できる
  6. Copyright Kanmu, Inc. All right reserved. どうやってGoのテストは並列実行される? 11 2 Goでは、テストコマンド実行時オプション

    「-parallel」でサポートされている -parallel オプション パッケージ内のテストごとの 並列実行をサポート
  7. Copyright Kanmu, Inc. All right reserved. 16 3 課題:データベース接続テストの並行化 id

    name 1 “NIGHT FISHING” 2 “KikUUiki” 3 “DocumentaLy” 4 “GO TO THE FUTURE” 5 ???? album テーブル 並列実行 テストA テストB あるテストの変更が他のテストケースに影響を及ぼしてしまう! ※マルチコア環境を想定
  8. Copyright Kanmu, Inc. All right reserved. テストの並行化にそんなにリソースを割けない 3 テスト並行化のメリット ・テスト時間の短縮が期待できる

    ・テスト対象/テストコードが並列実行に対応している  ことを担保できるetc… (今は)なるべくプロダクトの成長に直結する施策に 開発リソースを割きたい! メリットはわかる(重要)けど....
  9. Copyright Kanmu, Inc. All right reserved. 22 4 tparagenの紹介 ・https://github.com/sho-hata/tparagen

    ・対象ディレクトリ配下のGoファイルのテスト関数  に t.Parallel(=並行化マーカー)を埋め込む ・ソースコードを静的解析。テスト関数が並行化  できる条件に一致していればASTをいじって埋め込む
  10. Copyright Kanmu, Inc. All right reserved. 27 4 事例紹介:テストケースごとに独立した環境の構築 実現したいこと

    ・テスト終了後にデータ変更が残らない ・並列実行時に他のテストに影響を与えない 方針 ・テストケースごとにトランザクションを貼る ・テストケース終了後、ロールバック ・テスト対象がトランザクション処理をしている場合、  動作をモック化
  11. Copyright Kanmu, Inc. All right reserved. 28 4 事例紹介:pgtxdbを利用したテスト環境の構築 https://github.com/achiku/pgtxdbを使う

    以下の特徴をもつDBコネクションを生成する  ・接続が開かれるとトランザクションを開始  ・接続が閉じるとロールバック  ・トランザクションがモック化される    ・BEGIN -> SAVEPOINT    ・COMMIT -> 何もしない    ・ROLLBACK -> ROLLBACK TO SAVEPOINT どうやるか?
  12. Copyright Kanmu, Inc. All right reserved. 29 4 事例紹介:pgtxdbを利用したテスト環境 テストA

    テストB トランザクションは互いに独立。並列実行時にも問題なし
  13. Copyright Kanmu, Inc. All right reserved. - 無理なく始めるGoでのユニットテスト並行化 - カンムテックブログ

    - LTではお伝えできなかった部分に踏み込んで、より詳細に説明しています - https://tech.kanmu.co.jp/entry/2023/06/02/172458 - 無理なく始めるGoでのユニットテスト並行化戦略 - Go Conference 2023でお話しした内容です - https://speakerdeck.com/shohata/go-conference-2023 参考資料