食べログのソフトウェアテスト自動化デザインパターン(ダイジェスト版)
© Kakaku.com Inc. All Rights Reserved. 1⾷べログのソフトウェアテスト⾃動化デザインパターン(ダイジェスト版)株式会社カカクコム ⾷べログシステム本部 技術部Developer Productivityチーム hagevvashi2022年04⽉21-22⽇
View Slide
© Kakaku.com Inc. All Rights Reserved. 2⽬次 1. ⾷べログのソフトウェアテスト⾃動化デザインパターン概要2. ⾷べログのテスト⾃動化基盤3. パターン詳細4. 参考⽂献・クレジット
© Kakaku.com Inc. All Rights Reserved. 3⽬次 1. ⾷べログのソフトウェアテスト⾃動化デザインパターン概要2. ⾷べログのテスト⾃動化基盤3. パターン詳細4. 参考⽂献・クレジット
© Kakaku.com Inc. All Rights Reserved. 4⾷べログのソフトウェアテスト⾃動化デザインパターン概要ゆもつよメソッドテスト観点表のセルで並列実⾏選べるテスト実⾏単位PageObject賢すぎないPage Objectデータ駆動テストJSONデータ駆動テストComponentObjectBrowserAutomation APIWrapperStepにWait処理を書かないテスト⾃動化でアクセシビリティ向上アトミックなデプロイとテストの実⾏ログインユーザのプールメンテナビリティファースト⽣産性の実証ACL ProxyBlack HoleProxy振り分けプロキシCredential付与プロキシ実⾏環境単位でレポート出⼒テスト成功率のしきい値95%メッセージキューデプロイログアウトタグテスト要求分析パターン ⾔語・ツール選定のパターンフレームワーク設計パターンアーキテクチャ設計パターンパイプライン設計パターンテストケース⾃動化パターン インフラ設計パターン課題テスト⾃動化の⽬的の早期のフィードバック、テストの再利⽤の品質が低いパターン適⽤後の結果・コード修正後20分以内のフィードバック・1⽇10回実⾏して成功率90%・要件追従が2、3⽇でできる凡例パターンパターン⾷べログオリジナルデザインパターン引⽤デザインパターン適⽤順序A B
© Kakaku.com Inc. All Rights Reserved. 5⽬次1. ⾷べログのソフトウェアテスト⾃動化デザインパターン概要2. ⾷べログのテスト⾃動化基盤3. パターン詳細4. 参考⽂献・クレジット
© Kakaku.com Inc. All Rights Reserved. 6⾷べログのテスト⾃動化基盤1
© Kakaku.com Inc. All Rights Reserved. 7⾷べログのテスト⾃動化基盤2プロダクトSCMメッセージキュー⾃動デプロイ要求テスト⾃動化基盤⾃動デプロイマネージャ⾃動テスト実⾏要求デプロイ要求待ち受け認証プロキシテスト環境⾃動デプロイ実⾏⾃動テスト実⾏Internal Networkプロジェクトソースコード変更※1※2※3 ※4
© Kakaku.com Inc. All Rights Reserved. 8⾷べログのテスト⾃動化基盤3テストランナーブラウザ操作⾃動化ツールブラウザリクエスト振り分けProxy認証情報付与Proxy外部ドメインへのリクエスト(広告・計測 etc)認証プロキシ認証情報付与済みテスト環境へのリクエストFeature Step Page Objectテスト観点表テスト環境⾃動テスト実⾏要求SETテスト⾃動化基盤Chrome™MicrosoftEdge※5
© Kakaku.com Inc. All Rights Reserved. 9⽬次1. ⾷べログのソフトウェアテスト⾃動化デザインパターン概要2. ⾷べログのテスト⾃動化基盤3. パターン詳細4. 参考⽂献・クレジット
© Kakaku.com Inc. All Rights Reserved. 10パターン概要1: ⼿動テストと同じくらいフレキシブルなテスト実⾏Feature foo@AAAScenario xxxxGiven xxxxWhen xxxxThen xxxx@BBBScenario xxxxGiven xxxxWhen xxxxThen xxxx@CCCScenario xxxxGiven xxxxWhen xxxxThen xxxxFeature bar@AAAScenario xxxxGiven xxxxWhen xxxxThen xxxx@BBBScenario xxxxGiven xxxxWhen xxxxThen xxxx@CCCScenario xxxxGiven xxxxWhen xxxxThen xxxxjobjobjobjobjobゆもつよメソッド選べるテスト実⾏単位テスト観点表のセルで並列実⾏deploytestユースケース凡例テスト条件シナリオテスト観点表CucumberのFeatureファイル(テストスクリプト)・テストの実⾏単位をユースケース、テスト条件でフレキシブルに選択できる・テスト観点表のセルで並列実⾏することで、10分以内にテストが完了するタグ
© Kakaku.com Inc. All Rights Reserved. 11パターン概要2: 容易なテスト実装、変更に強いフレームワーク設計Feature Step WorldPage ObjectComponentObject責務:○ページが受け付けるブラウザ操作責務:○テスト⼿順を実⾏コードに変換✖テスト⼿順と振る舞い✖ページが受け付けるブラウザ操作✖UIパーツが受け付けるブラウザ操作✖ライブラリ依存分の集約責務:○UIパーツが受け付けるブラウザ操作責務:○ライブラリ依存部分の集約責務:○テスト⼿順と振る舞いStep の責務からページやUIパーツ、ライブラリ依存の責務を別のオブジェクトに分割
© Kakaku.com Inc. All Rights Reserved. 12パターン概要3: 安定したテストのためのテストケース⾃動化設計JSONデータ駆動テスト StepにWait処理を書かない ログアウトタグWhen 都道府県を<都道府県>に設定して検索Examples:| 都道府県 || 東京都 |⁝When ジャンルを<ジャンル>に設定して検索Examples:| ジャンル || 和⾷ |異なるテスト⼊⼒毎に、別のテスト⼿順を⽤意When 検索条件を<検索条件>に設定して検索Examples:| 検索条件 || ʼ{ “都道府県”: “東京都” }ʼ || ʻ{ “ジャンル”: “和⾷” }ʼ |AfterBeforeScenario Outline: ネット予約するGiven ログイン状態であるWhen ネット予約するThen 予約の条件が<期待結果>であるAnd ログアウトするBeforeAfterBeforeAfterJSONデータによって異なるテスト⼊⼒のテスト⼿順を共通化Wait処理の実装忘れを防ぎ、テストの安定性を向上Featureに事後条件を書かずに済み、テストの⼿順が⾒やすくなるWhen(“xxxx”, async function() {const page = new RestaurantPage();await this.driver.wait(/* 要素1を待つ */);page.menu.doSomething();await this.driver.wait(/* 要素2を待つ */);});When(“xxxx”, async function() {const page = await this.getPage(“レストランページ”);await page.menu.doSomething();});Wait処理を忘れると、ブラウザがクラッシュしたりする勝⼿に要素の表⽰を待ってくれる@logoutScenario Outline: ネット予約するGiven ログイン状態であるWhen ネット予約するThen 予約の条件が<期待結果>である全部のシナリオでログアウトさせたいわけではない
© Kakaku.com Inc. All Rights Reserved. 13パターン概要4: 柔軟なネットワーク設定を可能にするインフラ設計ブラウザリクエスト振り分けProxy認証情報付与Proxy外部ドメインへのリクエスト(広告・計測 etc)認証プロキシ認証情報付与済みテスト環境へのリクエストテスト環境Chrome™MicrosoftEdge課題: ⾃動テストからプロキシの例外設定・認証情報の設定ができない本来やりたかったこと:ブラウザの設定で、リクエストの振り分けとプロキシの認証情報の付与解決策: browsermob-proxyなどでプロキシサーバを⽴て、リクエストの振り分け・認証情報の付与を⾏う結果: 社内のSaasから社内のテスト環境にテストできるようになった⼿動テストの場合は、OSの設定でプロキシの認証情報を設定可能
© Kakaku.com Inc. All Rights Reserved. 14⽬次 1. ⾷べログのソフトウェアテスト⾃動化デザインパターン概要2. ⾷べログのテスト⾃動化基盤3. パターン詳細4. 参考⽂献・クレジット
© Kakaku.com Inc. All Rights Reserved. 15参考⽂献・湯本 剛 『ゆもつよメソッドによるテスト分析の 成り⽴ちと狙い』 (2020)http://jasst.jp/symposium/jasst20kansai/pdf/S5.pdf・Dima Kovalenko. Selenium Design Patterns and Best Practices. (ディマ・コヴァレンコ ⽟川 紘⼦・太⽥健⼀郎(監訳)、笹井 崇司(訳). Seleniumデザインパターン & ベストプラクティス 株式会社オライリー・ジャパン) (2015)・Graham Dorothy, Fewster Mark. Software Test Automation. (フュースター・マーク、グラハム・ドロシー テスト⾃動化研究会(訳). システムテスト⾃動化標準ガイド 株式会社 翔泳社) (2014)・Vaughn Vernon. Implementing domain-driven design. (ボーン・ヴァーノン ⾼⽊ 正弘(訳). 実践ドメイン駆動設計 : エリック・エヴァンスが確⽴した理論を実際の設計に応⽤する 株式会社 翔泳社) (2015)・渋川 よしき『アクセシビリティ情報を使った壊れにくいE2Eテスト』 (2021)https://docs.google.com/presentation/d/e/2PACX-1vShjxNOc81VhSwY5vDmH2pY6Opc05ZJuY3aemnQ0dmLc10ppBYxJYfKK9DcHLVxp_dQ0u6FUgaL_I_o/embed
© Kakaku.com Inc. All Rights Reserved. 16クレジット※3 Cucumber is a registered trademark of Cucumber Ltd.※2 Squid NOW icon - copyright Squid Project※1 Jenkins® is a registered trademark of LF Charities Inc.※5 Mozilla、Firefoxの商標およびロゴは、Mozilla Foundationの⽶国およびその他の国における登録商標または商標です。※4 Selenium is a registered trademark of Software Freedom Conservancy, Inc.
© Kakaku.com Inc. All Rights Reserved. 17付録
© Kakaku.com Inc. All Rights Reserved. 18パターン関係図ゆもつよメソッドテスト観点表のセルで並列実⾏選べるテスト実⾏単位PageObject賢すぎないPage Objectデータ駆動テストJSONデータ駆動テストComponentObjectBrowserAutomation APIWrapperStepにWait処理を書かないテスト⾃動化でアクセシビリティ向上アトミックなデプロイとテストの実⾏ログインユーザのプールメンテナビリティファースト⽣産性の実証ACL ProxyBlackholeProxy振り分けプロキシCredential付与プロキシ実⾏環境単位でレポート出⼒テスト成功率のしきい値95%メッセージキューデプロイログアウトタグテスト要求分析パターン ⾔語・ツール選定のパターンフレームワーク設計パターンアーキテクチャ設計パターンインフラ設計パターンパイプライン設計パターンテストケース⾃動化パターン