【レポート】 運営が始まった後からでも自動テストを導入して自動化したい ~ 実現する為に何を行ったのか、導入までの工程と得られた効果・ノウハウの共有 ~ #CEDEC2023 #classmethod_game

ゲームのテストは通常は運用前に徹底的に行われるモノですが、このセッションではテストをゲームの運用後に導入した場合の事例について解説されていました。
2023.08.30

こんにちは。ゲームソリューション部の出村です。

ここではCEDEC 2023で講演された「運営が始まった後からでも自動テストを導入して自動化したい ~ 実現する為に何を行ったのか、導入までの工程と得られた効果・ノウハウの共有 ~」について重要と思った解説を中心にまとめてみました。

セッションの概要

運営が始まった後からでも自動テストを導入して自動化したい ~ 実現する為に何を行ったのか、導入までの工程と得られた効果・ノウハウの共有 ~

本セッションでは、現在運営開発中のUnityを使用したスマートフォン向け対戦アクションゲームに対して運営を開始した後に自動テストを導入し、そのテストを自動化した事例について紹介をします。

今回の取り組みはタイトルチームのメンバーではない、技術支援部門のメンバーが行いました。

タイトルチームに所属していないメンバーがタイトルチームとどのように協力して、この取り組みを行ったかについてタイトルチームと技術支援部門それぞれメンバーの視点から共有します。

自動テストを行っていないが、今からでも始めたい

自動テストを実行する為の"仕込み"が出来ていない

今は自動テストを実行できないが、今後実装したい

このような場合に、実際にタイトル運営が始まった後に自動テストを導入する際にはどのような仕組みが必要だったか、どのようなことが障害になったのか、どのようなことに注意して進めるべきだったかを事例にそって具体的に説明します。

実際に導入を進めた際には、自動テストの作成時や実行時、自動テストによるエラー検知時の報告フローに関しても運営中のタイトルならではの問題が発生しました。

これらの問題に対して、どのような解決策を講じたのかを具体的に説明します。

運営が始まった後でも自動テストの導入が実現できたことを共有し、自分達もやってみようと思う人が少しでも増えれば幸いです。

また、現在開発中のタイトルであっても、自動テストを導入する障壁が下がるようなポイントを共有できればと思っています。

内容について

今回のセッションの発表について、印象深いところを中心に取り上げてみました。

ATC(AutoTestController)というのは、このセッションで紹介しているテストを行うためのソフトウェアです。

取り組みの概要

運営中のスマートフォン向けのリアルタイム多人数ネットワーク対戦ゲームで、Unityを使用しています。現状、自動テストの実装はされていません。ゲーム内には多数のキャラクターやステージが存在します。

運営中のスマートフォン向けリアルタイム多人数ネットワーク対戦ゲームにおいて、開発バージョンの検証のために、Windowsで動作する自動テストとなっています。このテストでは、スマートフォン向けのゲームと同じデータセットを利用します。

テスト自動化環境の構成図です。アプリとテストプログラムは一体化しており、テストプログラムは開発用サーバとデバッグ機能を用いた制御を行いつつ、アプリは通常のゲームと同じ通信を行っています。このような環境でテストが行いました。

自動テストの導入に関して

自動テスト導入前、我々のゲーム開発状況は、次のような状況でした。まず、テスト作業はテスト会社に依存しており、手動テストのボリュームが日増しに増加していました。これにより、手間やコストが増大していました。さらに、本番環境で多種多様なイレギュラーケースが発生し、これらの問題点を対処するのは困難でした。実装のニーズが急募される中、効率向上や品質管理のタスクは、しばしば後回しにされる傾向にありました。このような状況が、品質の維持や新しい機能のスムーズな実装を困難にしていました。

既に運営しているタイトルにおいて、我々はユニットテストやバトルの再現などの多岐にわたる検証を試みていましたが、望む結果を得ることができませんでした。そんな中、開発技術部が「AutoTestController」という新しい自動テストツールを開発しているという情報を耳にしました。このツールは、ゲーム内の様々なシナリオを自動的にテストすることを目的としており、私たちの課題解決に適している可能性がありました。そこで、具体的な内容や導入の手続きについて開発技術部に依頼を行い、新しいテストの方法を模索することとなりました。

ATC(AutoTestController)チームの視点から、私たちは自動テストの領域により深く関わり、その実現に貢献したいと強く感じていました。

自動テストを導入するにあたって、タイトルチームとの協力が不可欠でした。まず、タイトルチームの事情やニーズを最優先に考慮する方針を設けました。この理由は、実際の運用状況や課題を正確に理解し、最適な解決策を提供するためです。具体的なアクションとして、タイトルチームからの詳細なヒアリングを重視し、それに基づいた調査や実施タスクは、専門的な知識と経験を持つATCチームが主導して行うことにしました。このような体制と方針を採ることで、スムーズなコミュニケーションと効果的な自動テストの実施を目指しました。

自動テスト構築のために用意した仕組み

今回開発したAutoTestControllerは、Unityのために開発された自動テスト作成のためのソリューションです。通常のUnity開発と同じような感覚で利用することができ、構築したテストはJenkinsで繰り返し実行できるように作成しました。

基本的な自動テストの仕組みとして、テストプログラムとゲームアプリが用意されています。ゲームアプリ側には、テスト用のPrefabが組み込まれており、これによってテストの実行が可能となっています。PrefabはUnityでのゲームオブジェクトのテンプレートのようなもので、これを用いることで一貫したテスト環境を保持することができます。また、通信部分にはWebSocketを使用しており、これによってリアルタイムの双方向通信が行え、テストプログラムとゲームアプリ間の情報交換が迅速に実施されます。このような仕組みにより、自動化されたテストが効率的に行える環境が整っています。

自動テストをタイトルで活用するまでの道のり

ゲーム内部のサイクルに合わせて自動テストが実施される仕組みが構築されています。Jenkinsを活用して、キャラクターを変更しながらのテストが何度も繰り返し行われます。全キャラクターでのテストが終了すると、その日のテストは完了となります。もし何らかの問題や不具合が発生した場合には、エラーレポートが自動的に出力されます。このシステムは、ゲームの多様なキャラクター組み合わせやシチュエーションでのバグを早期に発見し、品質を保つことを目的としています。

自動テスト導入中、多くの問題が生じましたが、特にアセットの更新によってテストが壊れるという問題が印象的でした。アセットの更新がテストの安定性を妨げる事態に直面し、これを解決するための様々な取り組みがなされました。その中でも、テスト用の専用サーバを設置することで、アセット更新の影響をテスト環境に局限させることに成功しました。

その他にも、開発・運用上のさまざまなニーズや問題が浮上しました。具体的には、エラーや例外の検知の精度を高めること、バグや不具合の再現性を確保して問題の特定と修正を効率化すること、そして頻発するネットワークエラーへの対応などが挙げられます。これらの課題への取り組みを通じて、システム全体の安定性や品質向上に努めていきました。

テストを導入した効果

テストの自動化を導入した結果、多くのメリットが得られました。特に、これまで外部のテスト会社でエンバグを検出していたが、自動テストの導入により、バグの事前発見が可能となりました。このことから、バグ発見後の修正までの期間が大幅に短縮され、開発サイクルの効率化が実現しました。

自動テストの導入を通じて得られた教訓は、実際の開発現場での効果的なエラー対応に繋がります。特に、エラーログも失敗として取り扱うことで、隠れた問題点を早期に発見することができます。また、エラー発生時に動画や再現ファイルを取得することで、具体的な問題の特定や修正が迅速に行えるようになりました。しかし、誤検知の問題も生じ、これを地道に減少させる取り組みが必要となったのも事実です。これらの教訓は、今後のテスト環境のさらなる向上や品質保証の強化に繋がるでしょう。

雑感・まとめ

ゲーム開発では、Web開発でよく利用されているUnitTestも有効な場面もあるでしょう。ただ、それだけですべてのケースを賄える訳ではありません。

ゲーム用に自動的にテストを実行する仕組みがあることで、開発効率が大幅に効率化できることがよく理解できました。