Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Avatar for Shoki Hata Shoki Hata
September 12, 2023

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

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

Avatar for Shoki Hata

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 参考資料