2012-12-07 40 views
5

私は自分のアクセスレイヤーをゲームエンジンに書きました。私自身のコードを処理できるように、すべてのフレームと呼ばれるGameLoopがあります。私は特定のことをすることができ、これらのことが起こったかどうかを確認することができます。非常に基本的な方法で、それは次のようになります。非同期コードをテストする方法

void cycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 

    //read the value 
    std::string text = Engine::getText(); 
} 

は、私は私のEngine -layerは、自動テストを書くことで作業しているかどうかをテストします。私はこのような簡単な比較テストのためにBoost Unittest Frameworkを使用した経験があります。

問題は、私がエンジンにしたいことは、cycle()の呼び出しの後に処理されているということです。したがってをEngine::setText(...)の直後に呼び出すと、空の文字列が返されます。 cycle()の次の呼び出しまで待つと正しい値が返されます。

私は同じサイクルでそれらを処理することができない場合、どのように私がテストを書くべきかと思っています。ベストプラクティスはありますか?このような環境でBoost Unittest Frameworkが提供する "従来のテスト"アプローチを使用することは可能ですか?このような特殊なケースを目的とした他のフレームワークはおそらくありますか?

ここではすべてC++を使用していますが、プログラミング言語とは無関係な答えがあると思います。

UPDATE: は、あなたとの2つのオプションがありますcycle()

+0

エンジンが処理を完了したことを伝えることができない限り、私は実際にこの動作を認識しません。しかし、他の人々の答えを見て非常に好奇心。 –

答えて

-1

Engine外にアクセスすることはできません。

は、もしあなたが同期またはC++ 11の先物を使用して使用することができます持っているライブラリーあなたが持っていることができる最高の上に持っていけない場合は(結果のreadynessを示すことができます)施設のように、あなたのテストケースであなたは

void testcycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 
    while (!Engine::isResultReady()); 
    //read the value 
    assert(Engine::getText() == "WHATEVERVALUEYOUEXPECT"); 
} 

以下のような何かを行うことができますタイムアウト(あなたが偽の障害を持っているかもしれませんので、これは良い選択肢ではない):

void testcycle() 
{ 
    //set a specific value 
    Engine::setText("Hello World"); 
    while (Engine::getText() != "WHATEVERVALUEYOUEXPECT") { 
     wait(1 millisec); 
     if (total_wait_time > 1 sec) // you can put whatever max time 
       assert(0); 
    } 

} 
+0

エンジンは 'isResultReady()'を持っていないので、最初の答えは不可能です.2番目の答えは設計上悪いです。この種のテストでタイムアウトやスリープを導入するのは悪いことです。すべてのマシンで異なる可能性があります。あなたのCore i7はわずか1秒で済むかもしれませんが、古いPentiumでは2が必要かもしれません。どちらのケースでも、テストケースは合格するはずですが、スリープが使用された場合は2番目のケースで失敗します。 –

+1

GameEngineは 'cycle()'を呼び出した後に 'Engine :: setText(..)'を処理するので、タイムアウトを追加すると 'Engine :: getText()'を直後に呼び出した場合と同じになります。時間。 'setText'がGameEngineで処理された後、適切な結果を得ることができます。これは次の' cycle() 'を意味します。 – MOnsDaR

+0

@DanielKamilKozar - コメントを正しく読んでください。"(これは良い選択ではありませんあなたが偽の失敗をしている可能性があるからです) " – RamneekHanda

0

上記のあなたの例では、std::string text = Engine::getText();を使用すると、1つのサイクルから覚えているが、次に実行するコードです。後で実行できるように保存することができます。たとえば、C++ 11を使用すると、ラムダを使用して、インラインで指定された単純な関数にテストをラップすることができます。

関連する問題