Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ユニットテスト環境改善/improve-unit-test-environment
Search
kiyoshi yamashita
January 18, 2024
0
350
ユニットテスト環境改善/improve-unit-test-environment
2024/1/19 若手・学生サーバーサイドエンジニアLT会 ラクーンホールディングス x ゆめみ のコラボLT会
https://yumemi.connpass.com/event/301942/
kiyoshi yamashita
January 18, 2024
Tweet
Share
More Decks by kiyoshi yamashita
See All by kiyoshi yamashita
めぐろLT#6 怖い話 サーバーが次々死んでいく
ky6yk
0
180
画像のバリデーションはファイルサイズチェックだけでいいと思ってない?
ky6yk
0
440
ES2021/2022
ky6yk
0
30
Featured
See All Featured
Writing Fast Ruby
sferik
628
61k
Into the Great Unknown - MozCon
thekraken
38
1.8k
Adopting Sorbet at Scale
ufuk
76
9.4k
Building Adaptive Systems
keathley
41
2.5k
4 Signs Your Business is Dying
shpigford
183
22k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
A designer walks into a library…
pauljervisheath
205
24k
Agile that works and the tools we love
rasmusluckow
329
21k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
23
2.7k
Code Review Best Practice
trishagee
68
18k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
19
1.2k
Transcript
ユニットテスト環境改善 yamashita.kiyoshi 若手・学生サーバーサイドエンジニアLT会 2024/01/19
まずは自己紹介 名前:山下 清史 所属:株式会社ラクーンホールディングス 技術戦略部 開発チーム 主な仕事:BtoB卸売りサイト スーパーデリバリーの開発 趣味:ISUCON(前回 上位25%)
vuejs-jpのコアスタッフしてます
Javaのユニットテスト環境が辛かった🥵 - FWはSpring - テストの実行が遅い - 1000ケースしかないのに15分程度かかる - masterにmerge後テストを待たずにリリース...
- テストを書くモチベーションが湧かない - カバレッジが可視化されていないので達成感が無い - テストの網羅性を注目されていなかった - テスティングライブラリのVersionが古い - JUnit 4, JMockit 1.33 - Java11の文法に対応していない - 複数の振る舞いをテストするときの記述量が増える
この一年でやったこと - JUnit4から5へリプレース - 遅いテストケースの原因探して修正 - カバレッジの可視化
JUnit4から5へリプレース
JUnitのVersionアップ 移行で辛かったポイント① - パッケージが変更されていた - org.junit.Test => org.junit.jupiter.api.Test - 一部機能が変わっておりコンパイルできない👼
- 例外が投げられることのテストでは - @Test(expected = NullPointerException.class)が Assertions.assertThrows(NullPointerException.class 根気よく空き時間を見つけて修正💪
JUnitのVersionアップ 移行で辛かったポイント② - JUnitのVersionをあげたことでMockライブラリ(JMockit)もVersionを上げる必要 が出てきた - JMockitはマイナーバージョンアップでも後方互換性がないので 最新Versionにすると全て書き換える必要あり - 開発は2019年で止まっている
JMockitで書かれている箇所をMockito🍷に書き換え なんとかJUnit5に移行できた...
Mockitoの選定理由 - JUnit5に対応している - 開発が今も続いている - 毎月リリースされている - 学習コストが低い -
弊社の新卒研修で使われているので知っている人が多い - 日本語のドキュメントがある
JUnit5にリプレースした結果 - JUnitが最新バージョンになった - Java8以降の文法(ラムダ関数など)が使用可能 - JUnitの便利な機能 - パラメータ化テスト -
@DisplayName - テストを階層化して整理
テストが遅い問題
テストが遅い問題① 遅いテストを確認すると... 1つのテストクラスだけで約50秒!!
テストが遅い問題① 巨大な画像(6000px×6000px)の画像をリサイズしていた テスト対象のコード内でpropertyファイルから取得する リサイズの上限が6000px×6000pxであるため リフレクションでテスト時のみ縦横ピクセルのリサイズの上限を変更
テストが遅い問題① 約50秒速くした 他にも遅いテストを見つけては原因調査...
テストが遅い問題② 問題: 複数のテストクラスで同じDIコンテナ使用していたが、 テスト毎に生成しては破棄を繰り返していた。 クラスA クラスC クラスB キャッシュ済みのDIコンテナが使えないとテストクラスごとに DIコンテナ生成コストがかかる
テストが遅い問題② クラスA クラスC クラスB 全てのテストクラスでキャッシュ済みのDIコンテナを 利用出来るように修正 問題: 複数のテストクラスで同じDIコンテナ使用していたが、 テスト毎に生成しては破棄を繰り返していた。
カバレッジ可視化
カバレッジ可視化 - カバレッジが計測されていない状況だったので、 テスト作成モチベーションがわかなかった - MR時にどの行がテストでカバーされていないか表示 - MR時にカバレッジの割合変化を表示 -
READMEにバッジを張る - gitlab pagesにカバレッジレポートをホスティング
カバレッジ可視化 - カバレッジが計測されていない状況だったので、 テスト作成モチベーションがわかなかった - MR時にどの行がテストでカバーされていないか表示 - MR時にカバレッジの割合変化を表示 -
READMEにバッジを張る - gitlab pagesにカバレッジレポートをホスティング
カバレッジ可視化 コードレビュー時の指標の1つ、モチベーションアップに繋がりそう!?
カバレッジ可視化 - カバレッジが計測されていない状況だったので、 テストの品質が低い状況だった... - MR時にどの行がテストでカバーされていないか表示 - MR時にカバレッジの割合変化を表示 -
READMEにバッジを張る - gitlab pagesにカバレッジレポートをホスティング
カバレッジ可視化 カバレッジを簡単に確認できる💪
まとめ - JUnitのVersionをあげたことでテストの書きやすさ↗ - 遅いテストを修正、キャッシュ済みのDIコンテナを使用 - テスト速度↗(約15分⇒約6分) - カバレッジレポートをgitlab-pagesにホスティングさせた -
MR時にカバーされていないコードを分かるようにした - テストへのモチベーション↗ - まだまだ改善できる余地があるのでこれからもやっていき!
参考 - Spring コンテキストキャッシング - GitLab テストカバレッジの可視化