如何测试异步代码

时间:2012-12-07 15:42:41

标签: c++ testing asynchronous automated-tests

我已将自己的访问层写入游戏引擎。每个帧都会调用一个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()

2 个答案:

答案 0 :(得分:0)

在上面的示例中,std::string text = Engine::getText();是您想要从一个循环中记住但在下一个循环中执行的代码。您可以将其保存以供以后执行。例如 - 使用C ++ 11,您可以使用lambda将测试包装成一个内联指定的简单函数。

答案 1 :(得分:-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);
    }

}