Skyforge、またはボットでの負荷テスト-サーバーの順序。 パート1

こんにちは、Habr!

私の名前はアレクサンダー・アクバシェフです。 SkyforgeプロジェクトのAllodsチームのQAエンジニアです。 私の責任には、ゲームのサーバーをテストする組織が含まれます。この記事では、サーバーのテストについて説明します。 5月にCWIでプレゼンテーションを行い、2部構成の記事になりました。 この記事はそれらの最初のものです。







スカイフォージ空撮



Skyforgeの技術スタックは次のとおりです。ゲームクライアントはC ++で記述され、ゲームサーバーはJavaで開発され、多くの有用なユーティリティとスクリプトはPythonで記述されています。 C#で記述されたデザイナーツールもありますが、この記事ではC#についての説明はもうありません。 :)



ボットとは何ですか、なぜ必要なのですか?



Allods Onlineプロジェクトの開発中に、サーバーチームは深刻な問題に直面しました。複雑で負荷の高いサーバーテストを実行する方法ですか。 このためにボットを作成することにしました。これは、実際のプレーヤーの動作をエミュレートするスタンドアロンのクライアントアプリケーションです。 それ以来、もちろん多くの水が流れました。 Skyforgeで使用されているボットは、すでに最初の脆弱なボットに少し似ています。 それらを使用して実施されたテストの目的とインフラストラクチャも進化しました。現在、ボットは分析のために膨大な数のサーバー特性を取得するのに役立ちます。 これは、プロジェクトでボットテストが継続的インテグレーションのプロセスに含まれているという事実によるものです。



このようなテストは、最大の安定性に重点を置いて設計されています。 つまり、通常のテスト中に何かが覆い隠されたが、重大なことは何も起こらなかった場合、テストは続行されます。 この点で、ボットテストは、最初のくしゃみで落ちるはずの単体テストとは根本的に異なります。 同時に、ボットテストの修復も優先事項です。



ボットとは何ですか?



ボットは、いわゆる「ホワイトボックスメソッド」によって実装されます。C++で記述されたクライアントでは、インターフェイスが削除され、代わりにC ++で記述された脳が追加されます。 さらに、クライアントとボットの共通のコードベースにより、クライアント自体でかなり低レベルのものをテストできます。



ボットの「頭脳」は、有限状態マシン(特定の条件下でのある状態から別の状態への遷移のグラフ)を使用して実装されます。 また、ボットには、ボットとその「脳」の現在の状態に関係なく機能する永続的なアクティブ要素があります。 たとえば、ボットの不滅やチャットアクティビティをサポートします。 個人または一般的なゲームチャットでボットに対応できます。ボッシュは、bashorgのさまざまなストーリーを引用して、常にQAチームを道徳的にサポートする準備ができています。



単純な遷移グラフの例:ボットがマップに表示され、走り、モンスターを見つけて殺します。 トロフィーがあれば-拾い、そうでなければ-走ります。







より柔軟な設定でテストするために、いわゆるボットスクリプトが使用されます。 ボットの望ましい動作を決定することができます:使用する必要がある「頭脳」、出現の場所と条件、キャラクターのクラス、呪文、能力、活動を選択します。 ユーザーの特定のポートレート、つまりこのボットが判明します。 その後、負荷テストを補足したり、他のテストを実施するためにテスターに​​提供できます。



当初、ボットの主な焦点は関連する負荷を生成することでした。 ただし、ボットの使用は他の方向で有益であることが判明しました。



ボットが非常に有用であるためには、2つの非常に重要な要件を満たす必要があります。



1つ目は、行動の妥当性です。 ボットはプレイヤーの行動と一致する必要があります。 ボットがゲーム設計の要件に準拠していないことが判明した場合、それらを修正する必要があります。 たとえば、特定の領域を実行しているボットは、同じ条件で実際のプレイヤーと同じ数のモンスターを殺す必要があります。



2番目の要件は関連性です。 弓から撃ち、モンスターを1つずつ殺すボットを作ったとしましょう。 しかし、邪悪なゲームデザイナーは、この場合、弓の代わりに、一度に複数のモンスターを粉砕するロケットランチャーが必要だと判断しました。 したがって、これらの要件を満たすためにボットをやり直す必要があります。そうしないと、負荷とコンテンツは無関係になります。



テストが解決します



テストを使用した作業の開始時、主な重点は負荷にありました。 既存のインフラストラクチャの負荷を最大化し、ボットのすべての機能を使用しようとしました。 それから、ボットがそれほど多くの利益をもたらすことができるという考えがありませんでした。 将来、ボットテストの作成されたインフラストラクチャを使用して解決できる問題を探し始めました。 たとえば、ボットはグループアクティビティのチェックに役立ちます。 テスターは、ボットをグループに追加して、グループアドベンチャーに進むことができます。 これにより、そのようなプロセスの検証が非常に容易になります。



サーバーチェック



継続的な統合のおかげで、1日に数回、サーバーの最新バージョンを収集しています。 ただし、アセンブリが正常であったかどうか、および使用できるかどうかは確実ではありません。 テスターは常にクライアントをすぐに更新して新しいビルドを検証できるとは限りません。 これを行うために、ボットを使用してフレッシュビルドをチェックするスモークテストが使用されるようになりました。 これはかなり単純なボットです。サーバーにアクセスし、モンスターを探して殺します。 すべてが順調に進んだ場合-サーバーは動作しており、あなたはそれで遊ぶことができます。



メインテストのリハーサル



夜間テストには8時間かかり、多くの貴重な情報を収集できます。 残念ながら、テストの反復は非常に高価であり、5分で修正できるエラーのためにこのテストの開始を見逃さないために、個別の毎日のテストが実行されます。 夜間と同じバージョンのコードと同じデータで実行されますが、1時間だけです。 したがって、日中は、夜間のリハーサルリハーサルが行われます。 必要に応じて、営業日の終わりまでにさまざまなエラーを修正します。 毎時テストに99%合格すると、夜間テストの合格が保証されます。



時間ごとのテストは、さまざまな仮説の実験とテストにも使用されます。 たとえば、Javaマシンでキーを操作する場合は、毎時テストを使用します。 2セットのキーを実行して比較できます。 2つの異なるアルゴリズムまたは2つの異なるカードセットを比較することもできます。



コンテンツ検証



Skyforgeのコンテンツは非常に膨大です。 ゲームの世界にはたくさんのオブジェクトがあります。 そのため、夜間テストの開始時に、どの設計要素が追加の負荷につながるかが常に明確ではありません。 ある特定のカードのセットを持つ1つのゲームメカニカルサーバーですべてがうまくいく理由と、別のカードのセットですべてが悪いという理由は必ずしも明確ではありません。 カードのせいなのか、プレーヤーの数なのか、GCのムーンフェイズなのか。 その結果、個別のカードテストが追加されました。 無菌状態でゲームを比較できます。 たとえば、3枚のカードを使用して同じバージョンのコードとデータで実行すると、重要な場所が発生する可能性のあるさまざまな比較特性と温度カードが得られます。 これらのテストは、おそらくゲームコンテンツのプロファイリングに最も有用です。





温度マップの例(スケール上-ボットで計算された特定のパフォーマンス評価)



さらに、温度マップを使用して、座標を持つ多数の特性(キャラクターの死、周囲のモンスターの数、戦闘中のモンスターの数など)を分析します。



最も重要なテスト



私たちのお気に入りのテストは、すべての最終コンテンツがチェックされる夜間のボットテストです。 私が言ったように、それは8時間以上続きます。 これがメインの負荷テストです。これについては、次の記事で詳しく説明します。



おわりに



明らかに、ボットテストはプロジェクトのすべての要素の接合部で機能します。サーバー、クライアントが起動され、リソースシステム、データベース、マスターサーバー、ビルドエージェントが使用されます。 システム全体を時計のように機能させるには、多大な努力が必要です。



ボットのメンテナンスは非常に困難ですが、非常に便利です。 記事の第2部では、ボットテストを中心に展開したインフラストラクチャ、監視対象のサーバーパラメーター、およびそれらについて説明します。



このブログ投稿がコミュニティにとって興味深いものになったことを願っています。 ご清聴ありがとうございました!



スライドとビデオ



以下はKRI-2013カンファレンスのビデオとスライドです





スライド



その他の資料は、Skyforge開発者のWebサイトVkontakteコミュニティで見ることができます。



All Articles