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

事業継続を支える自動テストの考え方

tsuemura
February 06, 2025

 事業継続を支える自動テストの考え方

tsuemura

February 06, 2025
Tweet

More Decks by tsuemura

Other Decks in Technology

Transcript

  1. タイトルタイトルタイトルタイトルタ イトルタイトルタイトル 小見出し小見出し小見出し小見出し 末村 拓也 (Takuya Suemura) Autify, Inc. (2019

    -) Quality Evangelist • Ex. QA Manager • Ex. Senior Technical Support Engineer • Ex. Test Automation Engineer OPENLOGI (2017 - 2019) QA Engineer それより前はPHP開発をしていたり 倉庫でフォークリフトに載ったりしていました ソフトウェア品質や自動テストのあるべき姿を 業界の皆さんと一緒に考えるのが仕事です
  2. タイトルタイトルタイトルタイトルタ イトルタイトルタイトル 小見出し小見出し小見出し小見出し 末村 拓也 (Takuya Suemura) Autify, Inc. (2019

    -) Quality Evangelist • Ex. QA Manager • Ex. Senior Technical Support Engineer • Ex. Test Automation Engineer OPENLOGI (2017 - 2019) QA Engineer それより前はPHP開発をしていたり 倉庫でフォークリフトに載ったりしていました ソフトウェア品質や自動テストのあるべき姿を 業界の皆さんと一緒に考えるのが仕事です
  3. • ECサイトは「使われる側」で、エンドユーザーは「使う側」 • 決済APIは「使われる側」で、 ECサイトのバックエンドは「使う側」 • decrementItem() 関数は「使われる側」で proceedOrder() 関数は「使う側」

    「使われる側 = 提供する側」を プロバイダー 「使う側」を コンシューマー と呼ぶことにする 様々な「使う側」「使われる側」がある
  4. • sum(a, b) 関数に 1, 2 を与えると、関数は 3 を出力する •

    ログインフォームにメールアドレスとパスワードを入力すると、 サーバーはセッションIDを返し、マイページへリダイレクトする プロバイダーとコンシューマーのやりとりを具体的に記述する テストはふるまいの具体例
  5. • ふるまいはプロバイダーとコンシューマーの間で交わされる 契約が決める ◦ 仕様書などの成果物が残っている場合もあるし、 そうでない場合もある • プロバイダーは API、GUIなどのインターフェース を持つ

    ◦ DBならクエリがインターフェースだし、 関数なら呼び出しがインターフェースである • コンシューマー はインターフェースを通して目的を達成する • テストはお互いのふるまいの具体例である ざっくりまとめると
  6. • プロバイダーの ふるまいに依存したコード が自動テスト ◦ プロバイダーのふるまいが変わると テストコードは動かなくなる • 自動テストは多くの場合 コンシューマーのふるまいの具体例

    として記述される • プロバイダー実装だけで契約は守れない 自動テスト実装で契約を守り続ける 自動テストは契約を守り続けるための技術
  7. 契約の種類によって実施するテストは異なる 契約 プロバイダー コンシューマー テスト ECサイトの ユーザージャーニー アプリケーション エンドユーザー UIを用いた

    シナリオテスト 連携する倉庫システ ムのユースケース アプリケーション 倉庫管理システム APIを用いた シナリオテスト Web API仕様 Web API 外部システム API機能テスト アプリケーション ルーターの仕様 REST エンドポイント Webクライアント (ブラウザー) 結合テスト mail() 関数の仕様 mail() 関数 他の様々な関数 単体テスト
  8. 良いユーザーストーリーの特徴 INVEST • Independent • Negotiable • Valuable • Estimable

    • Small • Testable 機能を考えるときに「どうテストするか」も一緒に考える テスト可能なビジネスルール
  9. リファインメントでテスト計画を立てる 💡 SMSでの多要素認証 E2Eテスト: • ユーザーは電話番号にSMSを送信できる。 • ユーザーが不正な電話番号を指定すると、エラーが表示される。 • 多要素認証を有効にしていないユーザーには、SMS認証画面が表示されない。

    結合テスト : • Twilioのテスト用番号を使って正常系/異常系のテストをする。 探索的テスト : • 30分 3~5人 出来るだけ幅広いモバイルキャリア、OSを準備する • 目的: モバイルキャリアや端末に依存する問題を見つける。 ロールアウト : • 日本国内の1%のユーザーに対して有効にし、段階的に範囲を広げる。 テスト自動化から、 開発を支える継続的テストへ - SpeakerDeck
  10. • 想定を超えるたくさんのデータ • 複数タブをまたいだ利用 • 複数ユーザーでの同時編集 • スマートフォンからの操作 • 古すぎるブラウザ・デバイスでの操作

    • 低速な通信環境 ただのバグとして直すだけでなく、 現実の使われ方 として自動テストも書く 実際の使われ方からも学ぶ
  11. リファクタリングと分割統治 ProcessOrder() - 発送先バリデーション - 在庫引当 - 支払 - 在庫更新

    - 注文完了 在庫があり、有効な 支払い方法があれ ば、注文が完了する 在庫が無い場合、注 文できない 無効な発送先の場 合、注文できない 支払方法が無効な場 合、注文できない
  12. StockService OrderService リファクタリングと分割統治 ProcessOrder() 在庫があり、有効な 支払い方法があれ ば、注文が完了する 在庫が無い場合、注 文できない 無効な発送先の場

    合、注文できない 支払方法が無効な場 合、注文できない validateAddress() reserveStock() processPayment() useReservedStock() updateOrderStatus()
  13. StockService OrderService リファクタリングと分割統治 ProcessOrder() 在庫があり、有効な 支払い方法があれ ば、注文が完了する 在庫が無い場合、注 文できない 無効な発送先の場

    合、注文できない 支払方法が無効な場 合、注文できない validateAddress() reserveStock() processPayment() useReservedStock() updateOrderStatus() 東京都千代田区千代田1 は有効 横浜県神奈川市1 は無効 未注文→注文済にできる 注文済→注文済にできない 在庫が1のとき1つ予約できる 在庫が1のとき2つ予約できない 予約済みの在庫を減らせる 予約していない在庫は減らせない