Slide 1

Slide 1 text

©SEGA 「龍が如く 7 光と闇の行方」の 自動テスト活用事例と テスト自動化チーム(仮)による 若手育成の取り組みについて 株式会社セガ 第1事業部 (龍が如くスタジオ・ドラゴンエンジンチーム) 阪上 直樹

Slide 2

Slide 2 text

©SEGA 自己紹介 • 龍が如くスタジオ専属のQAエンジニア* – 開発環境とQAの自動化が主な仕事 – ゲーム内のコードもバリバリ書く • 書いたコードは、製品には1行も入らない • 海外ではEmbedded QAと呼んでいる – SEGA TECH Blog : QAエンジニアってどんな仕事? ~ゲーム開発におけるテストの世界~ • http://techblog.sega.jp/entry/2018/08/27/100000 ※QAとはQuality Assuranceの略で品質保証のことを指します

Slide 3

Slide 3 text

©SEGA 本講演で得られる知見 • ゲームの開発におけるテスト自動化の手法 • 自動テストの成果やコストの実例 • 自動テストシステムを構築するための知識 • 自動テスト普及のための取り組み 「自動テストを始めてみよう!」 というモチベーション

Slide 4

Slide 4 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 5

Slide 5 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 6

Slide 6 text

©SEGA • テスト – ゲームをプレイしてバグを見つける – バグを報告し、修正を確認する – QAテスターの仕事 • デバッグ – バグの原因を調査する – バグを修正する – 開発者(主にプログラマ)の仕事 「テスト」と「デバッグ」

Slide 7

Slide 7 text

©SEGA 「自動テスト」と「テスト自動化」 テスト自動化 テストケース 設計の自動化 自動テスト テスト実行 の自動化 テスト環境 構築・運用 の自動化 テストレポート 作成・分析 の自動化

Slide 8

Slide 8 text

©SEGA テストピラミッド(システム開発) 単体 結合 UI コ ス ト 高 低

Slide 9

Slide 9 text

©SEGA テストピラミッド(ゲーム開発) 単体 結合 Play コ ス ト 高 低 • 通しプレイ • ミッションクリア • コリジョン抜けチェック • 起動チェック • ステージ描画テスト • イベントシーン単体再生 • ゲームオブジェクト・エンティティの連携動作 • 関数・モジュール単位の単体テスト • ライブラリ・エンジンのテスト • データのレギュレーションチェック • ゲームオブジェクト・エンティティの単体動作 ※本講演でのテストピラミッドの定義

Slide 10

Slide 10 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 11

Slide 11 text

©SEGA 本講演のタイトル紹介 龍が如く7 光と闇の行方 PS4Ⓡ/2020年1月16日発売

Slide 12

Slide 12 text

©SEGA 自動テスト導入のきっかけ • カバーすべきテストケースが膨大 – メインストーリーをクリアするだけでも数十時間 – 手動テストが賄えない範囲をサポートするため • 自動プレイテストを導入 – 単体テストはゲームのアプリ層だと難しい • 結果が画像出力しかない場合が多く、成否が不安定 – 信頼性の確保 • 自動テストを通常のゲームに限りなく近い状態で実行するこ とで開発チームに信頼してもらう

Slide 13

Slide 13 text

©SEGA 龍が如く7での自動テストのデモ どこでもリプレイシステム 手動プレイ中にどこでも記録・リプレイが可能! 手動プレイを記録中 リプレイ再生中

Slide 14

Slide 14 text

©SEGA 外部ツール ゲーム内 どこでもリプレイエディタ GUI(C#) WebSocketサーバ どこでもリプレイシステム(記録) ゲーム動作を アクション単位で スクリプト化 ゲームを手動で プレイ

Slide 15

Slide 15 text

©SEGA Pythonを採用した理由 • 人気があって使える人が多い • これから学習する人にとっても有益な言語 – ほかの自動化にも使える • ゲーム外のモジュールとの連携のしやすさ – 画像認識(OpenCV、PyOCRなど) – データ分析(Pandasなど) – 機械学習(TensorFlow、Keras、OpenAIなど)

Slide 16

Slide 16 text

©SEGA 条件分岐・ループ • while文で同じ動作を繰り返す例

Slide 17

Slide 17 text

©SEGA 外部ツール ゲーム内 どこでもリプレイシステム(再生) アクションを指定 どこでもリプレイ CUI(Python) 結果通知 結 果 JSONで 受け渡し AutoAI WebSocketサーバ AutoPad Pad情報 どこでもリプレイエディタ GUI(C#) 行 ご と の 結 果 p y フ ァ イ ル path(x,y,z)を アクション(JSON)に変換

Slide 18

Slide 18 text

©SEGA 外部ツール ゲーム内 WebSocketサーバ アクションを指定 どこでもリプレイ CUI(Python) 結果通知 結 果 JSONで 受け渡し どこでもリプレイエディタ GUI(C#) 行 ご と の 結 果 p y フ ァ イ ル path(x,y,z)を アクション(JSON)に変換 AutoAI AutoPad Pad情報 WebSocketサーバ

Slide 19

Slide 19 text

©SEGA WebSocketを採用した理由 • 汎用性 – ゲーム内の依存度を下げる – 各プラットフォーム対応の手間を省力化 • 応答の即時性 – スクリプトの実行結果をすぐに受け取って次を実行し たい – HTTP/1.1で直接通信する場合は、一定時間でポーリ ングしないといけない上に、無駄に通信量も増える – HTTP/2.0だとgRPCなどもある

Slide 20

Slide 20 text

©SEGA 外部ツール ゲーム内 AutoPadとAutoAI アクションを指定 どこでもリプレイ CUI(Python) 結果通知 結 果 JSONで 受け渡し WebSocketサーバ どこでもリプレイエディタ GUI(C#) 行 ご と の 結 果 p y フ ァ イ ル path(x,y,z)を アクション(JSON)に変換 AutoAI AutoPad Pad情報

Slide 21

Slide 21 text

©SEGA AutoPadとゲームの入出力 AutoPad ゲームステート 疑似Pad情報のみ 手動プレイとほぼ同じ動作であることを保証 ゲーム内実装 (C++)

Slide 22

Slide 22 text

©SEGA AutoPadの種類 • 指定座標に移動 – path(100, 0, 200) • 指定半径内をランダム – target_pos_zone_radius • 指定アイテムを選択 – select_item_name(“gyudon_tokumori”) • 各ミニゲーム用 • バトル用

Slide 23

Slide 23 text

©SEGA 正確にUIを選択する • select_item_name(“gyudon_tokumori”)

Slide 24

Slide 24 text

©SEGA AutoAIでAutoPadを選択 • AutoAI(シナリオクリア用)の優先度 1. ロード・画面遷移中 • 何もしない、ランダム 2. イベント・会話中 • 何もしない、スキップ、連打 3. バトル・ミニゲーム中 • バトル用AutoPad、ランダム • 各ミニゲーム用AutoPad、ランダム 4. アドベンチャー・UI操作中 • Pythonで制御

Slide 25

Slide 25 text

©SEGA AutoAI(ミニゲーム中) • 各ミニゲームのAutoPadで動作

Slide 26

Slide 26 text

©SEGA 自動テスト作成ツール • どこでもリプレイエディタ – プログラミング知識なしで自動テストが書ける – Pythonでも書ける – プラットフォームに依存しない 自動テスト作成ツールがあればOKなのか?

Slide 27

Slide 27 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 28

Slide 28 text

©SEGA 自動テスト 準備 自動テストのワークフロー テスト設計 自動テスト 環境の構築 自動テスト 作成と保守 ランダム シナリオクリア ミニゲーム アイテム コンプリート ログ サーバ QA チーム 開発 チーム エラー送信 壊れたテスト 自 動 テ ス ト 実 行 テ ス ト 結 果 の 見 え る 化

Slide 29

Slide 29 text

©SEGA 自動テストの実行環境 自動テスト 作成と保守 ランダム シナリオクリア ミニゲーム アイテム コンプリート ログ サーバ QA チーム 開発 チーム エラー送信 壊れたテスト テ ス ト 結 果 の 見 え る 化 自 動 テ ス ト 実 行 自動テスト 準備 テスト設計 自動テスト 環境の構築

Slide 30

Slide 30 text

©SEGA 自動テストの実行環境 • オートテスト – 専用クライアント – Jenkins

Slide 31

Slide 31 text

©SEGA オートテストの仕組み(Jenkins含む) 帰宅前に各PCで オートテストクライアントを実行 設定ファイル(Excel)から iniを生成 最新ビルドを取得 ゲームを自動起動 (iniファイルのシナリオ/条件) ログ送信 エラー送信

Slide 32

Slide 32 text

©SEGA 自動テスト 準備 自動テストのエラー検知 テスト設計 自動テスト 環境の構築 自動テスト 作成と保守 ランダム シナリオクリア ミニゲーム アイテム コンプリート QA チーム 開発 チーム 壊れたテスト 自 動 テ ス ト 実 行 ログ サーバ エラー送信 テ ス ト 結 果 の 見 え る 化

Slide 33

Slide 33 text

©SEGA エラー検知の必要性と仕組み • テストしただけでは品質は上がらない – 結果を開発チームに伝えて修正してもらう必要がある • エラー検知の種類 – エラー送信 • クラッシュレポート – どこでもログ分析 • テスト結果を見える化してエラーを見つける

Slide 34

Slide 34 text

©SEGA エラー検知(エラー送信) 龍が如くスタジオのクラッシュレポート機能 ゲームやツール 実行中に 例外発生! ネットワークドライブ • ダンプ • ログ • コールスタック • スクリーンショット メール送信 • ダンプ表示batのURL • コールスタック • リビジョン チケット管理システム (Redmine) ログサーバ 1エラー数百MB~数GB

Slide 35

Slide 35 text

©SEGA エラー検知(テスト結果の見える化) • どこでもログ分析 – Fluentd – Elasticsearch – Kibana – 独自分析ツール • RedmineのWikiに自動更新 • ヒートマップ・分析結果 詳しくはJaSST’18 Tokyoの講演資料を見てね!! http://jasst.jp/symposium/jasst18tokyo/pdf/D4.pdf

Slide 36

Slide 36 text

©SEGA テスト結果の見える化のワークフロー ログ送信 Elasticsearch Redmine内の Wikiに公開 自 動 集 計 集計結果を確認 修 正 手動テスト Jenkinsで 1日1回 オートテスト 開発者 日ごと or リアルタイムで修正&確認 QA

Slide 37

Slide 37 text

©SEGA テスト結果の見える化 (スジモン図鑑) • スジモン図鑑とは スジモン図鑑のコンプリートを 確認する必要がある

Slide 38

Slide 38 text

©SEGA テスト結果の見える化 (スジモン図鑑) • スジモン修正ワークフロー 1. オートテストでスジモンを探索し見つけたらログ送信 • メインシナリオやサブシナリオをクリア • 各マップを巡回 • 各ダンジョンを攻略 2. スジモンごとの出現数をログ集計 3. 遭遇しないスジモンを修正 • 実装ミスは即時修正 • 出現率が低すぎる場合はパラメータを調整

Slide 39

Slide 39 text

©SEGA テスト結果の見える化 (スジモン図鑑) スジモン ID 詳細ログ のリンク スジモン の名前 PC名 RedmineのWikiを自動更新 遭遇していないスジモンは Kibana上で詳細ログを確認 各スジモンの遭遇頻度の バランス調整にも活用

Slide 40

Slide 40 text

©SEGA 自動テスト 準備 自動テスト作成と保守 テスト設計 自動テスト 環境の構築 ログ サーバ QA チーム 開発 チーム エラー送信 壊れたテスト 自 動 テ ス ト 実 行 テ ス ト 結 果 の 見 え る 化 自動テスト 作成と保守 ランダム シナリオクリア ミニゲーム アイテム コンプリート

Slide 41

Slide 41 text

©SEGA 再現率の低いバグの修正確認に活用 再現率の低い バグが発生 再現用スクリプト を作成・実行 12,773回試行 20回再現 再現率:0.157% 10万人がプレイすると 157人がエラーに 遭遇してしまう! 54,304回試行 0回再現 再現率:0.000% 修正確認! 謎バグが本当に修正されたことを確認可能!

Slide 42

Slide 42 text

©SEGA 自動テストは壊れやすい? 修正 開発中は自動テストの修正が頻発する

Slide 43

Slide 43 text

©SEGA 自動テストのカバー範囲が拡大 自動テスト作成と保守 テスト自動化チームが必要! メインシナリオ クリア サブシナリオ クリア 2周目クリア ミニゲーム パフォーマンス 計測 アイテム ドロップ率 再現・修正確認 壊れたテスト の修正

Slide 44

Slide 44 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 45

Slide 45 text

©SEGA テスト自動化チーム(仮)の役割 • 自動テストのスクリプト作成と保守 • 自動テスト結果の見える化 • 自動テスト環境の整備 • 手動テスト環境の自動化 – パッケージの自動インストール – エラー発生時の即時デバッグ環境の構築 自動テストの普及が目的

Slide 46

Slide 46 text

©SEGA 自動テスト 準備 テスト自動化チーム(仮)のワークフロー テスト 設計 自動テスト 環境の構築 自動テスト 作成と保守 ランダム シナリオクリア アイテム コンプリート ログ サーバ テ ス ト 結 果 の 見 え る 化 QA チーム 開発 チーム エラー送信 壊れたテスト テ ス ト 実 行 開発内の 手動テスト 環境の構築 パッケージ の自動更新

Slide 47

Slide 47 text

©SEGA テスト自動化チーム(仮)とは • なぜ(仮)なのか? – 組織上認められたチームではない – プロジェクト終盤に手が空いてる人を集めて結成 • プロジェクト開始時に必要な作業量を正確に予測できない • 新人を含めた若手中心のチームになる

Slide 48

Slide 48 text

©SEGA 新人プログラマがテスト自動化に参加する意味 • 自動化技術の習得と実践 – 自動テストの書き方やJenkinsのジョブの運用を学ぶ • デバッグ手法を学習 – ペアデバッギング • 自分でデバッグ→先輩を呼んで一緒にデバッグ – メモリ周りやマルチスレッドのデバッグ • バグから使用エンジンへの理解を深める – 実装で気を付けるポイント – エンジンのバグを踏まないコツ

Slide 49

Slide 49 text

©SEGA テスト自動化チーム(仮)規模の推移 0 1 2 3 4 5 6 7 8 9 10 龍が如く6 命の詩。 JUDGE EYES:死神の遺言 龍が如く 7 光と闇の行方 自動テスト担当 自動テスト 1名で開始 自動テスト 6名に拡大

Slide 50

Slide 50 text

©SEGA プロジェクトごとに振り返りと改善 • 龍が如く6 命の詩。(2016年発売) – パス(JSON)によるメインシナリオのクリア • JUDGE EYES:死神の遺言(2018年発売) – 自動テストをLuaで制御 – UI選択の精度向上 • 龍が如く7 光と闇の行方(2020年発売) – 自動テストをPythonで制御 – 自動テストの作成・再生を外部ツール化 – PythonのエラーをTeamsに通知

Slide 51

Slide 51 text

©SEGA オートテストのエラー検出数と割合 オートテスト 8,102件 18.6% オートテスト 27,319件 67.4% 龍が如く6 命の詩。 (ランダム+パス) 龍が如く7 光と闇の行方 (ランダム+Python) オートテスト 手動テスト JUDGE EYES:死神の遺言 (ランダム+Lua) オートテスト 16,930件 33.4% ※2020年3月に集計

Slide 52

Slide 52 text

©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月に集計

Slide 53

Slide 53 text

©SEGA 自動テストの効果 • 品質向上に寄与 – 新規バグとデグレ(エンバグ)の検出 – パフォーマンス計測に活用 – ゲームバランス調整に活用 • コストは削減できる? – 手動テストのコスト増大を抑える効果がある – デバッグ期間の短縮が可能 – コスト削減はアピールしていない

Slide 54

Slide 54 text

©SEGA ある若手の成長(1年目) • JUDGE EYES:死神の遺言 – ドローンレースの自動テスト • エラー検知 • コリジョン抜け • VRAM使用率の計測

Slide 55

Slide 55 text

©SEGA ある若手の成長(2年目) • 龍が如く7では缶拾いのミニゲームを担当 • 自分で実装し、自分で自動テストも作成 – チュートリアルや上級レベルもクリアできる自動テス ト環境を構築 • どこでもログ分析も使いこなす – 敵キャラのはまりを検出 – 手動テストの結果を分析

Slide 56

Slide 56 text

©SEGA 缶拾いミニゲームの自動テスト

Slide 57

Slide 57 text

©SEGA 敵のコリジョン引っ掛かりを可視化 街灯に引っ掛かっているので コリジョンの修正が必要

Slide 58

Slide 58 text

©SEGA 自動テストは誰が書くのが効率的? • 開発者が書く – プログラマ、プランナー、アーティストが、自分で実装した ものに対して自動テストを作成する – 自分がテストしてほしいところを重点的にテストできる • QAテスターが書く – バグが出やすい場所を経験上知っているので、効率的なテス トが書けるはず – 再現率が低いバグの自動テストを書いて、手動で不可能な回 数のテストを自動テストで補う みんなで自動テストを書いたら最強!

Slide 59

Slide 59 text

©SEGA (仮)のもう一つの意味 テスト自動化チーム(仮)のゴールは 「自動テストの普及」 みんなが自動テストを 書けるようになったら解散! ※あくまで龍が如くスタジオ内での話です。 ※組織を横断しているテスト自動化チームなど、継続的に必要な場合も当然あります。

Slide 60

Slide 60 text

©SEGA 目次 • ゲーム開発における自動テスト • 自動テスト作成ツール • 自動テストのワークフロー • テスト自動化チーム(仮)の取り組み • まとめ

Slide 61

Slide 61 text

©SEGA まとめ • 自動テスト作成ツール – 誰でも気軽に作れるツールを目指す • 自動テストのワークフロー – 開発チームに合わせた適切な環境を用意する – テスト単体では品質は上がらない • テスト結果の伝え方(見える化)が大事 • テスト自動化チーム(仮) – 実績を示して活動を継続する – 若手を育成し、自動テストの普及に努める

Slide 62

Slide 62 text

©SEGA 自動テストを10年やって気付いたこと • 自動テストは資産 – パッチやDLC、バージョンアップ、移植、シリーズ次回作の回帰テスト として使い続けることが可能 • 自動テストは信頼 – チームにエラーをエラーとして受け入れてもらうことが大事 – 手動プレイに限りなく近づける、自動テストの仕組みの説明に取り組む • 自動テストは継続 – 継続しないとノウハウが蓄積されない – 組織やチームの文化にしていくことが大事

Slide 63

Slide 63 text

©SEGA 運用 環境 自動テスト テスト自動化の始め方ガイド ランダム入力 パス入力 ルールベースAI プレイヤーAI スクリプト 画像認識 機械学習 テストケース の設定 ログやキャプチャ の自動収集 クラウド実行 環境 汎用化 テストケース の自動生成 ここから開始 ~龍3 龍4,5,0,極 龍6,極2,7 クラッシュ レポート 最新ビルドに 更新して実行 テスト結果の 見える化 自動テストの 協力者を増やす 成果を示して 規模拡大 テスト自動化 チームの結成 みんなで 自動テスト

Slide 64

Slide 64 text

©SEGA 最後に 自動テストをみんなで作って 開発をより楽しくしたい!