Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストピラミッドを意識したテストコード実装戦略

02
December 12, 2020

 テストピラミッドを意識したテストコード実装戦略

このスライドは、「PHP カンファレンス Japan 2020」で登壇した時に使用したスライドです。

02

December 12, 2020
Tweet

More Decks by 02

Other Decks in Programming

Transcript

  1. テストピラミッドを意識したテスト
    コード実装戦略
    PHP Conference Japan 2020
    Track4-3-B #track4-3-b-test-pyramid
    02

    View Slide

  2. Who’s 02?
    名前: 02 (大津和槻)
    Twitter: @cocoeyes02
    職業: Webエンジニア(主にバックエンド)
    経歴:
    PHPカンファレンス2019 登壇
    「PHPerのためのテストコード入門」

    View Slide

  3. 今回の登壇で話すこと
    ● テストピラミッドについて解説
    ● テストピラミッドを意識しながら、実際にLaravelとPHPをバージョンアップした事例
    共有

    View Slide

  4. 今回の登壇で話さない(話せない)こと
    ● どのプロダクトにも適応できるテストコード実装戦略

    View Slide

  5. 今回のゴール
    テストコード実装戦略実例を通して、
    テストピラミッドについて
    理解が深められること

    View Slide

  6. アジェンダ
    ● テストピラミッドとは?
    ● 各層のテストの紹介
    ● 実例:Laravelチュートリアルのバージョンアップ

    View Slide

  7. テストピラミッドとは?

    View Slide

  8. ユニットテスト
    統合テスト
    テストピラミッドと
    は?
    Mike Cohn氏が
    ”Succeeding with Agile”で
    最初に提唱した
    3つのテストのコストと実装
    すべきテスト量を 示したも

    UI
    テスト
















    View Slide

  9. ユニットテスト
    統合テスト
    テストピラミッドと
    は?
    コスト
    ● 実行時間
    ● テスト範囲
    ● 修正工数
    ○ メンテナンス
    ○ テスト失敗時の原
    因特定
    UI
    テスト
















    View Slide

  10. ユニットテスト
    統合テスト
    テストピラミッドと
    は?
    実装すべきテスト量
    ● テストのケース量
    ○ 正常系・異常系
    ○ パターン
    テスト結果(成功/失敗)が
    わかるまでかかる時間
    ≒実行時間×テストケース量
    UI
    テスト
















    View Slide

  11. フィードバックループ
    フィードバックを得るまでにかかる時間
    を図示したもの
    「テスト結果(成功/失敗)がわかるまで
    かかる時間」がそのまま「フィードバック
    を得るまでにかかる時間」になる
    wikipedia "Extreme programming"https://en.wikipedia.org/wiki/Extreme_programming

    View Slide

  12. フィードバックループ
    フィードバックを得るまでにかかる時間
    を図示したもの
    「テスト結果(成功/失敗)がわかるまで
    かかる時間」がそのまま「フィードバック
    を得るまでにかかる時間」になる
    →コストが少ないテストの方が、 生産
    性↑に繋がりやすい
    wikipedia "Extreme programming"https://en.wikipedia.org/wiki/Extreme_programming

    View Slide

  13. 各層のテストの紹介

    View Slide

  14. ユニットテスト
    統合テスト
    各層のテストの紹介
    ● UIテスト
    ● 統合テスト
    ● ユニットテスト
    UI
    テスト
















    View Slide

  15. ユニットテスト
    統合テスト
    UIテスト
    最もユーザ目線に近い。
    Webサービスではブラウザ
    を自動操作し、   期待通
    りの動作をしているか検証
    する
    Seleniumなどを利用した
    E2Eテストがこれに当たる。
    UI
    テスト
















    View Slide

  16. ユニットテスト
    統合テスト
    統合テスト
    特定のインプットを渡し
    返ってきた内容が   正し
    いかどうかを検証
    Featureテスト(Laravelの
    httpテスト)や、WebAPIを
    使ったテストはこれに当た

    UI
    テスト
















    View Slide

  17. ユニットテスト
    統合テスト
    統合テスト
    特定のインプットを渡し
    返ってきた内容が   正し
    いかどうかを検証
    Featureテスト(Laravelの
    httpテスト)や、WebAPIを
    使ったテストはこれに当た

    UI
    テスト
















    値、リクエス
    トなど

    View Slide

  18. ユニットテスト
    統合テスト
    ユニットテスト
    一つの関数やメソッドに対
    して、I/Oを通して  仕様通
    りの挙動をしているか検証
    する
    PHPでは、PHPUnitを使う
    例が多い
    UI
    テスト
















    View Slide

  19. 実例題材
    LaravelチュートリアルのバージョンUP

    View Slide

  20. Laravel Tutorial

    View Slide

  21. Laravel Tutorial
    ● 超シンプルなTODOリストサービス
    ○ 新規登録
    ○ ログイン
    ○ ログアウト
    ○ パスワードリセット
    ○ タスク追加
    ○ タスク削除
    ● Laravel 5.2 / PHP5.6
    ● 典型的なMVC

    View Slide

  22. ユニットテスト
    統合テスト
    Laravel Tutorial
    実装されているテストコードは
    featureテスト(統合テスト)のみ
    ● TOP画面が開ける
    ● 新規登録できる
    ● タスク作成/削除ができる
    ● 他人のタスクは見れない
    ● 他人のタスクの削除はできない
    UI
    テスト

    View Slide

  23. ユニットテスト
    統合テスト
    Laravel Tutorial
    PHPUnitを使っている(v4.8.36!)
    ● 実行時間は2秒ほど
    UI
    テスト

    View Slide

  24. Laravel Tutorial
    ● 「本番でバグが出ていることに気づかなかった」という状況を回避しつつ、「Laravel
    Tutorial」をバージョンアップしたい
    ● バージョンアップ時にエラーが発生する場合は、いち早く気づけるようにしたい

    View Slide

  25. テストピラミッドに合わせた方針候補
    ● 保険としてUIテストを追加する
    ● 一部設計を修正してから、ユニットテストを追加する

    View Slide

  26. 保険としてのUIテストを追加する
    ● ユーザー目線からのテスト(UIを含めてのテスト)も書いて、さらに担保している感を
    強めたい
    ○ FWのバージョンアップは、どこにバグが現れるかわからない
    ○ テストコードというのは、自分が書いたコードに自信を持つことも目的の 1つ
    ● 「全てUIテストで書く」ことはしない
    ○ 一番ユーザー目線に近いテストなので安心度があるが、全部 UIで書くとテスト時間が長くなる
    ■ 数十分、数時間かかるテストは運用するの辛い
    ■ 統合テストよりは少なくする
    ユニットテスト
    統合テスト
    UI
    テスト

    View Slide

  27. 保険としてのUIテストを追加する
    ● 今回はseleniumを採用
    ○ Laravel DuskはLarvael5.4からなので、今回は使えない
    ○ ChromeやFirefoxなどクロスブラウザでのテストができる余地を残しておく
    ● 新規登録→ログアウト→ログイン→タスク登録のUIテストを作成した
    ○ 実行時間は30秒
    ユニットテスト
    統合テスト
    UI
    テスト

    View Slide

  28. 一部設計を修正してからユニットテストを追加する
    ● 統合テストでカバーできていないテストは、ユニットテストで担保したい
    ○ バリデーション
    ○ モデル
    ● 一部リファクタリングをして、DBの処理などをモック化できるようにする
    ユニットテスト
    統合テスト
    UI
    テスト

    View Slide

  29. 一部設計を修正してからユニットテストを追加する
    ● 自分のタスクを一覧表示する機能をリファクタリング
    ○ 一覧表示するときの条件をクエリで決めるのではなく、 Collectionのメソッドを使って決めるようにし

    ○ ユニットテスト時には、「 Collectionのメソッドを使って決めた」部分だけテストすれば良い
    ユニットテスト
    統合テスト
    UI
    テスト

    View Slide

  30. 一部設計を修正してからユニットテストを追加する
    ● 新規登録時のバリデーションパターンを網羅
    ● タスク作成時のバリデーションパターンを網羅
    ● 自分のタスクを一覧表示する機能のロジックをテスト
    ● 実行時間は全部合わせて3.5秒ぐらい
    ユニットテスト
    統合テスト
    UI
    テスト

    View Slide

  31. Laravel Tutorial バージョンアップの結果は…?
    ● Laravel 5.2->5.3
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.3->5.4
    ○ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要
    だった)
    ○ あとはテストコードの修正をした
    ● Laravel 5.4->5.5, PHP5.6->7.0
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.5->5.6, PHP7.0 -> PHP7.1
    ○ 全層のテストコードでエラーを発見した

    View Slide

  32. Laravel Tutorial バージョンアップの結果は…?
    ● Laravel 5.2->5.3
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.3->5.4
    ○ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要
    だった)
    ○ あとはテストコードの修正をした
    ● Laravel 5.4->5.5, PHP5.6->7.0
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.5->5.6, PHP7.0 -> PHP7.1
    ○ 全層のテストコードでエラーを発見した

    View Slide

  33. Laravel Tutorial バージョンアップの結果は…?
    ● Laravel 5.2->5.3
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.3->5.4
    ○ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要
    だった)
    ○ あとはテストコードの修正をした
    ● Laravel 5.4->5.5, PHP5.6->7.0
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.5->5.6, PHP7.0 -> PHP7.1
    ○ 全層のテストコードでエラーを発見した

    View Slide

  34. Laravel Tutorial バージョンアップの結果は…?
    ● Laravel 5.2->5.3
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.3->5.4
    ○ UIテストのテストコードだけエラーを発見した( viewのキャッシュをクリアするコマンド実行が必要
    だった)
    ○ あとはテストコードの修正をした
    ● Laravel 5.4->5.5, PHP5.6->7.0
    ○ 全層のテストコードでエラーを発見した
    ● Laravel 5.5->5.6, PHP7.0 -> PHP7.1
    ○ 全層のテストコードでエラーを発見した
    →いちいち画面を見ることなく、バージョンアップの作業にもくもくできた

    View Slide

  35. 最後に
    ● どのテストも銀の弾丸というわけではない
    ○ それぞれ長所短所がある
    ● テストどの層でどの範囲を担保するのか、すり合わせることが大事
    ○ 全体を俯瞰して、どの機能がどのテストで担保できているのか見る必要がある

    View Slide

  36. 参考文献など
    ● 今回検証に使った環境
    ○ https://github.com/cocoeyes02/laravel_test_pyramid
    ● 参考文献
    ○ 初めての自動テスト ――Webシステムのための自動テスト基礎
    ○ https://www.oreilly.co.jp/books/9784873118161/

    View Slide