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
400
ユニットテスト環境改善/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
210
画像のバリデーションはファイルサイズチェックだけでいいと思ってない?
ky6yk
0
520
ES2021/2022
ky6yk
0
45
Featured
See All Featured
The Invisible Side of Design
smashingmag
302
51k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
120
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
100
A better future with KSS
kneath
240
18k
Leo the Paperboy
mayatellez
1
1.3k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
51k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
260
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.2k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
59
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
100k
How to make the Groovebox
asonas
2
1.9k
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 テストカバレッジの可視化