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
310
ユニットテスト環境改善/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
160
画像のバリデーションはファイルサイズチェックだけでいいと思ってない?
ky6yk
0
390
ES2021/2022
ky6yk
0
26
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
170
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
360
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
Producing Creativity
orderedlist
PRO
343
39k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
The Cult of Friendly URLs
andyhume
78
6.1k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
960
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Thoughts on Productivity
jonyablonski
68
4.4k
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 テストカバレッジの可視化