Slide 1

Slide 1 text

Toms(@toms74209200) Googleのテストサイズを活用した テスト環境の構築 JJUG CCC 2024 Fall 2024-10-27

Slide 2

Slide 2 text

whoami Toms(@toms74209200) 株式会社アジェンダ(@札幌) 基板からWebフロントエンドまでできるフルスタックエンジニア 自キ活はいいぞ

Slide 3

Slide 3 text

参考文献 この本いいよ 『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』 『単体テストの考え方/使い方 プロジェクトの持続可能な成長を実現するための戦略』

Slide 4

Slide 4 text

自動テストと開発サイクル • コード書きながらテスト • プルリク投げたらテスト • デプロイ前にテスト • デプロイ終わったらテスト

Slide 5

Slide 5 text

しかし 「プルリクのたびにテスト終わるまで30分かかります」 「デプロイ前のテスト失敗してました。再実行に1時間かかります」 「むこうのチームのdev環境が落ちててテストできません」

Slide 6

Slide 6 text

しかし 「プルリクのたびにテスト終わるまで30分かかります」 「デプロイ前のテスト失敗してました。再実行に1時間かかります」 「むこうのチームのdev環境が落ちててテストできません」 一生懸命テスト書いたのに開発者体験が悪くなっている

Slide 7

Slide 7 text

テスト設計のアンチパターン 『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』より

Slide 8

Slide 8 text

テストピラミッド:理想的なテスト比率 『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』より

Slide 9

Slide 9 text

インテグレーションテストってなんですか? • システムの結合試験のことだよ • モジュールどうしを組み合わせたテストだよ • 別のクラス使ったらインテグレーションテストだよ

Slide 10

Slide 10 text

Googleのテストサイズ Feature Small Medium Large Network access No localhost only Yes Database No Yes Yes File system access No Yes Yes Use external systems No Discouraged Yes Multiple threads No Yes Yes Sleep statements No Yes Yes System properties No Yes Yes 5JNFMJNJU TFDPOET 60 300 900 https://testing.googleblog.com/2010/12/test-sizes.html

Slide 11

Slide 11 text

Googleのテストサイズ 『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』より

Slide 12

Slide 12 text

Feature Small Medium Large Network access No localhost only Yes Database No Yes Yes File system access No Yes Yes Use external systems No Discouraged Yes Multiple threads No Yes Yes Sleep statements No Yes Yes System properties No Yes Yes 5JNFMJNJU TFDPOET 60 300 900 Googleのテストサイズ 安定 不安定 短い 長い テスト時間 安定性 https://testing.googleblog.com/2010/12/test-sizes.html

Slide 13

Slide 13 text

テストサイズを使ったプロジェクト

Slide 14

Slide 14 text

テストサイズを使ったプロジェクト 👈 Medium Test 👈 Small Test

Slide 15

Slide 15 text

テストサイズを使ったワークフロー name: Test of Small size jobs: test: steps: - name: Run tests run: mvn -B test name: Test of Medium size jobs: test: steps: - name: Run tests run: | mvn -B test - compile mvn -B failsafe:integration - test

Slide 16

Slide 16 text

なんか前より時間がかかるようになったんだけど • 単純にテストを分割するとセットアップの分だけ余計に時間がかかる • テストサイズに分けただけでは何も改善しない

Slide 17

Slide 17 text

なんか前より時間がかかるようになったんだけど • セットアップ時間の削減 • ワークフローごとに実行計画を変える • テストを見直す

Slide 18

Slide 18 text

セットアップ時間の削減 • 依存関係をキャッシュする • ビルドをキャッシュする

Slide 19

Slide 19 text

セットアップ時間の削減 name: Build and install maven dependencies jobs: build: steps: - uses: actions/setup - java@v4 with: distribution: 'temurin' java - version: '21' cache: 'maven' - name: Build run: mvn -B install -Dmaven.test.skip=true

Slide 20

Slide 20 text

ワークフローごとに実行計画を変える • SmallテストとMediumテストを同時に実行して金の力で解決 • Pull Request(Merge Request)ではSmallテストだけを実行

Slide 21

Slide 21 text

テストを見直す Mediumテストが多くなりすぎていないか? →Smallテストにサイズダウンする

Slide 22

Slide 22 text

テストを見直す 副作用→作用 • CSVファイルを出力する 書き出したCSVファイルを確認する 1. CSVファイルに書き出す 2. 書き出したCSVファイルを読み出す 3. 内容が正規か確認 CSV形式の文字列を確認する 1. 文字列を受け取る 2. 文字列がCSV形式か $47ϑΝΠϧͷςετ $47จࣈྻͷςετ ϑΝΠϧॻࠐΈͷ ςετ

Slide 23

Slide 23 text

Large testはどこいった? • Large testはWeb APIテスト・E2Eテストに限定する • Web APIテスト・E2Eテストはツールを使うのでプロジェクトの外に置く

Slide 24

Slide 24 text

まとめ • Javaのプロジェクト構成そのままでテストサイズに合わせて構築できる • テストサイズに分けただけでは何も改善しない • ワークフローごとにテストの実行計画を見直す • テスト比率を見直す