Slide 1

Slide 1 text

若手こそテストを書こう! JJUG CCC Fall 2023 1

Slide 2

Slide 2 text

2 @Shiryu_go 新卒1年目 関東圏SES企業勤務 むきむきJava

Slide 3

Slide 3 text

3 アイスブレイク

Slide 4

Slide 4 text

4 指摘されたこと、継続できている 1. 姿勢 2. コミットメッセージ 3. 勉強習慣 4. 質問するときのフォーマット …etc…

Slide 5

Slide 5 text

5 実際のところ、どのくらいの継続率? ● 8割以上 ● 5以上 ● それ以下

Slide 6

Slide 6 text

6 実際のところ、どのくらいの継続率? ● 8割以上 ← ● 5割以上 ● それ以下

Slide 7

Slide 7 text

7 実際のところ、どのくらいの継続率? ● 8割以上 ● 5割以上 ← ● それ以下

Slide 8

Slide 8 text

8 実際のところ、どのくらいの継続率? ● 8割以上 ● 5割以上 ● それ以下 ←

Slide 9

Slide 9 text

9 「言ったこと、言った時しかやっていないじゃん。」 上司からの一言

Slide 10

Slide 10 text

10 🥺 ぼく

Slide 11

Slide 11 text

11 忘れる

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

13 上昇するグラフ 理想の成長曲線はこっち

Slide 14

Slide 14 text

14 どうすれば良いか チェックシート 模擬的に取り組み、評価 無意識のうちにできるようになれば実現可能

Slide 15

Slide 15 text

15 めちゃめちゃだるい

Slide 16

Slide 16 text

16 人とソフトウェアを考えた時 指摘事項 = バグ

Slide 17

Slide 17 text

17 ソフトウェアの場合 自動化可能

Slide 18

Slide 18 text

18 テストを書く

Slide 19

Slide 19 text

19 今回の発表は皆さんに これをやってもらうのを目標にして喋ります 家に帰って テストコードを とりあえず書いてもらう

Slide 20

Slide 20 text

若手こそテストを書こう! JJUG CCC Fall 2023 Shiryu 20

Slide 21

Slide 21 text

21 ソフトウェア・テストは、 ソフトウェア製品または アプリケーションが想定どおりに 機能することを評価および検証するプロセス テストってなんなのか 要は確認

Slide 22

Slide 22 text

22 テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合

Slide 23

Slide 23 text

23 テストってなんなのか ブラックボックステストとホワイトボックステスト 疎結合 密結合

Slide 24

Slide 24 text

24 テストを書くメリット 品質確保、(動作保証)

Slide 25

Slide 25 text

25 テストでなぜ品質確保ができるのか 1. 手動でテストを行うことによるミスの排除 2. 何度でも実行可能 a. 変更時に行うリグレッションテスト b. CI/CDパイプラインへの組み込み 確認をちゃんと行う

Slide 26

Slide 26 text

26 テストを書かなかった場合 1. クラス同士の繋ぎこみに苦労 2. Curlをひたすら打ち込んで動作確認(手打ち) 3.デプロイしたは良いけどエラー吐いてる… 一日中Curlコマンド打って動作確認していた時が 辛かった

Slide 27

Slide 27 text

27 バグシューティングの手順 1.問題の再現 2.問題箇所の特定(依存関係の整理) 3.バグの発生理由の探索 単体テストを書くことで、問題箇所の特定が簡単に

Slide 28

Slide 28 text

28 時間効率的な話

Slide 29

Slide 29 text

29 テストを書いてみたら 依存関係をあまり気にすることなく、一つのクラス ・メソッドの実装に集中できた 丸1日かかっていたのが、四時間程度に

Slide 30

Slide 30 text

30 これによって 開発効率の上昇(実装速度) バグ発生箇所の特定速度上昇 →開発速度の向上

Slide 31

Slide 31 text

31 なんで若手? 1. コードを動く状態で手元に置いておけるから a. コードの書きっぱなし防止 2. 品質の基準を自分の中で確立できるから a. 部下の仕事の品質保証は、上司の仕事の一つ 3. チェックする習慣が身に付く

Slide 32

Slide 32 text

32 実際のテストを紹介していく

Slide 33

Slide 33 text

33 これだけ覚えて テスト用メソッド 最低限これだけあれば良い assertThat(A).isEquals(B);

Slide 34

Slide 34 text

34 サンプルコード(POJO)

Slide 35

Slide 35 text

35 サンプルコード(POJO)のテスト

Slide 36

Slide 36 text

36 極端にシンプルだが、やることはこれだけ 入力に対して 期待する動作を行なっているかを 確認する

Slide 37

Slide 37 text

37 他のクラスに依存するクラスのテスト モック(スタブ)によって切り離しが必要

Slide 38

Slide 38 text

38 モック = ハリボテ

Slide 39

Slide 39 text

39

Slide 40

Slide 40 text

40

Slide 41

Slide 41 text

41 モック - > 高機能なスタブ スタブ - > テスト用に用意される、依存関係があ る他のものへの代替物、 モックとスタブの違い

Slide 42

Slide 42 text

42 実例…の前に

Slide 43

Slide 43 text

43 SpringBootのざっくりとした紹介 Servlet Controller Controller Controller Service Repository D B

Slide 44

Slide 44 text

44 テストコード(SpringBoot) 1. Repository 2. Service 3. Controller 依存先クラスが少ないものから 書いていくのがベスト

Slide 45

Slide 45 text

45 これを覚えよう Spring依存なし 1. @Mock 2. doA().when().method() Spring依存有り 3. WebMVCMock(Springに依存) 4. @Sql()(Springに依存)

Slide 46

Slide 46 text

46 以下、InteliJIDEAが 上手く映らなかった時用スライド 紹介

Slide 47

Slide 47 text

47 実践的なテストコード(SpringBoot)サンプル 1,Repository

Slide 48

Slide 48 text

48 1.Repositorテスト用コード テスト用SQLデータをロード、 組み込みデータベースに対して実行 Repositoryクラスメソッド呼び出し Repositoryクラスは 組み込みデータベースにアクセスし、 データを取得 SQLが正しく動作し、 Repositoryクラスから帰ってくるか テスト

Slide 49

Slide 49 text

49 importはこんな感じ

Slide 50

Slide 50 text

50 実践的なテストコード(SpringBoot)サンプル 2.Service

Slide 51

Slide 51 text

51 実践的なテストコード(SpringBoot)サンプル 2.Service Mockを注入するための前処理 Mockを入れられるクラスインスタンス クラスインスタンスに入れるMock Mockの挙動の定義 ServiceがMockから受け取ったデー タをうまく加工できているかのテスト

Slide 52

Slide 52 text

52 2.Service importはこんな感じ

Slide 53

Slide 53 text

53 実践的なテストコード(SpringBoot)サンプル 3.Controller

Slide 54

Slide 54 text

54

Slide 55

Slide 55 text

55 ResponseBodyがJSON形式 ているかどうかの確認 Web Rest APIの簡易呼び出し Web Rest APIの簡易呼び出し Web Rest APIの簡易呼び出し

Slide 56

Slide 56 text

56 3.Controller import

Slide 57

Slide 57 text

57 デモから戻る(予定) まとめ

Slide 58

Slide 58 text

58 assertThat(A).isEquals(B); A Equals Bであることの証明 isEqualsはMathcerクラスなので、 等価性の定義に注意

Slide 59

Slide 59 text

59 まとめ1 InjectMocks -> テストのための依存性解決 Mock -> テスト対象を外部から独立させる為 doNothing().when().method() -> Mockの動作定義

Slide 60

Slide 60 text

60 まとめ2 @jdbcTest ->データベース関連のテスト @Sql ->SQLファイルの読み込み、実行 WebMVCTest -> HTTPリクエストの模擬

Slide 61

Slide 61 text

61 最後に

Slide 62

Slide 62 text

62 確実に一歩進んでいることを確かめる ソフトウェア Good : 定期的なテスト 自己成長 Good : 同じ失敗をしないように確認をする

Slide 63

Slide 63 text

63 上昇するグラフ こんな感じにね おしまい

Slide 64

Slide 64 text

64 Appendix

Slide 65

Slide 65 text

65 リグレッションテスト(回帰テスト) バグが発生する時 1.プログラムに変更が発生した時 2.ハードの変化(経年劣化等)

Slide 66

Slide 66 text

66 どうしたらバグの発生を抑えられるか プログラムに変更を加える度にテストで動作保証 →同一の検査を何度も手で行うのは効率が悪い →テストコードを書くことで自動化したら、バグの 発生も抑えられるので、良い。