Slide 1

Slide 1 text

良いテストとは何か: 持続可能で保守性の⾼いテストを書く @picopico_dev

Slide 2

Slide 2 text

テスト、書いていますか?

Slide 3

Slide 3 text

「良い」テスト、書いていますか?

Slide 4

Slide 4 text

4 会社 ピクシブ株式会社 経歴 2023年4⽉ 新卒⼊社 業務 Web API設計/PHP . 移⾏ picopico @picopico_dev

Slide 5

Slide 5 text

⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅

Slide 6

Slide 6 text

⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅

Slide 7

Slide 7 text

前提:テストは書くべき

Slide 8

Slide 8 text

テストを書く恩恵 ● 機能変更‧リファクタリングしやすい ● 素早いフィードバックによる⾼速な開発 ● 優れたドキュメンテーション ● etc…

Slide 9

Slide 9 text

テストの質が悪いと‧‧‧? ● テストを修正しづらい ● すぐテストが壊れる ● テストの実⾏が終わらない ● たまに原因不明で落ちる ● etc…

Slide 10

Slide 10 text

コードは資産ではなく負債 コードが多いほど、保守‧運⽤コストがかかる =書かれたテストはゼロコストではない

Slide 11

Slide 11 text

⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅

Slide 12

Slide 12 text

「良い単体テストを構成する4本の柱」 ● リグレッションへのセーフティネット ● リファクタリング耐性 ● 迅速なフィードバック ● 保守のしやすさ 「単体テストの考え⽅/使い⽅」p.96

Slide 13

Slide 13 text

「単体テストを早期に⾏う利点」 ● 瞬間的な満⾜感 ● モジュール性‧再利⽤性の向上 ● リファクタリング‧セーフネット ● ドキュメンテーション 「The Advantages of Unit Testing Early」- Google Testing Blog (https://testing.googleblog.com/2009/07/by-shyam-seshadri-nowadays-when-i-talk.html)

Slide 14

Slide 14 text

良いテスト =価値の⾼いテスト シンプルに‧‧‧

Slide 15

Slide 15 text

価値=機能÷コスト

Slide 16

Slide 16 text

価値=機能÷コスト

Slide 17

Slide 17 text

コードが正しいことを保証すること 半分間違い

Slide 18

Slide 18 text

テストの機能 フィードバックループの構築 ドキュメンテーション +

Slide 19

Slide 19 text

テストの機能 フィードバックループの構築 ドキュメンテーション +

Slide 20

Slide 20 text

フィードバックループの構築 コードの変更 テスト リリース

Slide 21

Slide 21 text

シフトレフト

Slide 22

Slide 22 text

低い⽋陥コストでバグを修正できる →素早いリリースが可能になる →持続可能で保守性の⾼いプロダクトに

Slide 23

Slide 23 text

テストの機能 フィードバックループの構築 ドキュメンテーション +

Slide 24

Slide 24 text

ドキュメンテーション ● 信頼度が⾼い ● Howをコードで⽰している

Slide 25

Slide 25 text

信頼度が⾼い システム ⽂書 コメント テスト

Slide 26

Slide 26 text

価値=機能÷コスト

Slide 27

Slide 27 text

テストのコスト 実装コスト 保守コスト 運⽤コスト + +

Slide 28

Slide 28 text

テストのコスト 実装コスト 保守コスト 運⽤コスト + +

Slide 29

Slide 29 text

実装コスト ● フレームワークの導⼊ ● テストの作成 ● CIへの組み込み ● 学習

Slide 30

Slide 30 text

実装コスト テストコードはプロダクションコードより多い

Slide 31

Slide 31 text

テストのコスト 実装コスト 保守コスト 運⽤コスト + +

Slide 32

Slide 32 text

保守コスト ● フレームワークのアップデート ● コード変更時のテストの修正

Slide 33

Slide 33 text

テストのコスト 実装コスト 保守コスト 運⽤コスト + +

Slide 34

Slide 34 text

運⽤コスト ● テストの実⾏ ● CIサーバーの運⽤

Slide 35

Slide 35 text

価値=機能÷コスト

Slide 36

Slide 36 text

フィードバックループの構築 実装コスト ドキュメンテーション 運⽤コスト 保守コスト 価値 = ÷

Slide 37

Slide 37 text

⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅

Slide 38

Slide 38 text

良いテストを書くには ● 正確なフィードバック ● ⾼速なフィードバック ● 理解しやすいテスト ● テストする価値の⾼いシステムをテストする

Slide 39

Slide 39 text

良いテストを書くには ● 正確なフィードバック ● ⾼速なフィードバック ● 理解しやすいテスト ● テストする価値の⾼いシステムをテストする

Slide 40

Slide 40 text

正確なフィードバック ● 機能が正しく実装されているとき →テストが通る ● 機能が正しく実装されていないとき →テストが落ちる

Slide 41

Slide 41 text

正確なフィードバック 機能が正しくない 機能が正しい テストが通らない 真陰性 偽陽性 テストが通る 偽陰性 真陽性

Slide 42

Slide 42 text

正確なフィードバック コードの変更 テスト リリース 偽陽性

Slide 43

Slide 43 text

ホワイトボックステスト ● ソフトウェアが内部的に⾏っていることを検証する ● Howに依存するため、リファクタリング耐性が低い

Slide 44

Slide 44 text

ブラックボックステスト ● ソフトウェアの振る舞いのみを検証する ● Whatに依存するため、リファクタリング耐性が⾼い

Slide 45

Slide 45 text

正確なフィードバック コードの変更 テスト リリース 偽陰性

Slide 46

Slide 46 text

偽陰性を減らす ● ロジックが正しく動くか ● コンポーネントが結合された状態で動くか

Slide 47

Slide 47 text

テストピラミッド E2E Integration Unit

Slide 48

Slide 48 text

良いテストを書くには ● 正確なフィードバック ● ⾼速なフィードバック ● 理解しやすいテスト ● テストする価値の⾼いシステムをテストする

Slide 49

Slide 49 text

⾼速なフィードバック コードの変更 テスト リリース できるだけ速く

Slide 50

Slide 50 text

テストピラミッド E2E Integration Unit

Slide 51

Slide 51 text

テストサイズ 機能 Small Medium Large ネットワークアクセス No localhost only Yes データベース No Yes Yes ファイルシステムアクセス No Yes Yes 外部システムの利用 No Discouraged Yes マルチスレッド No Yes Yes スリープ文 No Yes Yes システムプロパティ No Yes Yes 時間制限 (秒) 60 300 900+ 「Test Sizes」- Google Testing Blog (https://testing.googleblog.com/2010/12/test-sizes.html)

Slide 52

Slide 52 text

良いテストを書くには ● 正確なフィードバック ● ⾼速なフィードバック ● 理解しやすいテスト ● テストする価値の⾼いシステムをテストする

Slide 53

Slide 53 text

理解しやすいテスト ● AAAパターン ○ Arrange - 準備 ○ Act - 実⾏ ○ Assert - 確認 ● テストケースと振る舞いを対応させる ● ⼀度に⼀つの振る舞いを検証する

Slide 54

Slide 54 text

良いテストを書くには ● 正確なフィードバック ● ⾼速なフィードバック ● 理解しやすいテスト ● テストする価値の⾼いシステムをテストする

Slide 55

Slide 55 text

テストする価値の⾼いシステム ● コアドメインに近い ● ロジックが複雑である

Slide 56

Slide 56 text

テストする価値の低いシステム ● 単発のスクリプト ● 書き直した⽅が早い ● ロジックをほぼ持たない

Slide 57

Slide 57 text

テスタビリティについて

Slide 58

Slide 58 text

フィードバックループの構築 実装コスト ドキュメンテーション 運⽤コスト 保守コスト 価値 = ÷

Slide 59

Slide 59 text

実装コスト =テスト対象システムで決まる

Slide 60

Slide 60 text

Class A Class C Class B Class D

Slide 61

Slide 61 text

DIとテストダブル ● 依存をコンストラクタで注⼊する ● テスト時には依存クラスをテストダブルに置き換える

Slide 62

Slide 62 text

おわり