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
JJUG CCC Fall 2023 若手こそテストを書こう!
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shiryu
November 11, 2023
Technology
2
180
JJUG CCC Fall 2023 若手こそテストを書こう!
発表資料です。
Github :
https://github.com/Shiryu-go/wakate_test
shiryu
November 11, 2023
Tweet
Share
More Decks by shiryu
See All by shiryu
JJUG_CFPの書き方について
shiryu
0
72
ゆるゆるJava第二回「第一回でのつまづきと復習ラムダ式」
shiryu
0
27
2023/08/26 むきむきJava GithubActions+GCP+自動デプロイ(他山の石ver)
shiryu
1
150
今更JUnit4を勉強する
shiryu
0
120
2023/08/31 JJUG LT会 初登壇から学んだ一つのこと
shiryu
0
100
Other Decks in Technology
See All in Technology
KubeCon + CloudNativeCon NA ‘25 Recap, Extensibility: Gateway API / NRI
ladicle
0
150
AI開発をスケールさせるデータ中心の仕組みづくり
kzykmyzw
0
170
クラウドセキュリティの進化 — AWSの20年を振り返る
kei4eva4
0
160
それぞれのペースでやっていく Bet AI / Bet AI at Your Own Pace
yuyatakeyama
1
640
CodeRabbit CLI + Claude Codeの連携について
oikon48
1
670
BPaaSオペレーション・kubell社内 n8n活用による効率化検証事例紹介
kubell_hr
0
330
The Engineer with a Three-Year Cycle - 2
e99h2121
0
190
Hardware/Software Co-design: Motivations and reflections with respect to security
bcantrill
1
260
フロントエンド開発者のための「厄払い」
optim
0
170
AI時代にあわせたQA組織戦略
masamiyajiri
6
2.8k
Agentic Coding 実践ワークショップ
watany
41
27k
AWS Devops Agent ~ 自動調査とSlack統合をやってみた! ~
kubomasataka
2
240
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
370
Why Our Code Smells
bkeepers
PRO
340
58k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
420
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
75
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
190
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
120
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
170
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Transcript
若手こそテストを書こう! JJUG CCC Fall 2023 1
2 @Shiryu_go 新卒1年目 関東圏SES企業勤務 むきむきJava
3 アイスブレイク
4 指摘されたこと、継続できている 1. 姿勢 2. コミットメッセージ 3. 勉強習慣 4. 質問するときのフォーマット
…etc…
5 実際のところ、どのくらいの継続率? • 8割以上 • 5以上 • それ以下
6 実際のところ、どのくらいの継続率? • 8割以上 ← • 5割以上 • それ以下
7 実際のところ、どのくらいの継続率? • 8割以上 • 5割以上 ← • それ以下
8 実際のところ、どのくらいの継続率? • 8割以上 • 5割以上 • それ以下 ←
9 「言ったこと、言った時しかやっていないじゃん。」 上司からの一言
10 🥺 ぼく
11 忘れる
12
13 上昇するグラフ 理想の成長曲線はこっち
14 どうすれば良いか チェックシート 模擬的に取り組み、評価 無意識のうちにできるようになれば実現可能
15 めちゃめちゃだるい
16 人とソフトウェアを考えた時 指摘事項 = バグ
17 ソフトウェアの場合 自動化可能
18 テストを書く
19 今回の発表は皆さんに これをやってもらうのを目標にして喋ります 家に帰って テストコードを とりあえず書いてもらう
若手こそテストを書こう! JJUG CCC Fall 2023 Shiryu 20
21 ソフトウェア・テストは、 ソフトウェア製品または アプリケーションが想定どおりに 機能することを評価および検証するプロセス テストってなんなのか 要は確認
22 テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合
23 テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合
24 テストを書くメリット 品質確保、(動作保証)
25 テストでなぜ品質確保ができるのか 1. 手動でテストを行うことによるミスの排除 2. 何度でも実行可能 a. 変更時に行うリグレッションテスト b. CI/CDパイプラインへの組み込み
確認をちゃんと行う
26 テストを書かなかった場合 1. クラス同士の繋ぎこみに苦労 2. Curlをひたすら打ち込んで動作確認(手打ち) 3.デプロイしたは良いけどエラー吐いてる… 一日中Curlコマンド打って動作確認していた時が 辛かった
27 バグシューティングの手順 1.問題の再現 2.問題箇所の特定(依存関係の整理) 3.バグの発生理由の探索 単体テストを書くことで、問題箇所の特定が簡単に
28 時間効率的な話
29 テストを書いてみたら 依存関係をあまり気にすることなく、一つのクラス ・メソッドの実装に集中できた 丸1日かかっていたのが、四時間程度に
30 これによって 開発効率の上昇(実装速度) バグ発生箇所の特定速度上昇 →開発速度の向上
31 なんで若手? 1. コードを動く状態で手元に置いておけるから a. コードの書きっぱなし防止 2. 品質の基準を自分の中で確立できるから a. 部下の仕事の品質保証は、上司の仕事の一つ
3. チェックする習慣が身に付く
32 実際のテストを紹介していく
33 これだけ覚えて テスト用メソッド 最低限これだけあれば良い assertThat(A).isEquals(B);
34 サンプルコード(POJO)
35 サンプルコード(POJO)のテスト
36 極端にシンプルだが、やることはこれだけ 入力に対して 期待する動作を行なっているかを 確認する
37 他のクラスに依存するクラスのテスト モック(スタブ)によって切り離しが必要
38 モック = ハリボテ
39
40
41 モック - > 高機能なスタブ スタブ - > テスト用に用意される、依存関係があ る他のものへの代替物、
モックとスタブの違い
42 実例…の前に
43 SpringBootのざっくりとした紹介 Servlet Controller Controller Controller Service Repository D B
44 テストコード(SpringBoot) 1. Repository 2. Service 3. Controller 依存先クラスが少ないものから 書いていくのがベスト
45 これを覚えよう Spring依存なし 1. @Mock 2. doA().when().method() Spring依存有り 3. WebMVCMock(Springに依存)
4. @Sql()(Springに依存)
46 以下、InteliJIDEAが 上手く映らなかった時用スライド 紹介
47 実践的なテストコード(SpringBoot)サンプル 1,Repository
48 1.Repositorテスト用コード テスト用SQLデータをロード、 組み込みデータベースに対して実行 Repositoryクラスメソッド呼び出し Repositoryクラスは 組み込みデータベースにアクセスし、 データを取得 SQLが正しく動作し、 Repositoryクラスから帰ってくるか
テスト
49 importはこんな感じ
50 実践的なテストコード(SpringBoot)サンプル 2.Service
51 実践的なテストコード(SpringBoot)サンプル 2.Service Mockを注入するための前処理 Mockを入れられるクラスインスタンス クラスインスタンスに入れるMock Mockの挙動の定義 ServiceがMockから受け取ったデー タをうまく加工できているかのテスト
52 2.Service importはこんな感じ
53 実践的なテストコード(SpringBoot)サンプル 3.Controller
54
55 ResponseBodyがJSON形式 ているかどうかの確認 Web Rest APIの簡易呼び出し Web Rest APIの簡易呼び出し Web
Rest APIの簡易呼び出し
56 3.Controller import
57 デモから戻る(予定) まとめ
58 assertThat(A).isEquals(B); A Equals Bであることの証明 isEqualsはMathcerクラスなので、 等価性の定義に注意
59 まとめ1 InjectMocks -> テストのための依存性解決 Mock -> テスト対象を外部から独立させる為 doNothing().when().method() ->
Mockの動作定義
60 まとめ2 @jdbcTest ->データベース関連のテスト @Sql ->SQLファイルの読み込み、実行 WebMVCTest -> HTTPリクエストの模擬
61 最後に
62 確実に一歩進んでいることを確かめる ソフトウェア Good : 定期的なテスト 自己成長 Good : 同じ失敗をしないように確認をする
63 上昇するグラフ こんな感じにね おしまい
64 Appendix
65 リグレッションテスト(回帰テスト) バグが発生する時 1.プログラムに変更が発生した時 2.ハードの変化(経年劣化等)
66 どうしたらバグの発生を抑えられるか プログラムに変更を加える度にテストで動作保証 →同一の検査を何度も手で行うのは効率が悪い →テストコードを書くことで自動化したら、バグの 発生も抑えられるので、良い。