31

質問

ゲームに自動テストを追加するにはどうすればよいでしょうか?

ゲーム エンジンの多くの機能 (ネットワーク、オブジェクト作成、メモリ管理など) を単体テストできると思いますが、実際のゲーム自体のテストを自動化することは可能ですか?

私はゲームプレイの要素について話しているわけではありません (マップ X で Protoss が Zerg を打ち負かすなど)、ゲームとエンジンの間の相互作用について話しているのです。

序章

ゲーム開発において、エンジンはゲームの単なるプラットフォームです。ゲーム エンジンは OS と考えることができ、ゲームは OS が実行するソフトウェアと考えることができます。ゲームは、スクリプトのコレクションまたはゲーム エンジン内の実際のサブルーチンである可能性があります。

考えられる答え

私の考えはこれです:

決定論的なエンジンが必要です。これは、1 組の入力が与えられた場合、出力がまったく同じになることを意味します。これには、同じ入力でシードされる乱数発生器が含まれます。

次に、アバター/ユーザーが操作できるいくつかのオブジェクトを含むベアボーン レベルを作成します。小さく始めて、より多くの相互作用が開発されるにつれて、オブジェクトをレベルに追加します。

パスをたどる (パスファインディングをテストする) スクリプトを作成し、さまざまなオブジェクトと対話します (結果または期待される動作を保存します)。このスクリプトが自動テストになります。一定の時間 (たとえば 1 週間) が経過したら、エンジンの単体テストと共にスクリプトを実行します。

4

10 に答える 10

8

Games From Insideでのこの投稿は、関連性があり、興味深いものかもしれません。

于 2008-08-18T05:59:19.853 に答える
4

Riot Games には、マルチプレイヤー オンライン RTS ゲームである League of Legends (LoL) の自動テストの使用に関する記事があります。

開発者によると、ゲームコードとゲームバランスの両方に毎日多くの変更が加えられています。彼らは、LoL のゲーム サーバーのインスタンスを実行している継続的インテグレーション サーバーにコマンドを送信する、基本的に単純なゲーム クライアントである Python テスト フレームワークを構築しました。次に、サーバーはテスト フレームワークにコマンドの効果を送信し、応答をテストできるようにします。

フレームワークは、特定の時点からのイベント、データ、および効果を記録するイベント キューを提供します。この記事ではこれを「スナップショット」と呼んでいます。

この記事では、呪文の単体テストの例について説明しました。


セットアップ
1. キャラクターに能力を与えます。
2. ミッドレーン (マップ上の場所) に敵キャラクターをスポーンします。
3. ミッドレーンにクリープを発生させます。(LoL のコンテキストでは、クリープは、各チームの軍隊の一部である制御不可能な弱いキャラクターです。彼らは基本的に正史であり、敵チームの経験とゴールドの源です。しかし、放っておけば、敵を圧倒する可能性があります。 team) 4. キャラクターをミッドレーンにテレポートさせます。

実行
1. すべての変数のスナップショットを取得します (例: プレイヤー、敵、および通常のキャラクターの現在のライフ)。
2. 呪文を唱えます。
3. 敵キャラクターに対して呪文の効果を発動する (例えば、命中すると発動する呪文もある)。
4. 呪文のクールダウンをリセットして、すぐに再び唱えられるようにします。
5. 呪文を唱えます。
6. クリープに対する呪文の効果を有効にします (LoL のコンテキストでは、ほとんどの呪文はクリープで使用する場合に異なる計算を行います)。7. 別のスナップショットを撮ります。


最初のスナップショットから始めて、イベントを再生し、(ゲーム デザイナーの観点から) 期待される結果が正しいことを確認します検証できるイベントの例: ダメージがスペルのダメージの範囲内である (LoL は乱数を使用して攻撃に分散を与える)、ダメージはプレイヤー キャラクターやクリープと比較して適切に抵抗され、スペルは範囲内でキャストされます。その有効範囲。


この記事では、通常のゲーム クライアントからテスト サーバーを表示すると、テストのビデオを抽出できることが示されています。

于 2016-05-02T06:07:32.643 に答える
2

私は一度あなたの考えに似た何かをしました、そしてそれは非常に成功しました、しかしそれは実際には単体テストというよりもシステムテストであると思います。ご提案のとおり、乱数ジェネレーターには同じ値をシードする必要があり、毎回同じシーケンスを生成する必要があります。ゲームは50Hzサイクルで実行されたため、タイミングは問題ではありませんでした。私はマウスのクリックと位置を記録するシステムを持っていて、これを使用して「スクリプト」を手動で生成し、それを再生して同じ結果を生成することができました。タイミングの遅延を取り除き、グラフィック生成をオフにすることで、1時間のゲームプレイを数秒で複製できます。最大の問題は、ゲームデザインを変更するとスクリプトが無効になることでした。

必要最低限​​の部屋に、一般的なゲームプレイとは独立したロジックが含まれている場合は、非常にうまく機能する可能性があります。エンジンはUIなしで起動し、初期化が完了するとすぐにスクリプトを開始できます。途中でクラッシュするかどうかのテストは簡単ですが、キャラクターを正しい位置に残すなど、より複雑なテストはより複雑になります。スクリプトの記録が私のシステムにあったほど単純であれば、スクリプトは非常に簡単に更新でき、特殊な動作をテストするための特殊なスクリプトを非常に迅速に設定できます。私のシステムには、ゲームのテスト中に使用できるという追加の利点があり、バグ修正を容易にするためにイベントの正確なシーケンスが記録されました。

于 2008-08-18T07:18:24.233 に答える
2

Power of Two Games Games From Withinの記事は既に別の回答で言及されていますが、そこにあるすべて (またはほぼすべて) を読むことをお勧めします。Assert に関する記事は特に優れています。以前の Web サイトであるGames From Withinにもアクセスできます。ここには、極端なユニット テストであるTest Driven Developmentについて多くのことが書かれています。

Power of Two の連中は、非常に評価の高いユニット テスト フレームワークである UnitCpp を実装した人たちです。 個人的には WinUnit の方が好きです

于 2008-09-15T21:02:56.903 に答える
2

開発のゲームプレイの側面では、値は非常にランダムであるため、絶対値をテストするのはとてつもないアイデアです。

しかし、決定論的な値をテストすることはできます。たとえば、単体テストでは、Guybrush Threepwood がドアに向かって移動し (パスファインディング)、ドアが開き (コマンドを使用)、在庫にキーがないために失敗し (フィードバック)、ドアのキーを選択します (パスファインディング + インベントリ)。経営陣)そして最後にドアを開けます。

これらのパスはすべて決定論的です。この単体テストでは、メモリ マネージャーをリファクタリングできますが、何らかの理由でインベントリ管理ルーチンが壊れた場合、単体テストは失敗します。

これは、ゲームでの単体テストの 1 つのアイデアにすぎません。他のアイデアを知りたいので、この投稿の動機です。

于 2008-08-18T04:24:39.187 に答える
1

レンダリングエンジンをテストしている場合は、特定のテストシーンをレンダリングし、画面キャプチャを実行して、それらを参照テストレンダリングと比較できると思います。そうすれば、エンジンの変化が何かを壊しているかどうかを視覚的に検出できます。サウンドエンジン、またはアニメーション(一連のフレームを比較することによって)についても同様のテストを作成できます。

ゲームロジックまたはシーンの進行状況をテストする場合は、スクリプト変数のさまざまな条件をテストすることでこれを行うことができます(スクリプトを使用してシーンとストーリーのほとんどの側面を実装していると仮定します)。

于 2008-08-18T08:49:19.497 に答える
1

http://flea.sourceforge.net/gameTestServer.pdf

これは、本格的な機能テスターをゲームに実装することに関する興味深い議論です。

「単体テスト」という用語は、「単体」がテストされていることを意味します。これは一つのことです。高レベルのテスト (たとえば、一度に複数のシステム) を行う場合、通常、これは機能テストと呼ばれます。ゲームの大部分を単体テストすることは可能ですが、実際にテストして楽しむことはできません。

テストが曖昧である限り、決定論は必要ありません。たとえば、「キャラクターは 14.7 ヒットポイントを失いましたか」ではなく、「キャラクターは怪我をしましたか」。

于 2009-07-29T21:24:03.127 に答える
1

私はそのトピックに関する論文を書きました - http://download.springer.com/static/pdf/722/art%253A10.7603%252Fs40601-013-0010-4.pdf?auth66=1407852969_87bc2e71ad5228b36738f0237084ebe5&ext=.pdf

于 2014-08-10T14:16:55.123 に答える
1

XNA を使用している場合 (もちろん、このアイデアは他のフレームワークにも当てはめることができます)、単体テストでゲームの状態にアクセスできるゲーム内単体テスト フレームワークを使用できます。そのようなフレームワークの 1 つがScurvy.Test です:-)

于 2008-09-15T13:57:05.727 に答える
0

これは実際にはあなたの質問に答えませんが、私はあなたが提案しているソリューションと同様のことをするマイクロソフトからのPexのポッドキャストを聞いていました、そして私がそれを聞いていたとき私はそれを見るのは本当に面白いだろうと思ったことを覚えていますゲームをテストできるでしょう。具体的に役立つかどうかはわかりませんが、おそらく、彼らが使用しているアイデアのいくつかを見て、それを単体テストに適用することができます。

于 2008-08-18T03:34:25.653 に答える