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,您可以使用 lambda 将测试包装到内联指定的简单函数中。

于 2012-12-07T16:15:27.857 回答
-1

您有两种选择:

如果您拥有的库可以同步使用或使用 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 回答