$30 off During Our Annual Pro Sale. View Details »

ユニットテスト並行化の導入と運用: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. ユニットテスト並行化の
    導入と運用:Goでの事例紹介
    Shoki Hata
    テストパフォーマンス向上のためのテスト戦略
    〜自動化の秘訣 Lunch LT〜
    September 13 wed

    View Slide

  2. Copyright Kanmu, Inc. All right reserved. 2
    畠 翔紀
    software engineer at Kanmu, Inc.
    @sho-hata
    @sho_hata_
    自己紹介

    View Slide

  3. Copyright Kanmu, Inc. All right reserved. 3
    本発表の目的
    ユニットテストの並行化を
    無理なく導入・運用するための情報を提供すること

    View Slide

  4. Copyright Kanmu, Inc. All right reserved. 4
    おことわり
    ユニットテストの並行化を
    無理なく導入・運用するための情報を提供すること
    ・Go言語でのユースケースをお伝えします
    ・本紹介で紹介するアプローチは、他言語でも
    可能ですので適宜読み替えていただければと思います

    View Slide

  5. Copyright Kanmu, Inc. All right reserved.
    プロダクトの紹介
    5
    1

    View Slide

  6. Copyright Kanmu, Inc. All right reserved.
    Poolチーム紹介
    6
    1
    ・PdM:1名
    ・デザイナー:1名
    ・Bizdev(事業開発):1名
    ・フロント/バックエンドエンジニア: 4名
    ・SRE:1名

    View Slide

  7. Copyright Kanmu, Inc. All right reserved.
    ユニットテスト並行化とは
    2

    View Slide

  8. Copyright Kanmu, Inc. All right reserved.
    「個々のユニットテストを独立に実行できる構成に
    すること」
    と本発表では定義します
    Goのユニットテスト並行化とは
    2

    View Slide

  9. Copyright Kanmu, Inc. All right reserved.
    並列・並行という用語について
    9
    2
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ・並行:複数の処理を独立に実行できる構成のこと
    ・並列:複数の処理を同時に実行すること
    参考: “Concurrency is not Parallelism”, Heroku’s Waza conference,Rob Pike(2012)

    View Slide

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

    View Slide

  11. Copyright Kanmu, Inc. All right reserved.
    どうやってGoのテストは並列実行される?
    11
    2
    Goでは、テストコマンド実行時オプション
    「-parallel」でサポートされている
    -parallel オプション
    パッケージ内のテストごとの
    並列実行をサポート

    View Slide

  12. Copyright Kanmu, Inc. All right reserved.
    Aパッケージ
    パッケージ内のテストの並列実行数を指定する-parallel オプション
    12
    2
    TestX TestY
    Aパッケージ
    TestX
    TestY
    ※マルチコア環境を想定

    View Slide

  13. Copyright Kanmu, Inc. All right reserved.
    -parallelは「t.Parallel」を呼んでいるテスト関数のみ対象
    13
    2
    case3
    case1
    case2
    テストコード
    テスト実行
    ※マルチコア環境を想定

    View Slide

  14. Copyright Kanmu, Inc. All right reserved.
    ユニットテスト並行化に伴う課題
    3

    View Slide

  15. Copyright Kanmu, Inc. All right reserved.
    課題:並行化コードを記述するのが面倒
    15
    3
    テスト対象に並行化マーカーを
    チマチマ記述していかないといけない

    View Slide

  16. 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
    あるテストの変更が他のテストケースに影響を及ぼしてしまう!
    ※マルチコア環境を想定

    View Slide

  17. Copyright Kanmu, Inc. All right reserved.
    時間も人も有限!プロダクト改善真っ只中!
    今はユニットテストの改善に大きなリソースを割けない...
    課題をどう解決していくか
    3

    View Slide

  18. Copyright Kanmu, Inc. All right reserved.
    テストの並行化にそんなにリソースを割けない
    3
    テスト並行化のメリット
    ・テスト時間の短縮が期待できる
    ・テスト対象/テストコードが並列実行に対応している
     ことを担保できるetc…

    View Slide

  19. Copyright Kanmu, Inc. All right reserved.
    テストの並行化にそんなにリソースを割けない
    3
    テスト並行化のメリット
    ・テスト時間の短縮が期待できる
    ・テスト対象/テストコードが並列実行に対応している
     ことを担保できるetc…
    (今は)なるべくプロダクトの成長に直結する施策に
    開発リソースを割きたい!
    メリットはわかる(重要)けど....

    View Slide

  20. Copyright Kanmu, Inc. All right reserved.
    ・並行化コードを記述するのが面倒!
    ・データベース接続テストの並行化
    テスト並行化の導入・運用のアプローチ
    3
    人力ではなく、ツールで一気に
    テストを並行化する

    View Slide

  21. Copyright Kanmu, Inc. All right reserved.
    Goのテストコードを一気に
    並行化するツール「tparagen」
    4

    View Slide

  22. Copyright Kanmu, Inc. All right reserved. 22
    4 tparagenの紹介
    ・https://github.com/sho-hata/tparagen
    ・対象ディレクトリ配下のGoファイルのテスト関数  に
    t.Parallel(=並行化マーカー)を埋め込む
    ・ソースコードを静的解析。テスト関数が並行化
     できる条件に一致していればASTをいじって埋め込む

    View Slide

  23. Copyright Kanmu, Inc. All right reserved. 23
    4 tparagenの紹介:動作

    View Slide

  24. Copyright Kanmu, Inc. All right reserved.
    ・並行化コードを記述するのが面倒!
    ・テストコード上での並行化特有の挙動
    ・データベース接続テストの並行化
    データベース接続テスト並行化に対してのアプローチ
    4
    各テストケースごとに独立した
    データ操作環境にする

    View Slide

  25. Copyright Kanmu, Inc. All right reserved.
    事例紹介:Pool開発チーム

    View Slide

  26. Copyright Kanmu, Inc. All right reserved.
    データベースと接続するテストの並行化には、
    テストケースごとに独立した環境の
    構築がポイント

    View Slide

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

    View Slide

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

    View Slide

  29. Copyright Kanmu, Inc. All right reserved. 29
    4 事例紹介:pgtxdbを利用したテスト環境
    テストA
    テストB
    トランザクションは互いに独立。並列実行時にも問題なし

    View Slide

  30. Copyright Kanmu, Inc. All right reserved.
    まとめ
    ・テスト並行化は、開発サイクルの速度向上や並列実行時の動作 担
    保が期待できる
    ・無理なく導入・運用するには、並行化コードの自動挿入ツールの導
    入を検討する
    ・データベースと接続するテストを並行化するには、
     テストケースごとに独立したデータ操作環境を整備する

    View Slide

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

    View Slide

  32. Copyright Kanmu, Inc. All right reserved.

    View Slide