2023-11-02 JaSST'23 Kyushu 招待講演 https://www.jasst.jp/symposium/jasst23kyushu.html
実装完了後の手動テストに依存した開発サイクルに継続的テストのアプローチを適用し、段階的に品質を向上する方法について説明しています。
テスト自動化から、開発を支える継続的テストへNov 2, 2023
View Slide
Takuya Suemura末村 拓也●Autify, Inc●Technical Support Engineer / Test Automation Specialist●倉庫内軽作業→PHP開発→QAエンジニア→現職●JaSST Online 実行委員●趣味: テトリス、音ゲー、メカニカルキーボード
2020年: テストを自動化するのをやめ、自動テストを作ろう 手動でやってきたテストをただ自動化するだけじゃなく、ソフトウェアの一部として開発を支える自動テストをやっていきましょう、という話。 今日の発表の原点となっています。
2023年: リファクタリングが先か、テストが先か 一つのテストレベルで全部をまかなおうとせず、徐々にテストレベルを落としていくことで、自動テストをもっと効果的にしていこうという話。 直接今日の発表に関わるわけではないですが、少し関連しています。
今日話すことある開発チームのテストが継続的 テストに進化するまでの道筋
よくある開発の流れ実装バックログチケットチケットチケット実装実装テスト リリースバグ報告
自動化してみた実装バックログチケットチケットチケット実装実装リリースバグ報告E2E自動テスト
壁
DevOpshttps://wsmintl.com/blog/increase-efficiency-using-devops-manufacturing/
継続的テストhttps://danashby.co.uk/2016/10/19/continuous-testing-in-devops/
どうやって変わればいいのだろう壁
今日話すことある開発チームのテストが継続的テスト に進化するまでの道筋を順を追って説明しますクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
01.クライマックステストクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
ある開発チーム● Webアプリケーション開発● 開発者10人 + PO1人 + QA1人● スクラム開発 / 1スプリント2週間● スプリントの終わりにリリースPOQA開発者
クライマックステスト実装バックログチケットチケットチケット実装実装テスト リリースバグ報告UTUTUT・開発者はユニットテストを書くが、E2Eは書かない・リリースの直前にQAが手動テスト・リリース3日前にコードフリーズ(リリース範囲の確定)
課題一度にリリースする量が多い● 不具合が起きた時、原因を突き止めるのに時間がかかる● 不具合が起きた時、ロールバックが難しい● ライブラリのアップデートやセキュリティアップデートが入れづらい
課題駆け込みマージが多い● リリースを逃すと、次のリリースは2週間後● 充分テストせずマージされる
課題手戻りが多い● QAテストで不具合が見つかる→修正→再テスト● テストがリリースまでに間に合わないことも
ソリューション: テスト自動化?手動テストを自動化すれば● リリース頻度を増やせる○ →リリーススコープが小さくなる○ →駆け込みマージが減る○ →高速な再テスト
02.テスト自動化クライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
とにかく自動化してみよう● テスト実行だけを自動化する● テストする環境や項目は変えない● QAチームの手動テスト工数削減が目的
クライマックステスト実装バックログチケットチケットチケット実装実装テスト リリースバグ報告UTUTUT
自動化する実装バックログチケットチケットチケット実装実装リリースバグ報告UTUTUTE2E自動テスト手動テスト
成果 - テスト実行時間の短縮● 今まで4時間程度かけていたテスト実行が1〜2時間程度で完了するようになった
E2E自動テスト手動テスト課題 - 問題に気づくのが遅いバックログチケットチケットチケットリリースバグ報告ここでようやく問題に気づくこのテストコード古いみたいだよ実装実装実装UTUTUT
課題 - 問題に気づくのが遅い● アプリケーションの内部構造の変化による失敗● 仕様の変更による失敗● 不具合による失敗これらの確認や修正は リリースの直前 に発生するテストコードのメンテナンス という新たな作業
成果 - テスト実行時間の短縮● 今まで4時間程度かけていたテスト実行が1〜2時間程度で完了するようになった● しかし、テストコードのメンテナンスが障壁となりQAの作業負荷はあまり減らなかった
次のチャレンジ開発の「後」にテスト工程が集中しているのが悪い開発の「途中」に動かしたらどうなるだろう?
03.シフトレフトクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
開発の「後」に集中しているテストをバックログチケットチケットチケットリリースバグ報告実装実装実装UTUTUTE2E自動テスト手動テスト
開発の「途中」に持ってくるバックログチケットチケットチケットリリースE2EE2EE2E実装実装実装UTUTUT手動テスト
開発中に問題に気づけるバックログチケットチケットチケットE2EE2EE2E実装実装実装UTUTUTバックログテストコードが古いバグがあるリリース手動テスト
開発の途中でテストする開発中からE2Eテストを書く/実行する→ 開発中にテストの失敗に気づく→ 開発中にテストコードがメンテナンスされる
テストの独立性を高める
日常的に実行されるようにするE2EUT
成果● 問題に気づくタイミングが早くなった● リリース直前の仕事が減ったコードフリーズが短縮されリリースサイクルを 2週に1回 → 毎週 に短縮できた
課題 - 開発者たちのフラストレーションCI実行時間が長くなったユニットテストで充分なのにE2Eテスト書かないとだめなの?
次のチャレンジ● テストコードを最適化して実行時間を短くしよう● テストの役割を整理して無駄なテストを減らそう
04.テストリアーキテクティングクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
テストを最適化する実装バックログチケットチケットチケット実装リリース実装自動テスト自動テスト自動テスト手動テスト
テストケースのバランスを考えるE2EIntegrationUnitE2EIntegrationUnit
テストの役割分担を考えるテストレベル テストベースE2Eテスト ユーザーストーリー、ビジネス要求など結合テスト APIや大きなコンポーネントユニットテスト メソッドや関数などの小さなモジュールテストレベルごとに見つけたいバグが違うんですなるほどね
E2Eテストしすぎを減らす例: メールアドレスのバリデーション● ユニットテストでバリデーションルールをチェックする● 結合テストで正常系/異常系をテストする● E2Eテストで正常系をテストする
E2Eテストしすぎを減らす✅ 正しいメールアドレス [email protected]✅ エイリアスの入ったアドレス [email protected]❌ ローカルパートがない @example.com❌ ドメインパートがない foo123❌ ピリオドが連続している [email protected]❌ スペースが入っている foo [email protected]結合テストユニットテストE2Eテスト
E2Eテスト以外の選択肢を学ぶhttps://www.shoeisha.co.jp/book/detail/9784798178639 https://leanpub.com/everydayrailsrspec-jp
カバレッジの考え方ユースケースカバレッジ:E2Eテストがカバーしているユースケースの割合コードカバレッジ:自動テスト全体でカバーしているコードの割合
成果● E2Eテストの量が減った● 自動テストの実行時間が短くなり、カバレッジは増えた開発のテンポが良くなり、リリース頻度を 週1回 → 週4回 に増やせた
課題ちょっとした修正だ。QAも忙しそうだし、手動テストせずに出そう相談してほしかった……障害
課題E2Eテスト書いたしバッチリだよね障害テストケースが足りなかった……
課題一切のバグがない完璧なプロダクトだ利用性もテストしたい……使いにくい
課題● どんなテストが必要か、チームで議論する機会がない● 機能性しかテストしていない● 結局QAの手動テストはボトルネックのまま
次のチャレンジ● 開発の「前」にテストについて議論しよう● 開発の「後」にもたくさんテストしよう● アンブロッキングなプロセスを作ろう
05.継続的テストクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
課題感が変わった● ✅ 一度にリリースする量が多い● ✅ 駆け込みマージが多い● ✅ 手戻りが多い● どんなテストが必要か、チームで議論する機会がない● 機能性以外のテストがない● QAの手動テストがボトルネックになっている
課題感が変わった● どんなテストが必要か、チームで議論する機会がない● 機能性以外のテストがない● QAの手動テストがボトルネックになっている● 必要なテストについて議論する● 非機能性もテストする● QAの手動テストに頼らず様々な方法を使う● QAの手動テストを挟まずどんどんデプロイする
作る前からリリースの後までずっとテストする● 開発前: 仕様を理解する、仕様の抜け漏れを減らす● リリース前: 未知の不具合を探る● 段階的ロールアウト: ユーザーの反応を見る● GA (General Availability): 監視
いろんなところでテストする実装バックログチケットチケットチケット実装デプロイ実装自動テスト自動テスト自動テストデプロイデプロイβGA
開発の前実装バックログチケットチケットチケット実装デプロイ実装自動テスト自動テスト自動テストデプロイデプロイβGA
実例マッピングでビジネスルールを発見するhttps://speakerdeck.com/nihonbuson/example-mapping
リファインメントでテスト計画を立てる💡 SMSでの多要素認証E2Eテスト:● ユーザーは電話番号にSMSを送信できる。● ユーザーが不正な電話番号を指定すると、エラーが表示される。● 多要素認証を有効にしていないユーザーには、SMS認証画面が表示されない。結合テスト:● Twilioのテスト用番号を使って正常系/異常系のテストをする。探索的テスト:● 30分 3~5人 出来るだけ幅広いモバイルキャリア、OSを準備する● 目的: モバイルキャリアや端末に依存する問題を見つける。ロールアウト:● 日本国内の1%のユーザーに対して有効にし、段階的に範囲を広げる。
リファインメントでテスト計画を立てる💡 バグ修正: 検索結果表示数に 100 を指定しても表示数が変わらないE2Eテスト:● ユーザーは “50” を指定すると検索結果が50件になる。(既存)結合テスト:● APIパラメーターとして 25/50/75/100 が渡されたとき、レスポンスに含まれるアイテムの数はそれらに準じた数になる。● 検索結果の数が指定された数より少ない場合は、すべての検索結果がレスポンスに含まれる。探索的テスト:実施しない。
開発からデプロイまで実装バックログチケットチケットチケット実装デプロイ実装自動テスト自動テスト自動テストデプロイデプロイβGA
継続的デプロイメント● 必要なテストはリファインメントで合意している= QAの署名済み(サインオフ)● 自動テストが全て通ったらそのソフトウェアはリリースできる (Production-Ready)● QAの判断を待たずに開発者がどんどんデプロイする● QAは開発者をブロックせずテストできる
フィーチャートグル● 特定のユーザー、ワークスペースにのみ有効にする● n%のユーザーに対して有効にする
継続的デプロイメントとテストJanet Gregory, Lisa Crispin, and Yuya Kazama. Agile Testing Condensed Japanese Edition (Kindle Location 869). Kindle Edition.図形とイラストの追加は発表者によるもの。
ユーザーに使ってもらう実装バックログチケットチケットチケット実装デプロイ実装自動テスト自動テスト自動テストデプロイデプロイβGA
ユーザーにテストしてもらうカナリアリリース / パブリックベータリリース● ユーザビリティーの改善● 互換性など、事前に見つけにくい不具合の発見○ 例: 特定のOS、特定の言語設定でのみ文字化けする○ 例: 特定のファイアーウォール設定下でのみ画面の自動更新が不安定になる
リリース後実装バックログチケットチケットチケット実装デプロイ実装自動テスト自動テスト自動テストデプロイデプロイβGA
全ユーザーに使ってもらうGA (General Availability) リリース● 実稼働後中に起きたエラーの対処● パフォーマンス監視● UXモニタリング
エラーのチェックhttps://docs.sentry.io/product/issues/
Apdexスコアhttps://en.wikipedia.org/wiki/Apdex
Real User Monitoringhttps://newrelic.com/blog/best-practices/what-is-real-user-monitoring
成果● 今まで「手動テスト」で一括りにしていた活動がより明確になった● 開発サイクルをブロックせずに手動テストできた● 特定のフェーズに依存せず様々なところで問題をキャッチできるようになった週に4回 → 毎日数回 のデプロイの達成 🎉🎉🎉
まとめ
今日話したこと● 手動テストに依存したQAテストフェーズから開発サイクル全体を通した 継続的テスト に進化する道筋の例を話しました● この例をたたき台にして自分たちのチームでも話してみてください● 開発サイクルの要所要所で段階的にプロダクトを検証しリズミカルに品質を上げていきましょうクライマックステストテスト自動化シフトレフトテストリアーキテクティング継続的テスト
この通りにやれ、というわけではありませんリファインメントを試してみようフロントエンドのテストコードを書いてみようチームの形は様々今日の話を叩き台にしてできることを探してみよう
おまけ: 各種宣伝
Webアプリケーションの自動テストAutify for Web14日間無料トライアル受付中https://autify.com/ja/trialアジャイル開発のための、ソフトウェアテスト自動化プラットフォーム「Autify」
一緒に働く仲間を募集していますhttps://autify.com/ja/careers
Enjoy Testing!本講演をベースにした内容をAutify Blog にて公開予定です👉 https://blog.autify.com/ja最新の情報は で!https://x.com/tsueeemurahttps://x.com/autifyjapan