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

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

De4cef85165e8a063b5e40fe1f24daa4?s=47 02
December 12, 2020

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

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

De4cef85165e8a063b5e40fe1f24daa4?s=128

02

December 12, 2020
Tweet

Transcript

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

  2. Who’s 02? 名前: 02 (大津和槻) Twitter: @cocoeyes02 職業: Webエンジニア(主にバックエンド) 経歴:

    PHPカンファレンス2019 登壇 「PHPerのためのテストコード入門」
  3. 今回の登壇で話すこと • テストピラミッドについて解説 • テストピラミッドを意識しながら、実際にLaravelとPHPをバージョンアップした事例 共有

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

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

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

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

  8. ユニットテスト 統合テスト テストピラミッドと は? Mike Cohn氏が ”Succeeding with Agile”で 最初に提唱した

    3つのテストのコストと実装 すべきテスト量を 示したも の UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
  9. ユニットテスト 統合テスト テストピラミッドと は? コスト • 実行時間 • テスト範囲 •

    修正工数 ◦ メンテナンス ◦ テスト失敗時の原 因特定 UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
  10. ユニットテスト 統合テスト テストピラミッドと は? 実装すべきテスト量 • テストのケース量 ◦ 正常系・異常系 ◦

    パターン テスト結果(成功/失敗)が わかるまでかかる時間 ≒実行時間×テストケース量 UI テスト 実 装 す べ き テ ス ト 量 小 多 コ ス ト 大 小
  11. フィードバックループ フィードバックを得るまでにかかる時間 を図示したもの 「テスト結果(成功/失敗)がわかるまで かかる時間」がそのまま「フィードバック を得るまでにかかる時間」になる wikipedia "Extreme programming"https://en.wikipedia.org/wiki/Extreme_programming

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

    programming"https://en.wikipedia.org/wiki/Extreme_programming
  13. 各層のテストの紹介

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

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

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

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

    UI テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多 値、リクエス トなど
  18. ユニットテスト 統合テスト ユニットテスト 一つの関数やメソッドに対 して、I/Oを通して  仕様通 りの挙動をしているか検証 する PHPでは、PHPUnitを使う 例が多い UI

    テスト コ ス ト 大 小 実 装 す べ き テ ス ト 量 小 多
  19. 実例題材 LaravelチュートリアルのバージョンUP

  20. Laravel Tutorial

  21. Laravel Tutorial • 超シンプルなTODOリストサービス ◦ 新規登録 ◦ ログイン ◦ ログアウト

    ◦ パスワードリセット ◦ タスク追加 ◦ タスク削除 • Laravel 5.2 / PHP5.6 • 典型的なMVC
  22. ユニットテスト 統合テスト Laravel Tutorial 実装されているテストコードは featureテスト(統合テスト)のみ • TOP画面が開ける • 新規登録できる

    • タスク作成/削除ができる • 他人のタスクは見れない • 他人のタスクの削除はできない UI テスト
  23. ユニットテスト 統合テスト Laravel Tutorial PHPUnitを使っている(v4.8.36!) • 実行時間は2秒ほど UI テスト

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

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

  26. 保険としてのUIテストを追加する • ユーザー目線からのテスト(UIを含めてのテスト)も書いて、さらに担保している感を 強めたい ◦ FWのバージョンアップは、どこにバグが現れるかわからない ◦ テストコードというのは、自分が書いたコードに自信を持つことも目的の 1つ •

    「全てUIテストで書く」ことはしない ◦ 一番ユーザー目線に近いテストなので安心度があるが、全部 UIで書くとテスト時間が長くなる ▪ 数十分、数時間かかるテストは運用するの辛い ▪ 統合テストよりは少なくする ユニットテスト 統合テスト UI テスト
  27. 保険としてのUIテストを追加する • 今回はseleniumを採用 ◦ Laravel DuskはLarvael5.4からなので、今回は使えない ◦ ChromeやFirefoxなどクロスブラウザでのテストができる余地を残しておく • 新規登録→ログアウト→ログイン→タスク登録のUIテストを作成した

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

    統合テスト UI テスト
  29. 一部設計を修正してからユニットテストを追加する • 自分のタスクを一覧表示する機能をリファクタリング ◦ 一覧表示するときの条件をクエリで決めるのではなく、 Collectionのメソッドを使って決めるようにし た ◦ ユニットテスト時には、「 Collectionのメソッドを使って決めた」部分だけテストすれば良い

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

    統合テスト UI テスト
  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 ◦ 全層のテストコードでエラーを発見した
  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 ◦ 全層のテストコードでエラーを発見した
  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 ◦ 全層のテストコードでエラーを発見した
  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 ◦ 全層のテストコードでエラーを発見した →いちいち画面を見ることなく、バージョンアップの作業にもくもくできた
  35. 最後に • どのテストも銀の弾丸というわけではない ◦ それぞれ長所短所がある • テストどの層でどの範囲を担保するのか、すり合わせることが大事 ◦ 全体を俯瞰して、どの機能がどのテストで担保できているのか見る必要がある

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

    ◦ https://www.oreilly.co.jp/books/9784873118161/