Slide 1

Slide 1 text

テスト自動化から、 開発を支える継続的テストへ Nov 2, 2023

Slide 2

Slide 2 text

Takuya Suemura 末村 拓也 ●Autify, Inc ●Technical Support Engineer / Test Automation Specialist ●倉庫内軽作業→PHP開発→QAエンジニア→現職 ●JaSST Online 実行委員 ●趣味: テトリス、音ゲー、メカニカルキーボード

Slide 3

Slide 3 text

2020年: テストを自動化するのをやめ、自動テストを作ろう  手動でやってきたテストをただ自動化する だけじゃなく、ソフトウェアの一部として開発 を支える自動テストをやっていきましょう、と いう話。  今日の発表の原点となっています。

Slide 4

Slide 4 text

2023年: リファクタリングが先か、テストが先か  一つのテストレベルで全部をまかなおうと せず、徐々にテストレベルを落としていくこと で、自動テストをもっと効果的にしていこうと いう話。  直接今日の発表に関わるわけではないで すが、少し関連しています。

Slide 5

Slide 5 text

今日話すこと ある開発チームのテストが 継続的 テストに進化するまでの道筋

Slide 6

Slide 6 text

よくある開発の流れ 実装 バックログ チケット チケット チケット 実装 実装 テスト リリース バグ報告

Slide 7

Slide 7 text

自動化してみた 実装 バックログ チケット チケット チケット 実装 実装 リリース バグ報告 E2E 自動テスト

Slide 8

Slide 8 text

Slide 9

Slide 9 text

DevOps https://wsmintl.com/blog/increase-efficiency-using-devops-manufacturing/

Slide 10

Slide 10 text

継続的テスト https://danashby.co.uk/2016/10/19/continuous-testing-in-devops/

Slide 11

Slide 11 text

どうやって変わればいいのだろう 壁

Slide 12

Slide 12 text

今日話すこと ある開発チームのテストが 継続的テスト に進化するまでの道筋を 順を追って説明します クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 13

Slide 13 text

01. クライマックステスト クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 14

Slide 14 text

ある開発チーム ● Webアプリケーション開発 ● 開発者10人 + PO1人 + QA1人 ● スクラム開発 / 1スプリント2週間 ● スプリントの終わりにリリース PO QA 開発者

Slide 15

Slide 15 text

クライマックステスト 実装 バックログ チケット チケット チケット 実装 実装 テスト リリース バグ報告 UT UT UT ・開発者はユニットテストを書くが、 E2Eは 書かない ・リリースの直前にQAが手動テスト ・リリース3日前にコードフリーズ(リリース 範囲の確定)

Slide 16

Slide 16 text

課題 一度にリリースする量が多い ● 不具合が起きた時、原因を突き止めるのに時間がかかる ● 不具合が起きた時、ロールバックが難しい ● ライブラリのアップデートやセキュリティアップデートが入れづ らい

Slide 17

Slide 17 text

課題 駆け込みマージが多い ● リリースを逃すと、次のリリースは2週間後 ● 充分テストせずマージされる

Slide 18

Slide 18 text

課題 手戻りが多い ● QAテストで不具合が見つかる→修正→再テスト ● テストがリリースまでに間に合わないことも

Slide 19

Slide 19 text

ソリューション: テスト自動化? 手動テストを自動化すれば ● リリース頻度を増やせる ○ →リリーススコープが小さくなる ○ →駆け込みマージが減る ○ →高速な再テスト

Slide 20

Slide 20 text

02. テスト自動化 クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 21

Slide 21 text

とにかく自動化してみよう ● テスト実行だけを自動化する ● テストする環境や項目は変えない ● QAチームの手動テスト工数削減が目的

Slide 22

Slide 22 text

クライマックステスト 実装 バックログ チケット チケット チケット 実装 実装 テスト リリース バグ報告 UT UT UT

Slide 23

Slide 23 text

自動化する 実装 バックログ チケット チケット チケット 実装 実装 リリース バグ報告 UT UT UT E2E 自動テスト 手動テスト

Slide 24

Slide 24 text

成果 - テスト実行時間の短縮 ● 今まで4時間程度かけていたテスト実行が 1〜2時間程度で完了するようになった

Slide 25

Slide 25 text

E2E 自動テスト 手動テスト 課題 - 問題に気づくのが遅い バックログ チケット チケット チケット リリース バグ報告 ここでようやく問題に気づく このテストコード 古いみたいだよ 実装 実装 実装 UT UT UT

Slide 26

Slide 26 text

課題 - 問題に気づくのが遅い ● アプリケーションの内部構造の変化による失敗 ● 仕様の変更による失敗 ● 不具合による失敗 これらの確認や修正は リリースの直前 に発生する テストコードのメンテナンス という新たな作業

Slide 27

Slide 27 text

成果 - テスト実行時間の短縮 ● 今まで4時間程度かけていたテスト実行が 1〜2時間程度で完了するようになった ● しかし、テストコードのメンテナンスが障壁となり QAの作業負荷はあまり減らなかった

Slide 28

Slide 28 text

次のチャレンジ 開発の「後」にテスト工程が集中しているのが悪い 開発の「途中」に動かしたらどうなるだろう?

Slide 29

Slide 29 text

03. シフトレフト クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 30

Slide 30 text

開発の「後」に集中しているテストを バックログ チケット チケット チケット リリース バグ報告 実装 実装 実装 UT UT UT E2E 自動テスト 手動テスト

Slide 31

Slide 31 text

開発の「途中」に持ってくる バックログ チケット チケット チケット リリース E2E E2E E2E 実装 実装 実装 UT UT UT 手動テスト

Slide 32

Slide 32 text

開発中に問題に気づける バックログ チケット チケット チケット E2E E2E E2E 実装 実装 実装 UT UT UT バックログ テストコード が古い バグがある リリース 手動テスト

Slide 33

Slide 33 text

開発の途中でテストする 開発中からE2Eテストを書く/実行する → 開発中にテストの失敗に気づく → 開発中にテストコードがメンテナンスされる

Slide 34

Slide 34 text

テストの独立性を高める

Slide 35

Slide 35 text

日常的に実行されるようにする E2E UT

Slide 36

Slide 36 text

成果 ● 問題に気づくタイミングが早くなった ● リリース直前の仕事が減った コードフリーズが短縮され リリースサイクルを 2週に1回 → 毎週 に短縮できた

Slide 37

Slide 37 text

課題 - 開発者たちのフラストレーション CI実行時間が長くなった ユニットテストで充分なのに E2Eテスト書かないとだめなの?

Slide 38

Slide 38 text

次のチャレンジ ● テストコードを最適化して実行時間を短くしよう ● テストの役割を整理して無駄なテストを減らそう

Slide 39

Slide 39 text

04. テスト リアーキテクティング クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 40

Slide 40 text

テストを最適化する 実装 バックログ チケット チケット チケット 実装 リリース 実装 自動 テスト 自動 テスト 自動 テスト 手動テスト

Slide 41

Slide 41 text

テストケースのバランスを考える E2E Integration Unit E2E Integration Unit

Slide 42

Slide 42 text

テストの役割分担を考える テストレベル テストベース E2Eテスト ユーザーストーリー、ビジネス要求など 結合テスト APIや大きなコンポーネント ユニットテスト メソッドや関数などの小さなモジュール テストレベルごとに 見つけたいバグが違うんです なるほどね

Slide 43

Slide 43 text

E2Eテストしすぎを減らす 例: メールアドレスのバリデーション ● ユニットテストでバリデーションルールをチェックする ● 結合テストで正常系/異常系をテストする ● E2Eテストで正常系をテストする

Slide 44

Slide 44 text

E2Eテストしすぎを減らす ✅ 正しいメールアドレス [email protected] ✅ エイリアスの入ったアドレス [email protected] ❌ ローカルパートがない @example.com ❌ ドメインパートがない foo123 ❌ ピリオドが連続している [email protected] ❌ スペースが入っている foo [email protected] 結合テスト ユニットテスト E2Eテスト

Slide 45

Slide 45 text

E2Eテスト以外の選択肢を学ぶ https://www.shoeisha.co.jp/book/detail/9784798178639 https://leanpub.com/everydayrailsrspec-jp

Slide 46

Slide 46 text

カバレッジの考え方 ユースケースカバレッジ: E2Eテストがカバーしているユースケースの割合 コードカバレッジ: 自動テスト全体でカバーしているコードの割合

Slide 47

Slide 47 text

成果 ● E2Eテストの量が減った ● 自動テストの実行時間が短くなり、カバレッジは増えた 開発のテンポが良くなり、 リリース頻度を 週1回 → 週4回 に増やせた

Slide 48

Slide 48 text

課題 ちょっとした修正だ。 QAも忙しそうだし、 手動テストせずに出そう 相談して ほしかった …… 障害

Slide 49

Slide 49 text

課題 E2Eテスト書いたし バッチリだよね 障害 テストケースが 足りなかった……

Slide 50

Slide 50 text

課題 一切のバグがない 完璧なプロダクトだ 利用性もテストし たい…… 使いにくい

Slide 51

Slide 51 text

課題 ● どんなテストが必要か、チームで議論する機会がない ● 機能性しかテストしていない ● 結局QAの手動テストはボトルネックのまま

Slide 52

Slide 52 text

次のチャレンジ ● 開発の「前」にテストについて議論しよう ● 開発の「後」にもたくさんテストしよう ● アンブロッキングなプロセスを作ろう

Slide 53

Slide 53 text

05. 継続的テスト クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 54

Slide 54 text

課題感が変わった ● ✅ 一度にリリースする量が多い ● ✅ 駆け込みマージが多い ● ✅ 手戻りが多い ● どんなテストが必要か、 チームで議論する機会がない ● 機能性以外のテストがない ● QAの手動テストが ボトルネックになっている

Slide 55

Slide 55 text

課題感が変わった ● どんなテストが必要か、 チームで議論する機会がない ● 機能性以外のテストがない ● QAの手動テストが ボトルネックになっている ● 必要なテストについて議論する ● 非機能性もテストする ● QAの手動テストに頼らず 様々な方法を使う ● QAの手動テストを挟まず どんどんデプロイする

Slide 56

Slide 56 text

作る前からリリースの後までずっとテストする ● 開発前: 仕様を理解する、仕様の抜け漏れを減らす ● リリース前: 未知の不具合を探る ● 段階的ロールアウト: ユーザーの反応を見る ● GA (General Availability): 監視

Slide 57

Slide 57 text

いろんなところでテストする 実装 バックログ チケット チケット チケット 実装 デプロイ 実装 自動 テスト 自動 テスト 自動 テスト デプロイ デプロイ β GA

Slide 58

Slide 58 text

開発の前 実装 バックログ チケット チケット チケット 実装 デプロイ 実装 自動 テスト 自動 テスト 自動 テスト デプロイ デプロイ β GA

Slide 59

Slide 59 text

実例マッピングでビジネスルールを発見する https://speakerdeck.com/nihonbuson/example-mapping

Slide 60

Slide 60 text

リファインメントでテスト計画を立てる 💡 SMSでの多要素認証 E2Eテスト: ● ユーザーは電話番号にSMSを送信できる。 ● ユーザーが不正な電話番号を指定すると、エラーが表示される。 ● 多要素認証を有効にしていないユーザーには、SMS認証画面が表示されない。 結合テスト: ● Twilioのテスト用番号を使って正常系/異常系のテストをする。 探索的テスト: ● 30分 3~5人 出来るだけ幅広いモバイルキャリア、OSを準備する ● 目的: モバイルキャリアや端末に依存する問題を見つける。 ロールアウト: ● 日本国内の1%のユーザーに対して有効にし、段階的に範囲を広げる。

Slide 61

Slide 61 text

リファインメントでテスト計画を立てる 💡 バグ修正: 検索結果表示数に 100 を指定しても表示数が変わらない E2Eテスト: ● ユーザーは “50” を指定すると検索結果が50件になる。(既存) 結合テスト: ● APIパラメーターとして 25/50/75/100 が渡されたとき、レスポンスに含まれるアイテムの 数はそれらに準じた数になる。 ● 検索結果の数が指定された数より少ない場合は、すべての検索結果がレスポンスに含 まれる。 探索的テスト: 実施しない。

Slide 62

Slide 62 text

開発からデプロイまで 実装 バックログ チケット チケット チケット 実装 デプロイ 実装 自動 テスト 自動 テスト 自動 テスト デプロイ デプロイ β GA

Slide 63

Slide 63 text

継続的デプロイメント ● 必要なテストはリファインメントで合意している = QAの署名済み(サインオフ) ● 自動テストが全て通ったら そのソフトウェアはリリースできる (Production-Ready) ● QAの判断を待たずに開発者がどんどんデプロイする ● QAは開発者をブロックせずテストできる

Slide 64

Slide 64 text

フィーチャートグル ● 特定のユーザー、ワークスペースにのみ有効にする ● n%のユーザーに対して有効にする

Slide 65

Slide 65 text

継続的デプロイメントとテスト Janet Gregory, Lisa Crispin, and Yuya Kazama. Agile Testing Condensed Japanese Edition (Kindle Location 869). Kindle Edition. 図形とイラストの追加は発表者によるもの。

Slide 66

Slide 66 text

ユーザーに使ってもらう 実装 バックログ チケット チケット チケット 実装 デプロイ 実装 自動 テスト 自動 テスト 自動 テスト デプロイ デプロイ β GA

Slide 67

Slide 67 text

ユーザーにテストしてもらう カナリアリリース / パブリックベータリリース ● ユーザビリティーの改善 ● 互換性など、事前に見つけにくい不具合の発見 ○ 例: 特定のOS、特定の言語設定でのみ文字化けする ○ 例: 特定のファイアーウォール設定下でのみ 画面の自動更新が不安定になる

Slide 68

Slide 68 text

リリース後 実装 バックログ チケット チケット チケット 実装 デプロイ 実装 自動 テスト 自動 テスト 自動 テスト デプロイ デプロイ β GA

Slide 69

Slide 69 text

全ユーザーに使ってもらう GA (General Availability) リリース ● 実稼働後中に起きたエラーの対処 ● パフォーマンス監視 ● UXモニタリング

Slide 70

Slide 70 text

エラーのチェック https://docs.sentry.io/product/issues/

Slide 71

Slide 71 text

Apdexスコア https://en.wikipedia.org/wiki/Apdex

Slide 72

Slide 72 text

Real User Monitoring https://newrelic.com/blog/best-practices/what-is-real-user-monitoring

Slide 73

Slide 73 text

成果 ● 今まで「手動テスト」で一括りにしていた活動が より明確になった ● 開発サイクルをブロックせずに手動テストできた ● 特定のフェーズに依存せず 様々なところで問題をキャッチできるようになった 週に4回 → 毎日数回 のデプロイの達成 🎉🎉🎉

Slide 74

Slide 74 text

まとめ

Slide 75

Slide 75 text

今日話したこと ● 手動テストに依存したQAテストフェーズから 開発サイクル全体を通した 継続的テスト に進化する 道筋の例を話しました ● この例をたたき台にして 自分たちのチームでも話してみてください ● 開発サイクルの要所要所で段階的にプロダクトを検証し リズミカルに品質を上げていきましょう クライマックステスト テスト自動化 シフトレフト テスト リアーキテクティング 継続的テスト

Slide 76

Slide 76 text

この通りにやれ、というわけではありません リファインメントを 試してみよう フロントエンドの テストコードを書いてみよう チームの形は様々 今日の話を叩き台にして できることを探してみよう

Slide 77

Slide 77 text

おまけ: 各種宣伝

Slide 78

Slide 78 text

Webアプリケーションの自動テスト Autify for Web 14日間無料トライアル受付中 https://autify.com/ja/trial アジャイル開発のための、 ソフトウェアテスト自動化プラットフォーム「Autify」

Slide 79

Slide 79 text

一緒に働く仲間を募集しています https://autify.com/ja/careers

Slide 80

Slide 80 text

一緒に働く仲間を募集しています https://autify.com/ja/careers

Slide 81

Slide 81 text

Enjoy Testing! 本講演をベースにした内容を Autify Blog にて公開予定です 👉 https://blog.autify.com/ja 最新の情報は で! https://x.com/tsueeemura https://x.com/autifyjapan