GAME CREATORS CONFERENCE '20の講演資料です。 動画のURL:https://youtu.be/jTIIeKKM68Q
『「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて』 株式会社セガ 第1事業部 阪上直樹
©SEGA「龍が如く 7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて株式会社セガ 第1事業部(龍が如くスタジオ・ドラゴンエンジンチーム)阪上 直樹
View Slide
©SEGA自己紹介• 龍が如くスタジオ専属のQAエンジニア*– 開発環境とQAの自動化が主な仕事– ゲーム内のコードもバリバリ書く• 書いたコードは、製品には1行も入らない• 海外ではEmbedded QAと呼んでいる– SEGA TECH Blog : QAエンジニアってどんな仕事?~ゲーム開発におけるテストの世界~• http://techblog.sega.jp/entry/2018/08/27/100000※QAとはQuality Assuranceの略で品質保証のことを指します
©SEGA本講演で得られる知見• ゲームの開発におけるテスト自動化の手法• 自動テストの成果やコストの実例• 自動テストシステムを構築するための知識• 自動テスト普及のための取り組み「自動テストを始めてみよう!」というモチベーション
©SEGA目次• ゲーム開発における自動テスト• 自動テスト作成ツール• 自動テストのワークフロー• テスト自動化チーム(仮)の取り組み• まとめ
©SEGA• テスト– ゲームをプレイしてバグを見つける– バグを報告し、修正を確認する– QAテスターの仕事• デバッグ– バグの原因を調査する– バグを修正する– 開発者(主にプログラマ)の仕事「テスト」と「デバッグ」
©SEGA「自動テスト」と「テスト自動化」テスト自動化テストケース設計の自動化自動テストテスト実行の自動化テスト環境構築・運用の自動化テストレポート作成・分析の自動化
©SEGAテストピラミッド(システム開発)単体結合UIコスト高低
©SEGAテストピラミッド(ゲーム開発)単体結合Playコスト高低• 通しプレイ• ミッションクリア• コリジョン抜けチェック• 起動チェック• ステージ描画テスト• イベントシーン単体再生• ゲームオブジェクト・エンティティの連携動作• 関数・モジュール単位の単体テスト• ライブラリ・エンジンのテスト• データのレギュレーションチェック• ゲームオブジェクト・エンティティの単体動作※本講演でのテストピラミッドの定義
©SEGA本講演のタイトル紹介龍が如く7 光と闇の行方PS4Ⓡ/2020年1月16日発売
©SEGA自動テスト導入のきっかけ• カバーすべきテストケースが膨大– メインストーリーをクリアするだけでも数十時間– 手動テストが賄えない範囲をサポートするため• 自動プレイテストを導入– 単体テストはゲームのアプリ層だと難しい• 結果が画像出力しかない場合が多く、成否が不安定– 信頼性の確保• 自動テストを通常のゲームに限りなく近い状態で実行することで開発チームに信頼してもらう
©SEGA龍が如く7での自動テストのデモどこでもリプレイシステム手動プレイ中にどこでも記録・リプレイが可能!手動プレイを記録中 リプレイ再生中
©SEGA外部ツールゲーム内どこでもリプレイエディタGUI(C#)WebSocketサーバどこでもリプレイシステム(記録)ゲーム動作をアクション単位でスクリプト化ゲームを手動でプレイ
©SEGAPythonを採用した理由• 人気があって使える人が多い• これから学習する人にとっても有益な言語– ほかの自動化にも使える• ゲーム外のモジュールとの連携のしやすさ– 画像認識(OpenCV、PyOCRなど)– データ分析(Pandasなど)– 機械学習(TensorFlow、Keras、OpenAIなど)
©SEGA条件分岐・ループ• while文で同じ動作を繰り返す例
©SEGA外部ツールゲーム内どこでもリプレイシステム(再生)アクションを指定 どこでもリプレイCUI(Python)結果通知結果JSONで受け渡しAutoAIWebSocketサーバAutoPadPad情報どこでもリプレイエディタGUI(C#)行ごとの結果pyファイル path(x,y,z)をアクション(JSON)に変換
©SEGA外部ツールゲーム内WebSocketサーバアクションを指定 どこでもリプレイCUI(Python)結果通知結果JSONで受け渡しどこでもリプレイエディタGUI(C#)行ごとの結果pyファイル path(x,y,z)をアクション(JSON)に変換AutoAIAutoPadPad情報WebSocketサーバ
©SEGAWebSocketを採用した理由• 汎用性– ゲーム内の依存度を下げる– 各プラットフォーム対応の手間を省力化• 応答の即時性– スクリプトの実行結果をすぐに受け取って次を実行したい– HTTP/1.1で直接通信する場合は、一定時間でポーリングしないといけない上に、無駄に通信量も増える– HTTP/2.0だとgRPCなどもある
©SEGA外部ツールゲーム内AutoPadとAutoAIアクションを指定 どこでもリプレイCUI(Python)結果通知結果JSONで受け渡しWebSocketサーバどこでもリプレイエディタGUI(C#)行ごとの結果pyファイル path(x,y,z)をアクション(JSON)に変換AutoAIAutoPadPad情報
©SEGAAutoPadとゲームの入出力AutoPadゲームステート疑似Pad情報のみ手動プレイとほぼ同じ動作であることを保証ゲーム内実装(C++)
©SEGAAutoPadの種類• 指定座標に移動– path(100, 0, 200)• 指定半径内をランダム– target_pos_zone_radius• 指定アイテムを選択– select_item_name(“gyudon_tokumori”)• 各ミニゲーム用• バトル用
©SEGA正確にUIを選択する• select_item_name(“gyudon_tokumori”)
©SEGAAutoAIでAutoPadを選択• AutoAI(シナリオクリア用)の優先度1. ロード・画面遷移中• 何もしない、ランダム2. イベント・会話中• 何もしない、スキップ、連打3. バトル・ミニゲーム中• バトル用AutoPad、ランダム• 各ミニゲーム用AutoPad、ランダム4. アドベンチャー・UI操作中• Pythonで制御
©SEGAAutoAI(ミニゲーム中)• 各ミニゲームのAutoPadで動作
©SEGA自動テスト作成ツール• どこでもリプレイエディタ– プログラミング知識なしで自動テストが書ける– Pythonでも書ける– プラットフォームに依存しない自動テスト作成ツールがあればOKなのか?
©SEGA自動テスト準備自動テストのワークフローテスト設計自動テスト環境の構築自動テスト作成と保守ランダムシナリオクリアミニゲームアイテムコンプリートログサーバQAチーム開発チームエラー送信壊れたテスト自動テスト実行テスト結果の見える化
©SEGA自動テストの実行環境自動テスト作成と保守ランダムシナリオクリアミニゲームアイテムコンプリートログサーバQAチーム開発チームエラー送信壊れたテスト テスト結果の見える化自動テスト実行自動テスト準備テスト設計自動テスト環境の構築
©SEGA自動テストの実行環境• オートテスト– 専用クライアント– Jenkins
©SEGAオートテストの仕組み(Jenkins含む)帰宅前に各PCでオートテストクライアントを実行設定ファイル(Excel)からiniを生成最新ビルドを取得ゲームを自動起動(iniファイルのシナリオ/条件) ログ送信エラー送信
©SEGA自動テスト準備自動テストのエラー検知テスト設計自動テスト環境の構築自動テスト作成と保守ランダムシナリオクリアミニゲームアイテムコンプリートQAチーム開発チーム壊れたテスト自動テスト実行ログサーバエラー送信テスト結果の見える化
©SEGAエラー検知の必要性と仕組み• テストしただけでは品質は上がらない– 結果を開発チームに伝えて修正してもらう必要がある• エラー検知の種類– エラー送信• クラッシュレポート– どこでもログ分析• テスト結果を見える化してエラーを見つける
©SEGAエラー検知(エラー送信)龍が如くスタジオのクラッシュレポート機能ゲームやツール実行中に例外発生! ネットワークドライブ• ダンプ• ログ• コールスタック• スクリーンショットメール送信• ダンプ表示batのURL• コールスタック• リビジョンチケット管理システム(Redmine)ログサーバ1エラー数百MB~数GB
©SEGAエラー検知(テスト結果の見える化)• どこでもログ分析– Fluentd– Elasticsearch– Kibana– 独自分析ツール• RedmineのWikiに自動更新• ヒートマップ・分析結果詳しくはJaSST’18 Tokyoの講演資料を見てね!!http://jasst.jp/symposium/jasst18tokyo/pdf/D4.pdf
©SEGAテスト結果の見える化のワークフローログ送信 ElasticsearchRedmine内のWikiに公開自動集計集計結果を確認修正手動テスト Jenkinsで1日1回オートテスト開発者日ごと or リアルタイムで修正&確認QA
©SEGAテスト結果の見える化 (スジモン図鑑)• スジモン図鑑とはスジモン図鑑のコンプリートを確認する必要がある
©SEGAテスト結果の見える化 (スジモン図鑑)• スジモン修正ワークフロー1. オートテストでスジモンを探索し見つけたらログ送信• メインシナリオやサブシナリオをクリア• 各マップを巡回• 各ダンジョンを攻略2. スジモンごとの出現数をログ集計3. 遭遇しないスジモンを修正• 実装ミスは即時修正• 出現率が低すぎる場合はパラメータを調整
©SEGAテスト結果の見える化 (スジモン図鑑)スジモンID詳細ログのリンクスジモンの名前PC名RedmineのWikiを自動更新遭遇していないスジモンはKibana上で詳細ログを確認各スジモンの遭遇頻度のバランス調整にも活用
©SEGA自動テスト準備自動テスト作成と保守テスト設計自動テスト環境の構築ログサーバQAチーム開発チームエラー送信壊れたテスト自動テスト実行テスト結果の見える化自動テスト作成と保守ランダムシナリオクリアミニゲームアイテムコンプリート
©SEGA再現率の低いバグの修正確認に活用再現率の低いバグが発生再現用スクリプトを作成・実行12,773回試行20回再現再現率:0.157%10万人がプレイすると157人がエラーに遭遇してしまう!54,304回試行0回再現再現率:0.000%修正確認!謎バグが本当に修正されたことを確認可能!
©SEGA自動テストは壊れやすい?修正開発中は自動テストの修正が頻発する
©SEGA自動テストのカバー範囲が拡大自動テスト作成と保守テスト自動化チームが必要!メインシナリオクリアサブシナリオクリア2周目クリアミニゲームパフォーマンス計測アイテムドロップ率再現・修正確認壊れたテストの修正
©SEGAテスト自動化チーム(仮)の役割• 自動テストのスクリプト作成と保守• 自動テスト結果の見える化• 自動テスト環境の整備• 手動テスト環境の自動化– パッケージの自動インストール– エラー発生時の即時デバッグ環境の構築自動テストの普及が目的
©SEGA自動テスト準備テスト自動化チーム(仮)のワークフローテスト設計自動テスト環境の構築自動テスト作成と保守ランダムシナリオクリアアイテムコンプリートログサーバテスト結果の見える化QAチーム開発チームエラー送信壊れたテストテスト実行開発内の手動テスト環境の構築パッケージの自動更新
©SEGAテスト自動化チーム(仮)とは• なぜ(仮)なのか?– 組織上認められたチームではない– プロジェクト終盤に手が空いてる人を集めて結成• プロジェクト開始時に必要な作業量を正確に予測できない• 新人を含めた若手中心のチームになる
©SEGA新人プログラマがテスト自動化に参加する意味• 自動化技術の習得と実践– 自動テストの書き方やJenkinsのジョブの運用を学ぶ• デバッグ手法を学習– ペアデバッギング• 自分でデバッグ→先輩を呼んで一緒にデバッグ– メモリ周りやマルチスレッドのデバッグ• バグから使用エンジンへの理解を深める– 実装で気を付けるポイント– エンジンのバグを踏まないコツ
©SEGAテスト自動化チーム(仮)規模の推移012345678910龍が如く6 命の詩。 JUDGE EYES:死神の遺言 龍が如く 7 光と闇の行方自動テスト担当自動テスト1名で開始自動テスト6名に拡大
©SEGAプロジェクトごとに振り返りと改善• 龍が如く6 命の詩。(2016年発売)– パス(JSON)によるメインシナリオのクリア• JUDGE EYES:死神の遺言(2018年発売)– 自動テストをLuaで制御– UI選択の精度向上• 龍が如く7 光と闇の行方(2020年発売)– 自動テストをPythonで制御– 自動テストの作成・再生を外部ツール化– PythonのエラーをTeamsに通知
©SEGAオートテストのエラー検出数と割合オートテスト8,102件18.6%オートテスト27,319件67.4%龍が如く6 命の詩。(ランダム+パス)龍が如く7 光と闇の行方(ランダム+Python)オートテスト手動テストJUDGE EYES:死神の遺言(ランダム+Lua)オートテスト16,930件33.4%※2020年3月に集計
©SEGA龍が如く0 誓いの場所 龍が如く6 命の詩。 JUDGE EYES:死神の遺言 龍が如く7 光と闇の行方規模オートテスト稼動数 100台 150台 200台 219台24時間稼働数 0台 41台 40~80台 79台エラー総数 9,664件 43,369件 50,671件 40,506件オートテスト 621件 8,102件 16,930件 27,319件オートテスト率 6.4% 18.6% 33.4% 67.4%コリジョン抜け - 1,910件 126件 2,321件価値のべ稼働時間※ - 82,104 h 244,040 h 305,456 h時給1000円換算 - 8210万円 2億4404万円 3億0546万円オートテストの実績※1日8時間換算オートテストのポテンシャル(潜在価値)※2020年3月に集計
©SEGA自動テストの効果• 品質向上に寄与– 新規バグとデグレ(エンバグ)の検出– パフォーマンス計測に活用– ゲームバランス調整に活用• コストは削減できる?– 手動テストのコスト増大を抑える効果がある– デバッグ期間の短縮が可能– コスト削減はアピールしていない
©SEGAある若手の成長(1年目)• JUDGE EYES:死神の遺言– ドローンレースの自動テスト• エラー検知• コリジョン抜け• VRAM使用率の計測
©SEGAある若手の成長(2年目)• 龍が如く7では缶拾いのミニゲームを担当• 自分で実装し、自分で自動テストも作成– チュートリアルや上級レベルもクリアできる自動テスト環境を構築• どこでもログ分析も使いこなす– 敵キャラのはまりを検出– 手動テストの結果を分析
©SEGA缶拾いミニゲームの自動テスト
©SEGA敵のコリジョン引っ掛かりを可視化街灯に引っ掛かっているのでコリジョンの修正が必要
©SEGA自動テストは誰が書くのが効率的?• 開発者が書く– プログラマ、プランナー、アーティストが、自分で実装したものに対して自動テストを作成する– 自分がテストしてほしいところを重点的にテストできる• QAテスターが書く– バグが出やすい場所を経験上知っているので、効率的なテストが書けるはず– 再現率が低いバグの自動テストを書いて、手動で不可能な回数のテストを自動テストで補うみんなで自動テストを書いたら最強!
©SEGA(仮)のもう一つの意味テスト自動化チーム(仮)のゴールは「自動テストの普及」みんなが自動テストを書けるようになったら解散!※あくまで龍が如くスタジオ内での話です。※組織を横断しているテスト自動化チームなど、継続的に必要な場合も当然あります。
©SEGAまとめ• 自動テスト作成ツール– 誰でも気軽に作れるツールを目指す• 自動テストのワークフロー– 開発チームに合わせた適切な環境を用意する– テスト単体では品質は上がらない• テスト結果の伝え方(見える化)が大事• テスト自動化チーム(仮)– 実績を示して活動を継続する– 若手を育成し、自動テストの普及に努める
©SEGA自動テストを10年やって気付いたこと• 自動テストは資産– パッチやDLC、バージョンアップ、移植、シリーズ次回作の回帰テストとして使い続けることが可能• 自動テストは信頼– チームにエラーをエラーとして受け入れてもらうことが大事– 手動プレイに限りなく近づける、自動テストの仕組みの説明に取り組む• 自動テストは継続– 継続しないとノウハウが蓄積されない– 組織やチームの文化にしていくことが大事
©SEGA運用環境自動テストテスト自動化の始め方ガイドランダム入力パス入力ルールベースAIプレイヤーAI スクリプト画像認識機械学習テストケースの設定ログやキャプチャの自動収集クラウド実行環境汎用化テストケースの自動生成ここから開始~龍3 龍4,5,0,極 龍6,極2,7クラッシュレポート最新ビルドに更新して実行テスト結果の見える化自動テストの協力者を増やす成果を示して規模拡大テスト自動化チームの結成みんなで自動テスト
©SEGA最後に自動テストをみんなで作って開発をより楽しくしたい!