0

OCUnitcocos2d を使用するゲームの単体テストをセットアップする方法を見つけようとしています。そこで、次の手順に従って最初にテスト ターゲットをセットアップしました: http://blog.shalomfriss.com/?p=894

SIGABRT残念ながら、以下のコードは、製品>テストでテストを実行すると信号をトリガーしXcode.ます[CCGLProgram compileShader:type:byteArray:]

@implementation GameTests

- (void)setUp
{
    [super setUp];
}

- (void)tearDown
{
    // Tear-down code here.

    [super tearDown];
}

- (void)testExample
{
    STAssertNotNil([InitialLayer scene], @"initial layer scene was null.");
}

@end

これは InitialLayer のシーン メソッドです。

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];
    InitialLayer*layer = [InitialLayernode];

    [scene addChild: layer];

    return scene;
}

その他の関連情報:

  • 対象機種:iPad 6.1
  • xcodeバージョン: 4.6.3
  • cocos2dバージョン 2.1

これを修正する方法を知っている人はいますか、それとも OCUnit またはその他のテスト フレームワークを使用してテストをセットアップする一般的な方法はありますか?

4

2 に答える 2

2

cocos2d 関連の単体テストはしたくありません。cocos2d CCGLView、Director など (アプリ デリゲートに入るコード) を setUp メソッドで適切に設定しないと、そもそも機能しません。

設定する場合でも、常に cocos2d 自体をテストすることになります。これにより、テストの分離が少なくなり、サブクラス化されたノードでコードをテストするために、テストごとに新しいシーンを設定する必要がほとんどあります。これは、テストを作成する時間と、各テストの実行時間が急速に長くなることを意味します。

さらに複雑なのは、cocos2d の更新が CADisplayLink の更新に関連付けられていることです。単体テストの実行時にそれらが起動されるかどうかさえわかりません。単体テストは一度実行して終了するため、更新が発生してもテストできません。「一定期間実行する」という概念はありません。そのため、「ノードを x,y に移動し、3 秒後にそこに到達したことを確認する」のようなものは、cocos2d および単体テストの動作方法では本質的にテストできません。少なくとも、cocos2d 自体を大幅に変更する必要はありません。

cocos2d がアプリのビューを表していると考える場合、本当の問題は、そもそもなぜビュー関連のものを単体テストする必要があるのか​​ということです。

代わりに、ビューから完全に独立したクラスを設計することができます。たとえば、ノードの userObject プロパティに追加される追加のゲーム ロジック クラスを作成し、ノードを制御できます。実際のテスト可能なゲーム ロジックは、モデル クラスで発生します。実行中のアニメーション、パーティクル エフェクト、およびテストする必要のないその他のビュー関連のものを起動する追加のコントローラー クラスを作成できます。ゲームプレイ。

テスト駆動開発の主な利点の 1 つは、クラスをテスト可能にすることです。つまり、クラスをビューに依存させないようにすることができます。したがって、最初の目標は、実際にはcocos2dなしで実行されるテストを作成することです。

これがどのように行われるかを確認したい場合は、OpenGWと、具体的にはクラス リファレンスを確認してください。ゲーム オブジェクト (OGWEntity) の位置と回転をビュー デリゲート (OGWNode) にプッシュする以外に、ビュー コードへの依存はまったくありません。エンティティの状態に基づいてビューでアクションを実行する中間クラスは OGWController です。

これらすべてにより、OpenGW は非常にテストしやすいゲーム シミュレーション エンジンになります。実際、ビューに関連するものから切り離されているため、Sprite Kit と cocos2d-iphone の両方で同じコードを実行する作業を行っています。

于 2013-10-28T12:48:13.533 に答える