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

CEDEC2023 『ロマンシング サガ リ・ユニバース』に適用したクラウド完結型のモバイルゲ...

CEDEC2023 『ロマンシング サガ リ・ユニバース』に適用したクラウド完結型のモバイルゲーム自動テストシステム完成までの軌跡

2023-08-23 から 2023-08-25 に開催された CEDEC2023 で発表した資料です。

登壇者: 山﨑 友貴、氏平 誠司
詳細は以下をご確認ください。
https://cedec.cesa.or.jp/2023/session/detail/s64257fa889833.html

More Decks by アカツキゲームス_Tech

Other Decks in Technology

Transcript

  1. ©Akatsuki Games Inc. 自己紹介 株式会社アカツキゲームス 研究開発部 QA Engineering QAエンジニア 山﨑

    友貴 tomotaka-yamasaki @tomo_tk11 JSTQB FL/AL-TA 資格保有 二児のパパ(4y, 1y) 子供の全力目覚ましで起きる日々。 2
  2. ©Akatsuki Games Inc. ターゲットリスナー 4 自動テスト導入してるけど、 デバイス管理がネックなんだ よなぁ。 自動テスト興味あるんだけど、 どこ目指せばいいかわかんない

    んだよなぁ。 • 運営型モバイルゲームの品質向上を目指している方 • 自動テストの導入を検討している方 • 自動テストを導入しているが、メンテナンスに苦しんでいる方
  3. ©Akatsuki Games Inc. ストーリーライン 1. テスト対象について 2. 運営型モバイルゲームテストの難しさ 3. 自動テストにおける課題

    4. 自動テスト導入目的 5. 持続可能な自動テストシステムのための技術紹介 6. クラウド完結型の自動テストシステム完成までの軌跡 7. 『ロマンシング サガ リ・ユニバース』への適用事例 8. まとめ 9. 今後の展望 5
  4. ©Akatsuki Games Inc. 1 テスト対象について 『ロマンシング サガ リ・ユニバース』(ロマサガRS)の紹介 7 •

    2018年12月に株式会社スクウェア・エニックスから リリースされた「ロマンシング サガ」完全新作 ◦ 「ロマンシング サガ3」から300年後の世界が舞台 • 2023年06月で4.5周年を迎えた長期運営タイトル • iOS、Android プラットフォームで提供している © SQUARE ENIX Powered by Akatsuki Inc. ILLUSTRATION: TOMOMI KOBAYASHI
  5. ©Akatsuki Games Inc. 2 運営型モバイルゲームテストの難しさ ゲームテストの難易度を高めている3つの要因 10 更新頻度 x 更新量

    = テスト実行コスト 運用レベルの更新 新規開発レベルの更新 • キャラクター ◦ ステータス、スキル、… ◦ 立ち絵、アイコン、エフェクト、… • イベント ◦ 難易度、報酬、… ◦ ミッション、シナリオ、… • and more… 月単位のシステム変更 週単位のデータ更新 • 新機能の追加 • 既存機能の大規模改修 • OS やゲームエンジンのアップデート追従 • and more…
  6. ©Akatsuki Games Inc. 12 「ゲーム」構成要素の 組み合わせ = ∞ • ロマサガRSのバトルの組み合わせだけでも、

    編成 x アクション x 状態 x … = ∞ • 簡単に組み合わせ爆発が起こる 2 運営型モバイルゲームテストの難しさ ゲームテストの難易度を高めている3つの要因
  7. ©Akatsuki Games Inc. 13 2 運営型モバイルゲームテストの難しさ ゲームテストの難易度を高めている3つの要因 - まとめ 1.

    更新頻度 x 更新量 = テスト実行コスト 運用的開発と新規的開発の更新頻度と量が多い 2. 増え続ける機能 = 増え続けるコスト リグレッションテストの項目が雪だるま式に増える 3. 「ゲーム」構成要素の組み合わせ = ∞ 簡単に組み合わせ爆発が起こる
  8. ©Akatsuki Games Inc. 14 2 運営型モバイルゲームテストの難しさ ゲームテストの難易度を高めている3つの要因 - まとめ 1.

    更新頻度 x 更新量 = テスト実行コスト 運用的開発と新規的開発の更新頻度と量が多い 2. 増え続ける機能 = 増え続けるコスト リグレッションテストの項目が雪だるま式に増える 3. 「ゲーム」構成要素の組み合わせ = ∞ 簡単に組み合わせ爆発が起こる これらのテストを 自動化すれば難易度 は下げられそう?
  9. ©Akatsuki Games Inc. 3 モバイルゲーム自動テストにおける課題 Web 業界とゲーム業界の自動テストの違い 16 Web 業界

    ゲーム業界 • Selenium*1, Playwright*2 などの テスト自動化ツール • Autify*3, mabl*4 などの テスト自動化プラットフォーム • 自社タイトルに最適化された 自動テストツール ◦ キャプチャリプレイツール*5*6 や マップ負荷可視化ツール*7 など ツール *1 Selenium, *2 Playwright *3 Autify, *4 mabl *5 CEDEC2020 | 株式会社セガ | 「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム *6 CEDEC2020 | 株式会社スクウェア・エニックス | “FINAL FANTASY VII REMAKE”における自動QAシステムの構築と運用 *7 CEDEC2022 | 株式会社テックフラッグ | 受託型開発会社が始める3Dアクションゲーム開発効率化のためのQA自動化への道のり~千里の道も一歩から~ Web 業界と違い、共通で使えるツールが少ない
  10. ©Akatsuki Games Inc. 1. 変化に強い自動テストスクリプトを設計する 2. 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステムを設計する 3. 変化しづらいテストを自動化する 19

    3 モバイルゲーム自動テストにおける課題 コンテンツの変化が激しく、自動テストが持続できない ゲームテストの難易度を高めている3つの要因 自動テストが テスト対象の変化に耐えられない 解 決 策 「ゲーム」構成要素の組み合わせ = ∞ 増え続ける機能 = 増え続けるコスト 更新頻度 x 更新量 = テスト実行コスト 激しい 変化
  11. ©Akatsuki Games Inc. • モバイルゲームは画面からだと、ピクセル化された情報しか参照できない ◦ 画像認識によって UI 要素を特定するしかない •

    ゲームは動的な UI デザインが多く、画像認識の精度を下げている 20 3 モバイルゲーム自動テストにおける課題 画面情報のみだと、UI 要素の取得が難しい 画像認識だけを用いると、テスト結果に偽陽性が生じる 解決策 画像認識以外で UI 要素を取得できる自動テストフレームワークを採用する
  12. ©Akatsuki Games Inc. • デバイスの用意・維持コスト ◦ OS、画面比率、処理性能ごとにデバイスを購入するコスト ◦ 電源がつかないなどのトラブル対応コスト ◦

    バッテリー膨張によるデバイス買い替えコスト • デバイス管理システムの構築・運用コスト ◦ Device Farmer(OpenSTF)* などの導入コスト 21 3 モバイルゲーム自動テストにおける課題 多種多様なデバイスの管理にコストがかかる * CEDEC2020 | 株式会社サムザップ | AirtestとPocoとOpenSTFによるUnity製 スマートフォン向けゲームの実機自動テスト環境構築とその利用方法 解決策 管理が不要なクラウド上のデバイスで、自動テストを実行する
  13. ©Akatsuki Games Inc. 1. コンテンツの変化が激しく、自動テストが持続できない 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステムを設計する 変化しづらいテストを自動化する 2. 画面情報のみだと、UI 要素の取得が難しい

    画像認識以外で UI 要素を取得できる自動テストフレームワークを採用する 3. 多種多様なデバイスの管理にコストがかかる 管理が不要なクラウド上のデバイスで、自動テストを実行する 22 3 モバイルゲーム自動テストにおける課題 モバイルゲームの自動テストが浸透しない3つの原因と、そのアプローチ - まとめ
  14. ©Akatsuki Games Inc. 24 4 運営型モバイルゲームの自動テスト導入目的 品質コストとは 適合 コスト 不具合混入を予防するためのコスト

    予防コスト 評価コスト 内部失敗 コスト 外部失敗 コスト 不適合 コスト 不具合を発見しやすくするためのコスト、 仕様書レビューのコスト リリース前の、テストまたはレビュー時に発見した 不具合の修正コスト リリース後の、本番不具合修正などにかかるコスト 品質 コスト 不適合コストを減らし、適合コストを増やすことが できれば自動テストの成功 低 高 ISTQBテスト技術者資格制度 Advanced Level シラバス 日本語版 テストマネージャ Version2012.J04, p43
  15. ©Akatsuki Games Inc. 25 4 運営型モバイルゲームの自動テスト導入目的 不適合コストとテスト実行コストの関係 JASPIC SPIJapan2009 奈良隆正

    ソフトウェア品質保証の方法論、技法、その変遷 テスト実行コストを最小化する ことで、フェーズ内阻止でき、 不適合コストが下がる フェーズごとの不具合修正(不適合)コスト フェーズ内阻止 不具合が混入したフェーズの中で 不具合を発見し、修正まで行うこと
  16. ©Akatsuki Games Inc. 26 4 運営型モバイルゲームの自動テスト導入目的 自動テスト導入目的 - まとめ 自動テスト導入前

    自動テスト導入後 テスト実行 コスト フェーズ内 阻止 不適合 コスト 自動テストによってテスト実行コストを下げ、 より早期にテスト可能にすること 導入目的
  17. ©Akatsuki Games Inc. 27 4 運営型モバイルゲームの自動テスト導入目的 それぞれのテストの得意領域とは 得意領域 「ゲーム」構成要素のロジックや組み合わせを機械的に比較するテスト •

    スキル効果説明文の生成ロジック • バトルでのスキル効果の発動有無 • and more… • テストが変化しづらく、繰り返し行われるテスト • IP(ドメイン)に関連した面白さのチェック • ユーザビリティやアクセシビリティなどの非機能テスト テストレベル ユニット テスト Small Large 手法 自動 自動 手動 E2E テスト テスト規模
  18. ©Akatsuki Games Inc. 28 4 運営型モバイルゲームの自動テスト導入目的 テストをもっと頻繁に、たくさん行うために リグレッション テスト スモーク

    テスト • デグレード(リグレッション)がないことを 確認するテスト ◦ 同じテストを繰り返すことで効果を発揮する • 基本的な動作に問題がないかどうかを確認 するテスト コストがかかる繰り返しのテストや、 基本動作のテストを自動化の対象とすると良さそう 変化しづらいテストを自動化する
  19. ©Akatsuki Games Inc. 5 • ゲームにフォーカスした自動テスト用のフレームワーク及びそのツール類 ◦ NetEase 社から提供されている(オープンソース) •

    Python によるテストスクリプトの記述 ◦ hoge.air/hoge.py というディレクトリ構成のスクリプト • パターンマッチングでの画像認識で UI を検知 • テストスクリプトの実装を手助けする IDE の提供あり • CLI でテスト実行可能 持続可能な自動テストシステムのための技術紹介 Airtest - ゲームのテスト自動化に特化したフレームワーク 30 https://airtest.netease.com/ https://github.com/AirtestProject/Airtest Airtest
  20. ©Akatsuki Games Inc. 5 • ゲームにフォーカスした自動テスト用のフレームワーク及びそのツール類 ◦ NetEase 社から提供されている(オープンソース) •

    Python によるテストスクリプトの記述 ◦ hoge.air/hoge.py というディレクトリ構成のスクリプト • パターンマッチングでの画像認識で UI を検知 • テストスクリプトの実装を手助けする IDE の提供あり • CLI でテスト実行可能 持続可能な自動テストシステムのための技術紹介 Airtest - ゲームのテスト自動化に特化したフレームワーク 31 https://airtest.netease.com/ https://github.com/AirtestProject/Airtest Airtest 実用性(保守のしやすさ、スクリプト作成の手軽さ)を考慮すると、 Airtest だけでは自動化を支えきれない
  21. ©Akatsuki Games Inc. 5 • アプリ内のメタ情報を Airtest で利用可能にするための自動テストツール ◦ Airtest

    同様 NetEase 社から提供されている(オープンソース) • UI オブジェクトの位置やツリー構造などの情報を解析し、テストスクリプト側で操作可能 • Airtest IDE の Inspector を使って UI 操作コードが自動生成可能 • RPC(Remote Procedure Call) を介してアプリ内の任意処理をコール可能 • 各ゲームエンジン用の SDK が提供されている 持続可能な自動テストシステムのための技術紹介 Poco - アプリ内のメタ情報を Airtest で利用可能にするツール 32 https://github.com/AirtestProject/Poco Poco
  22. ©Akatsuki Games Inc. 33 5 持続可能な自動テストシステムのための技術紹介 AWS Device Farm -

    クラウドのモバイルデバイスでテストできるサービス AWS Device Farm ※ これ以降、 Device Farm とする • AWS クラウドでホストされている物理モバイルデバイスでテストできるサービス ◦ テストスクリプトの実行ログ ◦ デバイスのスクリーンショット、動画 ◦ デバイスの性能メトリクス • デバイスの管理が AWS マネージドなので、テストに集中できる • オンデマンド利用することも可能なので、デバイスの準備コストがかからない
  23. ©Akatsuki Games Inc. プライベートデバイス • デバイスは専有する • テスト中 VPC エンドポイントで

    AWS Virtual Private Cloud に接続できる パブリックデバイス • デバイスは専有しない • テストごとに OS クリーンアップされる • iOS/Android、OS バージョン、デバイス を自由に選択できる 35 5 持続可能な自動テストシステムのための技術紹介 Device Farm デバイスの特徴とオンプレとの比較 デバイス管理コスト スケールのしやすさ 操作の自由度 開発環境への接続 オンプレ デバイス Device Farm プライベート デバイス Device Farm パブリック デバイス
  24. ©Akatsuki Games Inc. プライベートデバイス • デバイスは専有する • テスト中 VPC エンドポイントで

    AWS Virtual Private Cloud に接続できる パブリックデバイス • デバイスは専有しない • テストごとに OS クリーンアップされる • iOS/Android、OS バージョン、デバイス を自由に選択できる 36 5 持続可能な自動テストシステムのための技術紹介 Device Farm デバイスの特徴とオンプレとの比較 デバイス管理コスト スケールのしやすさ 操作の自由度 開発環境への接続 オンプレ デバイス Device Farm プライベート デバイス Device Farm パブリック デバイス 採用
  25. ©Akatsuki Games Inc. 1. テストスクリプトなどをまとめた zip 2. 実行の手順を記述した YAML 3.

    テスト対象のアプリケーション 37 5 持続可能な自動テストシステムのための技術紹介 テスト実行に必要なファイル testspec.yaml

  26. ©Akatsuki Games Inc. 1. Device Farm のホストマシンに zip が展開 2.

    デバイスにアプリをインストール 3. YAML に沿ってテストスクリプトの実行 4. 各種アーティファクトを保存 39 5 持続可能な自動テストシステムのための技術紹介 Device Farm 上でのテスト実行フロー Device Farm の機能で足りないものは ホストマシンやアプリで独自に実装することで 必要なログ・レポートなどの情報を取得している ① ② ③ ④
  27. ©Akatsuki Games Inc. 44 AWS CLI ▼ Airtest CLI Airtest

    CLI Airtest IDE 実行方法 実行環境 実行トリガー 6 クラウド完結型の自動テストシステム完成までの軌跡 自動テストが動作する環境とは Device Farm ローカル マシン Jenkins ローカル マシン ローカル マシン ※ Device Farm ホストマシン: Ubuntu(14.04)、 ローカルマシン: Mac(13.x) で動作している ユースケース エンジニア以外が自動テスト実行する エンジニアが手元のマシンから手軽に実行する テストスクリプトのデバッグを行う Poco の Inspector で UI 操作コードを生成する 用途 本番実行 開発
  28. ©Akatsuki Games Inc. ※ Device Farm ホストマシン: Ubuntu(14.04)、 ローカルマシン: Mac(13.x)

    で動作している 45 AWS CLI ▼ Airtest CLI Airtest CLI Airtest IDE 実行方法 実行環境 実行トリガー 6 クラウド完結型の自動テストシステム完成までの軌跡 自動テストが動作する環境とは Device Farm ローカル マシン Jenkins ローカル マシン ローカル マシン ユースケース エンジニア以外が自動テスト実行する エンジニアが手元のマシンから手軽に実行する テストスクリプトのデバッグを行う Poco の Inspector で UI 操作コードを生成する 用途 本番実行 開発 全環境で、同一のテストスクリプトを動作させることを目指します
  29. ©Akatsuki Games Inc. • Device Farm ホストマシンでは Python 2系、3系が標準で使用可能 ◦

    3系を使用したい場合、YAML で以下の環境変数を指定する export PYTHON_VERSION=3 • Python 2系: 2.7.9 • Python 3系: 3.7.4 47 6 クラウド完結型の自動テストシステム完成までの軌跡 Device Farm の Python 環境について
  30. ©Akatsuki Games Inc. • pipenv(+ pyenv) を導入し、Python バージョンを固定する ◦ pipenv

    install で開発環境を統一することができる • Python: 3.9 を採用 ◦ Airtestが保証しているバージョンの上限が 3.9 *1 48 6 クラウド完結型の自動テストシステム完成までの軌跡 Python バージョンを固定し、テスト結果を保証する • 実行環境の Python バージョンが統一されていない ◦ 同一のスクリプトで同様のテスト結果になる保証ができない 課題 解決策 *1 https://airtest.doc.io.netease.com/IDEdocs/3.4run_script/0_run_script/#1-python 実行環境 Device Farm ローカル マシン Python (2.7, 3.7) Python (3.11など)
  31. ©Akatsuki Games Inc. 49 6 クラウド完結型の自動テストシステム完成までの軌跡 pipenv でローカルの Python バージョンを統一する

    実行環境 Device Farm ローカル マシン Python (2.7, 3.7) pipenv (3.9) pipenv で統一可能 ※ Airtest IDE は Settings で指定する
  32. ©Akatsuki Games Inc. 50 6 クラウド完結型の自動テストシステム完成までの軌跡 pipenv でローカルの Python バージョンを統一する

    実行環境 Device Farm ローカル マシン Python (2.7, 3.7) pipenv (3.9) ローカルマシン同様、pipenv で Python をインストールしたい pipenv で統一可能 ※ Airtest IDE は Settings で指定する
  33. ©Akatsuki Games Inc. 51 6 クラウド完結型の自動テストシステム完成までの軌跡 Device Farm で同一の Python

    バージョンを利用する • ローカルでビルドした Python を Device Farm にアップロードする ◦ ホストマシンの OpenSSL が古い(1.0.2o)ため、OpenSSL(1.1.1q) もアップロード • テストスクリプトと同じ zip ファイルにまとめ、 YAML でパスを通す 課題 解決策 • Device Farm は実行ユーザ(device-farm)の権限が弱くインストールできない ◦ インストール(apt)コマンドや sudo コマンドが使用不可
  34. ©Akatsuki Games Inc. 52 6 クラウド完結型の自動テストシステム完成までの軌跡 実行環境の Python バージョンを統一する -

    まとめ AWS CLI ▼ Airtest CLI Airtest CLI Airtest IDE 実行方法 実行環境 実行トリガー Device Farm ローカル マシン Jenkins ローカル マシン ローカル マシン 実行環境 Device Farm ローカル マシン セルフ ビルド (3.9) pipenv (3.9) 実行環境の Python バージョンを 3.9 に統一した
  35. ©Akatsuki Games Inc. 54 6 クラウド完結型の自動テストシステム完成までの軌跡 テストフレームワークを導入し、ランチャースクリプトを作成する ランチャースクリプトのイメージ • テストフレームワークを導入し、

    ランチャースクリプトを作成する • 共通処理は、テスト前後処理や実際に テスト処理を行う関数内に記述する • テスト実行時の共通処理が多く、 テストスクリプトに書くコード量が多くなる ◦ Airtest の初期設定 ◦ テスト対象のアプリケーションの起動 ◦ テストレポートの出力 課題 解決策
  36. ©Akatsuki Games Inc. • Airtest CLI で実行すると、最終的に unittest で実行されている •

    これは、Python 実行に置き換え可能 $ airtest run smoke.air → $ python smoke.air/smoke.py 55 6 クラウド完結型の自動テストシステム完成までの軌跡 Airtest は何を使ってテスト実行しているのか airtest.cli.runner
  37. ©Akatsuki Games Inc. 56 6 クラウド完結型の自動テストシステム完成までの軌跡 CLI 実行にはテストフレームワーク pytest を導入する

    導入理由 • fixture 機能を利用したい ◦ 外からのパラメータをオプションを使って テストスクリプトに渡したい pytest --scenario smoke • 自動テストシステム自体のテストも同じ仕組みで書ける https://docs.pytest.org/en/latest/ CLI 実行時は、pytest の記法で記述したランチャースクリプトを使用する
  38. ©Akatsuki Games Inc. • Airtest IDE には任意のランチャーを 設定できる(カスタムランチャー) • IDE

    のテスト前後処理は custom_launcher.py で記述する • IDE メニューの Options > Settings で設定する 57 6 クラウド完結型の自動テストシステム完成までの軌跡 Airtest IDE 実行にはカスタムランチャーを定義する Airtest launcher (trial) custom_launcher.py
  39. ©Akatsuki Games Inc. 58 6 クラウド完結型の自動テストシステム完成までの軌跡 共通処理をランチャースクリプトに記述する - まとめ AWS

    CLI ▼ pytest pytest Airtest IDE 実行方法 実行環境 実行トリガー Device Farm ローカル マシン Jenkins ローカル マシン ローカル マシン 実行環境 Device Farm ローカル マシン セルフ ビルド (3.9) pipenv (3.9) CLI の実行方法を pytest に置き換え ランチャーを追加 CLI用 ランチャー IDE用 ランチャー
  40. ©Akatsuki Games Inc. 60 6 クラウド完結型の自動テストシステム完成までの軌跡 実行方法で、パラメータの入力方法を改善する • Device Farm

    ◦ 実行デバイス ◦ タイムアウト ◦ テスト対象のアプリバージョン ◦ and more… • テストスクリプト ◦ テストシナリオ ◦ 接続サーバ ◦ and more… ※ テストごとに変更するパラメータもある 増え続けるパラメータ • タスクランナー Invoke を導入する • テスト実行のために必要なパラメータの増加 ◦ 環境変数で指定する方法では、実行時の指定に苦労する $ TEST_SCENARIO=smoke TIMEOUT=10 ./run_device_farm.sh 課題 解決策
  41. ©Akatsuki Games Inc. 61 6 クラウド完結型の自動テストシステム完成までの軌跡 Invoke を用いて、パラメータを入力する 導入理由 •

    一連の作業をまとめることで、 パラメータを楽に指定することができる invoke test --scenario smoke --timeout 10 • テストスクリプトと同じ、Python で言語統一できる https://www.pyinvoke.org/
  42. ©Akatsuki Games Inc. 62 6 クラウド完結型の自動テストシステム完成までの軌跡 タスクランナーを用いてパラメータを入力する - まとめ Invoke

    ▶ AWS CLI ▶ pytest Invoke ▶ pytest Airtest IDE 実行環境 実行トリガー Device Farm ローカル マシン Jenkins ローカル マシン ローカル マシン 実行環境 Device Farm ローカル マシン セルフ ビルド (3.9) pipenv (3.9) CLI用 ランチャー IDE用 ランチャー CLI の実行方法を Invoke に変更し、 パラメータを入力し やすくした 実行方法
  43. ©Akatsuki Games Inc. 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト実行環境編 - まとめ 63 テスト結果通知編

    クラウド環境のテスト結果を 自動で受け取る テスト実行編 クラウド環境で 自動テスト実行する テスト実行環境編 開発しやすい環境を作る 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステム • 同一の Python バージョン • pytest とカスタムランチャー でランチャー作成 • Invoke によるパラメータ入力
  44. ©Akatsuki Games Inc. 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト実行編 64 テスト結果通知編 クラウド環境のテスト結果を 自動で受け取る

    テスト実行編 クラウド環境で 自動テスト実行する テスト実行環境編 開発しやすい環境を作る 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステム • 同一の Python バージョン • pytest とカスタムランチャー でランチャー作成 • Invoke によるパラメータ入力
  45. ©Akatsuki Games Inc. • Appium • Calabash • Instrumentation(Android) •

    UI Automator(Android) • UI Automation(iOS) • XCTest(iOS) 66 6 クラウド完結型の自動テストシステム完成までの軌跡 Airtest を Device Farm で動作させる Airtest は Device Farm で公式にサポートされていない サポートされているフレームワーク • Appium だと認識させて、 Airtest の実行を試みた際の課題 ◦ サポートされているフレームワークの 形式に沿っていないと実行不可 ◦ Airtest と Device Farm の adb が 衝突する
  46. ©Akatsuki Games Inc. 67 6 クラウド完結型の自動テストシステム完成までの軌跡 サポートされているフレームワークの形式に沿っていないと実行不可 Appium フレームワークに合わせ たディレクトリとファイル構成に

    する Airtest に必要なファイルのみ アップロードすると、Appium の 形式に合わずエラーになる 課題 解決策 AWS Device Farm での Appium Python 例: APPIUM_PYTHON_TEST_PACKAGE_TEST_DIR_MISSING
  47. ©Akatsuki Games Inc. 68 6 クラウド完結型の自動テストシステム完成までの軌跡 Airtest 側の adb を

    Device Farm のものに差し替えて対応した Airtest と Device Farm の adb が衝突する テスト時は Airtest に付属している adb が起動するが、 Device Farm 上で バージョンが異なる adb が既に起動しているため、エラーになる 課題 解決策 Android connection FAQ - Airtest Project Docs
  48. ©Akatsuki Games Inc. • アプリのビルドフローに Device Farm への アップロードフローを追加 •

    Amazon Simple Storage Service(S3) で アプリバージョンと ARN(Amazon リソースネーム) を管理 • Device Farm 起動時に、 S3 から ARN を取得して指定する ◦ Invoke のオプションではバージョン番号を 渡すだけで OK 70 6 クラウド完結型の自動テストシステム完成までの軌跡 アプリの任意のバージョンをテスト対象に指定する
  49. ©Akatsuki Games Inc. • VPC エンドポイントを許可する ◦ パブリックデバイスには無い • Device

    Farm の公開 IP レンジを全て許可 ◦ Device Farm の全てのデバイスからアクセスできてしまう 73 IP 制限をしているため、固定 IP で接続する必要がある 対 策 案 • Device Farm のパブリックデバイスから VPN 接続を行う ◦ AWS VPN に Client VPN があるので採用(VPN サーバの運用は不要) ◦ クライアントアプリの OpenVPN を使用して Airtest で接続を自動化 6 クラウド完結型の自動テストシステム完成までの軌跡 ゲームサーバに接続する要件 解 決 策
  50. ©Akatsuki Games Inc. 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト実行編 - まとめ 74 テスト結果通知編

    クラウド環境のテスト結果を 自動で受け取る テスト実行編 クラウド環境で 自動テスト実行する テスト実行環境編 開発しやすい環境を作る 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステム • 同一の Python バージョン • pytest とカスタムランチャー でランチャー作成 • Invoke によるパラメータ入力 • Appium で Airtest 動作 • 任意バージョンがテスト対象 として指定可能 • デバイスを VPN 接続
  51. ©Akatsuki Games Inc. 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト結果通知編 75 テスト結果通知編 クラウド環境のテスト結果を 自動で受け取る

    テスト実行編 クラウド環境で 自動テスト実行する テスト実行環境編 開発しやすい環境を作る 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステム • 同一の Python バージョン • pytest とカスタムランチャー でランチャー作成 • Invoke によるパラメータ入力 • Appium で Airtest 動作 • 任意バージョンがテスト対象 として指定可能 • デバイスを VPN 接続
  52. ©Akatsuki Games Inc. 77 6 クラウド完結型の自動テストシステム完成までの軌跡 なぜ実行結果を一元管理すべきなのか • 自動テストの結果は様々な視点から確認できたほうが良い ◦

    テストが失敗したときのトラブルシュートの速度が上がる • 様々な視点とは? ◦ 自動テストが最後まで流れたか ◦ アプリ側で実行時エラーが起こっていないか ◦ 実行中のリソースに問題がないか ◦ and more… できるだけ見たい情報を一元管理したい
  53. ©Akatsuki Games Inc. • 情報を S3 にまとめる • Web ホスティング機能を使用して1つのページで閲覧可能にする

    78 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト実行結果を一元管理する方法 • Airtest レポート • Device Farm 実行動画 • デバイスログ • デバイス性能メトリクス • and more… 必要な 情報 解決策
  54. ©Akatsuki Games Inc. • Airtest 標準レポートの機能を利用 • Device Farm のホストマシン上に出力

    する ◦ カスタムアーティファクトとして保存する • テスト実行後に AWS CLI で取得 79 6 クラウド完結型の自動テストシステム完成までの軌跡 Airtest 標準レポートの出力
  55. ©Akatsuki Games Inc. • テスト実行後に自動で動画をアーカイブ • レポートと同様に AWS CLI で取得

    80 6 クラウド完結型の自動テストシステム完成までの軌跡 Device Farm 実行動画ファイルの出力 • fps向上: 5 → 25 fps (実測値) • フレームが飛ぶ現象が起きなくなった 2023年06月のアップデートで性能向上
  56. ©Akatsuki Games Inc. 6 クラウド完結型の自動テストシステム完成までの軌跡 テスト結果通知編 - まとめ 83 テスト結果通知編

    クラウド環境のテスト結果を 自動で受け取る テスト実行編 クラウド環境で 自動テスト実行する テスト実行環境編 開発しやすい環境を作る 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステム • 同一の Python バージョン • pytest とカスタムランチャー でランチャー作成 • Invoke によるパラメータ入力 • Appium で Airtest 動作 • 任意バージョンがテスト対象 として指定可能 • デバイスを VPN 接続 • レポートは S3 で情報一元化 • Jenkins → Slack 通知までの パイプラインを作成
  57. ©Akatsuki Games Inc. 7 『ロマンシング サガ リ・ユニバース』への適用事例 自動テストシステムを安定化させるために選択したテスト 85 まずは、チュートリアルを突破するスモークテストに適用

    なぜリグレッションテストではなく、スモークテストなのか • 膨大なリグレッションテストケースを 自動テスト用に変換するコストが スモークテストよりも高かったため 曖昧性を残したテストケース (ハイレベルテストケース) 具体的にしたテストケース (ローレベルテストケース) 変換 コスト 手動テスト 自動テスト ISTQBテスト技術者資格制度 Advanced Level シラバス 日本語版 テストアナリスト Version 3.1.1.J03, p17
  58. ©Akatsuki Games Inc. 87 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった -

    自動化に不向きな仕様 その1 慣性が働くスクロールリストビュー • 適切な強さでスワイプする汎用関数の実装 ◦ 調整するパラメータをあえて制限 • タップ可能であることを検知する関数の実装 課題 解決策 • スワイプの力加減の調整が難しい • 対象の UI オブジェクトが画面上に 表示されていることが検知できない ◦ 画面外でタップするとエラー © SQUARE ENIX Powered by Akatsuki Inc. ILLUSTRATION: TOMOMI KOBAYASHI
  59. ©Akatsuki Games Inc. 88 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった -

    自動化に不向きな仕様 その2 同クラス名の UI オブジェクト • UI オブジェクト内の text で判定する poco(text="メロトセロイ").wait() 課題 解決策 • クラス名がユニークでない UI オブジェクトは クラス名で特定できない ◦ 選択される UI オブジェクトはヒエラルキー情報の 順番に依存する © SQUARE ENIX Powered by Akatsuki Inc. ILLUSTRATION: TOMOMI KOBAYASHI
  60. ©Akatsuki Games Inc. 89 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった -

    自動化に不向きな仕様 その3 動的に位置が変化する UI オブジェクト • UI オブジェクト位置の仕様を プランナーにヒアリングし、理解する ◦ 無駄のない自動テストを書く 課題 解決策 • マスターデータなどによって 位置が変化する UI オブジェクトを 特定する汎用的な自動化手段がない © SQUARE ENIX Powered by Akatsuki Inc. ILLUSTRATION: TOMOMI KOBAYASHI
  61. ©Akatsuki Games Inc. • 自動テストを効率良く実行するために、 SDK やデバッグ機能などをテスト対象に実装する活動が必要 ◦ Poco-SDK の導入

    ◦ 管理ツールの機能追加、API コール ◦ デバッグ機能の拡充や RPC 化 ◦ and more… 91 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった - 自動化の難易度を引き上げている要因 その1 ゲーム開発スキルが求められる
  62. ©Akatsuki Games Inc. • 開発エンジニアと議論し、実装の合意を得る必要がある ◦ ゲームアプリケーションの技術的スキルの習得難易度が高い ▪ クライアント、サーバなどのゲームを構成する要素の理解が必要 ▪

    ゲームアプリケーションによってアーキテクチャが異なる 92 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった - 自動化の難易度を引き上げている要因 その1 ゲーム開発スキルが求められる ゲーム開発経験が自然と求められる
  63. ©Akatsuki Games Inc. • 横断組織が自動テストを推進する難易度は高い ◦ 開発するために様々な権限を付与してもらう必要がある ▪ プロダクトに直結する AWS

    や Jenkins の権限はためらわれる ◦ プロダクトのリリースサイクルを理解する必要がある ▪ ステークホルダーを集めたミーティング実施タイミング ▪ コードのマージタイミング 93 7 『ロマンシング サガ リ・ユニバース』への適用事例 実装してわかった - 自動化の難易度を引き上げている要因 その2 コミュニケーションスキルが求められる
  64. ©Akatsuki Games Inc. • 導入するために、信頼値をどう積み上げていくか? 94 7 『ロマンシング サガ リ・ユニバース』への適用事例

    実装してわかった - 自動化の難易度を引き上げている要因 その2 コミュニケーションスキルが求められる 品質に関心の高いプロジェクトメンバーとともに活動する
  65. ©Akatsuki Games Inc. • 自動テストシステムを安定化させることを目的としたお試し適用 ◦ 自動テストシステムの完成度は高めることができたが、実運用には届かず ▪ 自動テストしやすい形にテスト対象を変更する作業に苦戦 •

    自動テストを実運用するために ◦ スモークテストだけでなく、assert による結果比較を行う自動テストが必要 ▪ 手動テストを自動テストに置き換えていく ◦ テスト実行コストを比較し、費用対効果が高いテストを自動化対象に選定する ▪ テストを自動化するコストは決して低くはない 95 7 『ロマンシング サガ リ・ユニバース』への適用事例 チュートリアル突破スモークテストを適用してみた結果
  66. ©Akatsuki Games Inc. 97 8 まとめ 運営型モバイルゲームの自動テスト導入目的 自動テスト導入前 自動テスト導入後 テスト実行

    コスト フェーズ内 阻止 不適合 コスト 自動テストによってテスト実行コストを下げ、 より早期にテスト可能にすること 導入目的
  67. ©Akatsuki Games Inc. 99 • 変化を受け入れ、最速で自動テストスクリプトを修正可能なシステムを設計する ◦ どの実行環境においても、同一のテストスクリプトで、同様のテスト結果になる ▪ Python

    バージョンをクラウドを含む全環境で統一 ▪ Invoke や pytest の採用 ◦ レポートを一元管理し、トラブルシュートの時間を短縮する • 変化しづらいテストを自動化する ◦ まずは、チュートリアル突破スモークテストを自動化 コンテンツの変化が激しく、自動テストシステムが持続できない 8 まとめ 持続可能な自動テストシステムを作るために
  68. ©Akatsuki Games Inc. 100 • 画像認識以外で UI 要素を取得できる自動テストフレームワークを採用する ◦ Airtest

    と Poco の採用 画面情報のみだと、UI 要素の取得が難しい 8 まとめ 持続可能な自動テストシステムを作るために
  69. ©Akatsuki Games Inc. 101 • 管理が不要なクラウド上のデバイスで、自動テストを実行する ◦ Device Farm パブリックデバイスを採用

    ◦ Device Farm 上で Airtest を動作させる ◦ デバイスを VPN 接続し、開発サーバにアクセスする 多種多様なデバイスの管理にコストがかかる 8 まとめ 持続可能な自動テストシステムを作るために
  70. ©Akatsuki Games Inc. 9 • assert による結果比較を行う自動テストの実装 ◦ 費用対効果の高い自動テストの選定と実装 •

    iOS の自動テストサポート • Production バイナリにおける自動テストの実施方法の検討 ◦ リリース直前で行うテストは、基本的な挙動の確認が多い 今後の展望 価値のある自動テストを効率よく増やしていけるかが課題 103
  71. ©Akatsuki Games Inc. Appendix. • 弊社技術ブログ ◦ AWS Device Farm

    で Airtest を動かす方法 ◦ Airtest で CLI, IDE や AWS Device Farm, Local など様々なテスト実行手段 ◦ AWS Device Farm を使って Airtest を実行するときのフローとは 105