"FINAL FANTASY VII REMAKE INTERGRADE“における自動リプレイ、自動探索、自動バグ分類の理論と実践
太田 健一郎AIエンジニア SQUARE-ENIX© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN: TETSUYA NOMURA/ROBERTO FERRARI© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

アジェンダ• 担当と経歴• 開発の背景• 開発目的と概要• 各種機能の解説• 今後の開発© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

担当と経歴• 担当– 自動テストツール バックエンド開発運用• 経歴– ソフトウェアテストのデザインパターンの研究– 開発支援ツール開発– エンタープライズシステム開発– スマートフォンゲームテスト支援– システムテスト自動化– ゲームテスト自動化 ← 現在
© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

開発の背景© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

現在の家庭用ゲーム市場
少子高齢化
国内市場の娯楽の縮小

多様化

全世界を途上国のターゲット

経済力向上

海外市場の日本製ゲームへの理解

拡大© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

家庭用ゲームのテスト機能
従来からのテスト

人海戦術が限界に自動化のターゲット

性能

UI/UX

字幕
多言語音声
全世界ターゲット
により追加
多様性
倫理
性・暴力表現© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動化が難しい工数拡大

開発プロセスと人員構成
デザイナー

プリプロ

α

β

プログラマー

テストエンジニア© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

マスターソフトウェアとしての特殊性• プログラム : コンテンツ比 (量、サイズ)– 3 : 97

• 量産するもの– コンテンツ (音声、地形、キャラクター)• プログラミングの位置づけ– ゲームエンジンのタイトル向けカスタマイズ– コンテンツを作成するための部品の開発© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バクの特性• 発生しやすいバグ– コンテンツ間の結合– プログラムとコンテンツの結合• 発見が可能なテストフェーズ– システムテスト• バグ– スレッドバグ• デッドロック• メモリ破壊– 検出方法• 形式手法• 繰り返しテスト• 負荷テスト

システムテストで全結合しないと発見できないバグが多い© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動テストの対象
クラッシュ

進行不能

ハングアップ

レアバグ

その他

長時間プレイ

メモリリーク

故障の検出

リグレッション機能
メモリリーク

徹底的な性能探索
再現性の確認繰り返し操作状態異常
コリジョン抜け© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

開発目的と概要© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

開発目的• 機械が得意なテスト ≒ 手動では苦痛が伴うテスト– 同じ操作の繰り返し• リグレッションテスト
• レアバグの発見• 長時間プレイ– 徹底的な探索• →手動テストの効果の最大化– 本来フォーカスすべきテストに集中– ツールの補助により負荷を軽減© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

本自動テストツールの機能と対象
リグレッション

進行不能
自動リプレイ
レアバグ
長時間プレイ
自動探索

徹底的な探索故障の原因分析

バグ自動分類

再現性の確認© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

各機能の解説© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動リプレイ© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動リプレイのタイプ
リプレイの構成要素

ゲームコードの変更が不要

ゲームコードの変更が必要

入力

時間、スクリーンショット

ゲームの状態(要コード内へのアクセス)

出力

ゲームパッドの操作

ゲームパッドのエミューレーション

ビルドイメージ

マスター (出荷相当)

テスト (内部検証相当)非決定要素のサポート

なし

あり

出現要素の変更のサポート

なし

一部

マスター

α以降使用開始できるフェーズ© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動リプレイ コア機能
ゲームの制御起動・終了の制御

自動テスト
サーバー

汎用の状態情報操作

CLIランチャー （UI）

フロントエンドプロセスの起動

死活情報

ゲームの起動・終了

Watchdog

ゲーム

自動テスト
SDK
汎用操作のハンドリング

ゲームを起動プラットフォーム非依存のコードを実行
ゲームの開始と監視© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

ゲーム固有
自動テストコード

ゲーム固有ボット© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN: TETSUYA NOMURA/ROBERTO FERRARI

自動サーバー• ゲーム非依存の情報
どこでいつ

何を
今は– 位置、レベルID*– 速度 / 方向– 時間 : ゲーム時間、UTC, 実時間、フレーム数– アクション/イベント : キーの入力、パッドの入力– ゲームの状態を表したスタック* レベル : ゲーム業界用語、今いる場所、ステージや章のようなもの© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動テストサーバー• ゲームの状態を表したスタック
Tutorial
再生時 data

Cinematic
BattleFollow mode

Cinematic– 状態• Id (タイプID/ゲームID)• ユーザーデータ• 同期フラグ : unique, client controlled, …
• タイムアウトのオーバーライド© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

Battle同期メカニズム Non Relocatable
ゲームの状態

記録時①

タイムアウトの開始

再生時
Non Relocatable 開始 : 記録時の位置まで到達する必要がある

記録時
②

再生時

タイムアウトの開始
移動 もしくは 待機

記録時③

タイムアウトの終了

再生時© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

同期メカニズム Relocatable
ゲームの状態

記録時①

タイムアウトの開始
タイムアウトの開始

再生時
Relocatable 開始 : 記録時

記録時
②

再生時

記録時
③

タイムアウトの開始

タイムアウトの開始

再生時© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

同期メカニズム Relocatable
ゲームの状態

記録時①

タイムアウトの開始

再生時
記録時
④

再生時
記録時

⑤
④
③

記録時のタイムアウトの終了

タイムアウトの終了
記録時のタイムアウトの終了
タイムアウトの開始

再生時© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

同期メカニズム
Skippable / Startable
ゲームの状態

記録時

Skip request
タイムアウトの終了

再生時

Skippable

クライアント側でのアップデートを許可する、 例 : メニューを閉じる

記録時

Startable
タイムアウトの終了

再生時

Start

クライアント側でのアップデートを許可する、 例 : インタラクションの開始© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

同期メカニズム
Optional
記録時

Optional

Optional

Optional

Optional

①

再生時
記録時

Optionalを無視する②

再生時© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

タイムアウトの終了

ゲーム固有コード (BOT)
ゲームの制御起動・終了の制御

自動テスト
サーバー

汎用の状態情報操作

CLI
ランチャー （UI）

フロントエンドプロセスの起動

死活情報

ゲームの起動・終了

Watchdog

ゲーム

自動テスト
SDK
汎用操作のハンドリング

ゲームを起動プラットフォーム非依存のコードを実行
ゲームの開始と監視© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

ゲーム固有
自動テストコード

ゲーム固有ボット

サーバー上でのパス探索• 3Dの格子型マップを作成• 記録と再生の両方のマップを使用• 実際の動作が命令と再生時の一致しなかった => 壁と判断 マップ• パスが発見できたらリプレイに復帰• ブロックされた場合には単純推論を使用する (ゲームのパス検索も利用可能)© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

記録時のマップ

経路探索

ゲーム間で共有するコード
ゲーム間で共有

ゲームの制御起動・終了の制御

自動テスト
サーバー

汎用の状態情報操作

CLI
ランチャー （UI）

フロントエンドプロセスの起動

死活情報

ゲームの起動・終了

Watchdog

ゲーム

自動テスト
SDK
汎用操作のハンドリング

ゲームを起動プラットフォーム非依存のコードを実行
ゲームの開始と監視© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

ゲーム固有
自動テストコード

ゲーム固有ボット

FF7RIにおける自動リプレイの評価• メリット– 再現性0.3%レアバグでも発見できた– 複数レベル(20章)に渡るテストを同時に繰り返し実行出来た– クラッシュをもたらすようなコードの変更を検出できた– フレームレートが低下しても実行できた– 24時間365日のテストができた• 課題– テスト対象が記録時の経路に限定される© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動探索© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動探索の評価• メリット– 記録された経路以外でのバグも発見できる– パフォーマンスの分析もできる (FPSやメモリ消費など)– コリジョン抜けの確認に使用できる• 課題– 複雑なゲームではレベルの最後までたどり着けない© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バグ自動分類© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動リプレイ・探索の課題
手動のバグ分析

分析時間大

偽陰性、偽陽性の通知
自動メール通知
同一原因バグの複数通知

過去・類似バグとの比較の属人性再現性の確認再現性の精度のための時間© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バグ自動分類の目標• 手動のバグ分析の時間を削減• 偽陽性通知の低減• 故障の検出から通知までの時間を短縮• ゲームチームへの精度の高いメール通知• ゲームチームの原因分析の短縮化© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

アーキテクチャ
メール通知
自動リプレイ
自動探索

テスト結果

分類依頼

バグ
自動分類

手動修正

分類済みバグ© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

テレメトリー対象バグとマッチング・アルゴリズム• バグ• アルゴリズム– クラッシュ– アサート– ハングアップ– リプレイ失敗– 未定義動作エラー– アドレス違反エラー– 完全一致– 部分一致– 重複一致– 手動一致© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バックエンド© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動テスト・ワークフロー
開発機

リプレイ
情報

テスト結果
表示

Jenkins ®

テスト結果

その他のエラー
リプレイ失敗など

自動テストの開発担当者

PCで記録

ポーリング
ゲーム側のパッケージ

PC
開発機

PC
PC

ビルドPC
開発機PC
開発機

テスト実行

自動テスト
自体のバグ

バグ自動分類

ゲームチーム
テストエンジニア
開発者

ゲームのクラッシュ・アサート© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バックエンド改善 V2.0
• V1.0

テストジョブ• V2.0

パラメータ

テスト1

テスト2

テスト

1..*

1..*

1

1

1

開発機1

開発機2

テストと開発機の対応が固定
ジョブ数大、構成変更工数大

ジョブ集約

1..*
開発機*

プール化

効果 : 管理工数低下
残課題 : ビルド→テストが依然必要© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

バックエンド改善 V2.5
• V2.0ビルド
パッケージ
インストール• V2.5テスト
直列
開発機*

オンデマンドビルド
インストール共有
ビルド→実行時間減
任意のテスト実行並列© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

フロントエンド© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

フロントエンド改善• 目的– ゲームチームの方の役立つツールとする• レアバグの再現• カットシーンの検証– 手動のテストエンジニアの作業効率を向上させる• 長時間テストの実行• バグの再現性の精度向上© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

無限リプレイとデバッグ補助
バグの発生直前の停止設定

レアバグの再現率を見る
対象のバグ以外は無視

クラッシュ、ハングアップ以外の進行不能バグ発生時、デバッグ可能© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

カットシーンの制御と切り出し• カットシーン*の検証用– リプレイ動画からカットシーンを切り出し– ゲームチームのご要望により作成– 切り取りタイミング• 記録時の時間* カットシーン : ゲーム上で動いているキャラクターをそのまま使用したアニメーション
固定のムービーよりも自然なアニメーションとなるが、CPU, GPU負荷が高い© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

自動テストビルド取得• 機能– 自動テスト込みのビルドをUIから取得• Jenkinsでビルド済みのパッケージを取得• 目的– 手動のテストエンジニアのツール利用を容易に• 従来– かなり前 ： ローカルで自動テストを組み込んでビルド– 今まで : CLIでローカルにダウンロード• →CLIでも敷居が高かった© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

今後の開発© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

開発予定機能• C++自動テストサーバー– PythonサーバーのGILによるFPS低下解消• バグ自動分類– アルゴリズム精度向上– フロントエンド– バグシステム統合• テレメトリー– FPS, メモリ消費可視化• バックエンド– 実行テスト決定エンジン© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.

ご清聴ありがとうございました商標••“PlayStation”, “PS4” and “PS5” are registered trademarks or trademarks of Sony Interactive
Entertainment Inc.
Jenkins® is a registered trademark of Software in the Public Interest, Inc.
© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.