5

ゲーム エンジンに独自のアクセス レイヤーを記述しました。独自のコードを処理できるフレームごとに呼び出される GameLoop があります。私は特定のことを行い、これらのことが起こったかどうかを確認することができます. 非常に基本的な方法では、次のようになります。

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

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

Engine自動化されたテストを作成して、レイヤが機能しているかどうかをテストしたいと考えています。このような単純な比較テストに Boost Unittest Framework を使用した経験があります。

問題は、エンジンに実行させたいいくつかの処理が への呼び出しの後に処理されることcycle()です。Engine::getText()そのため、直後に呼び出すとEngine::setText(...)空の文字列が返されます。cycle()正しい値の次の呼び出しが返されるまで待つとします。

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

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

更新:Engine外部にアクセスすることはできませんcycle()

4

2 に答える 2

0

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

于 2012-12-07T16:15:27.857 に答える
-1

2つのオプションがあります。

所有しているライブラリを同期的に使用できる場合、またはファシリティ(結果の準備ができていることを示すことができる)のようなc ++ 11先物を使用できる場合は、テストケースで次のように実行できます。

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);
    }

}
于 2012-12-07T16:06:13.640 に答える