9.3K Views
November 11, 23
スライド概要
github : https://github.com/Shiryu-go/wakate_test
登壇資料です
若手こそテストを書こう! JJUG CCC Fall 2023 1
@Shiryu_go 新卒1年目 関東圏SES企業勤務 むきむきJava 2
アイスブレイク 3
指摘されたこと、継続できている 1. 姿勢 2. コミットメッセージ 3. 勉強習慣 4. 質問するときのフォーマット …etc… 4
実際のところ、どのくらいの継続率? ● 8割以上 ● 5以上 ● それ以下 5
実際のところ、どのくらいの継続率? ● 8割以上 ← ● 5割以上 ● それ以下 6
実際のところ、どのくらいの継続率? ● 8割以上 ● 5割以上 ← ● それ以下 7
実際のところ、どのくらいの継続率? ● 8割以上 ● 5割以上 ● それ以下 ← 8
上司からの一言 「言ったこと、言った時しかやっていないじゃん。」 9
ぼく 🥺 10
忘れる 11
12
上昇するグラフ 理想の成長曲線はこっち 13
どうすれば良いか チェックシート 模擬的に取り組み、評価 無意識のうちにできるようになれば実現可能 14
めちゃめちゃだるい 15
人とソフトウェアを考えた時 指摘事項 = バグ 16
ソフトウェアの場合 自動化可能 17
テストを書く 18
今回の発表は皆さんに これをやってもらうのを目標にして喋ります 家に帰って テストコードを とりあえず書いてもらう 19
若手こそテストを書こう! JJUG CCC Fall 2023 Shiryu 20
テストってなんなのか ソフトウェア・テストは、 ソフトウェア製品または アプリケーションが想定どおりに 機能することを評価および検証するプロセス 要は確認 21
テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合 22
テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合 23
テストを書くメリット 品質確保、(動作保証) 24
テストでなぜ品質確保ができるのか 1. 手動でテストを行うことによるミスの排除 2. 何度でも実行可能 a. 変更時に行うリグレッションテスト b. CI/CDパイプラインへの組み込み 確認をちゃんと行う 25
テストを書かなかった場合 1. クラス同士の繋ぎこみに苦労 2. Curlをひたすら打ち込んで動作確認(手打ち) 3.デプロイしたは良いけどエラー吐いてる… 一日中Curlコマンド打って動作確認していた時が 辛かった 26
バグシューティングの手順 1.問題の再現 2.問題箇所の特定(依存関係の整理) 3.バグの発生理由の探索 単体テストを書くことで、問題箇所の特定が簡単に 27
時間効率的な話 28
テストを書いてみたら 依存関係をあまり気にすることなく、一つのクラス ・メソッドの実装に集中できた 丸1日かかっていたのが、四時間程度に 29
これによって 開発効率の上昇(実装速度) バグ発生箇所の特定速度上昇 →開発速度の向上 30
なんで若手? 1. コードを動く状態で手元に置いておけるから a. コードの書きっぱなし防止 2. 品質の基準を自分の中で確立できるから a. 部下の仕事の品質保証は、上司の仕事の一つ 3. チェックする習慣が身に付く 31
実際のテストを紹介していく 32
これだけ覚えて テスト用メソッド assertThat(A).isEquals(B); 最低限これだけあれば良い 33
サンプルコード(POJO) 34
サンプルコード(POJO)のテスト 35
極端にシンプルだが、やることはこれだけ 入力に対して 期待する動作を行なっているかを 確認する 36
他のクラスに依存するクラスのテスト モック(スタブ)によって切り離しが必要 37
モック = ハリボテ 38
39
40
モックとスタブの違い モック - > 高機能なスタブ スタブ - > テスト用に用意される、依存関係があ る他のものへの代替物、 41
実例…の前に 42
SpringBootのざっくりとした紹介 Controller Servlet Controller Service Repository D B Controller 43
テストコード(SpringBoot) 1. Repository 2. Service 3. Controller 依存先クラスが少ないものから 書いていくのがベスト 44
これを覚えよう Spring依存なし 1. @Mock 2. doA().when().method() Spring依存有り 3. WebMVCMock(Springに依存) 4. @Sql()(Springに依存) 45
紹介 以下、InteliJIDEAが 上手く映らなかった時用スライド 46
実践的なテストコード(SpringBoot)サンプル 1,Repository 47
1.Repositorテスト用コード テスト用SQLデータをロード、 組み込みデータベースに対して実行 Repositoryクラスメソッド呼び出し Repositoryクラスは 組み込みデータベースにアクセスし、 データを取得 SQLが正しく動作し、 Repositoryクラスから帰ってくるか テスト 48
importはこんな感じ 49
実践的なテストコード(SpringBoot)サンプル 2.Service 50
実践的なテストコード(SpringBoot)サンプル 2.Service Mockを注入するための前処理 Mockを入れられるクラスインスタンス クラスインスタンスに入れるMock Mockの挙動の定義 ServiceがMockから受け取ったデー タをうまく加工できているかのテスト 51
2.Service importはこんな感じ 52
実践的なテストコード(SpringBoot)サンプル 3.Controller 53
54
Web Rest APIの簡易呼び出し Web Rest APIの簡易呼び出し Web Rest APIの簡易呼び出し ResponseBodyがJSON形式 ているかどうかの確認 55
3.Controller import 56
デモから戻る(予定) まとめ 57
assertThat(A).isEquals(B); A Equals Bであることの証明 isEqualsはMathcerクラスなので、 等価性の定義に注意 58
まとめ1 InjectMocks -> テストのための依存性解決 Mock -> テスト対象を外部から独立させる為 doNothing().when().method() -> Mockの動作定義 59
まとめ2 @jdbcTest ->データベース関連のテスト @Sql ->SQLファイルの読み込み、実行 WebMVCTest -> HTTPリクエストの模擬 60
最後に 61
確実に一歩進んでいることを確かめる ソフトウェア Good : 定期的なテスト 自己成長 Good : 同じ失敗をしないように確認をする 62
上昇するグラフ こんな感じにね おしまい 63
Appendix 64
リグレッションテスト(回帰テスト) バグが発生する時 1.プログラムに変更が発生した時 2.ハードの変化(経年劣化等) 65
どうしたらバグの発生を抑えられるか プログラムに変更を加える度にテストで動作保証 →同一の検査を何度も手で行うのは効率が悪い →テストコードを書くことで自動化したら、バグの 発生も抑えられるので、良い。 66