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
300
ユニットテスト環境改善/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
150
画像のバリデーションはファイルサイズチェックだけでいいと思ってない?
ky6yk
0
370
ES2021/2022
ky6yk
0
24
Featured
See All Featured
Building an army of robots
kneath
302
44k
A designer walks into a library…
pauljervisheath
204
24k
Become a Pro
speakerdeck
PRO
26
5k
The World Runs on Bad Software
bkeepers
PRO
65
11k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Typedesign – Prime Four
hannesfritz
40
2.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Visualization
eitanlees
146
15k
Bash Introduction
62gerente
608
210k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
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 テストカバレッジの可視化