如何测试异步代码

MOn*_*DaR 5 c++ testing automated-tests asynchronous

我已经为游戏引擎编写了自己的访问层.每个帧都会调用一个GameLoop,让我可以处理自己的代码.我能够做具体的事情,并检查这些事情是否发生.它以一种非常基本的方式看起来像这样:

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

    //read the value
    std::string text = Engine::getText();
}
Run Code Online (Sandbox Code Playgroud)

我想Engine通过编写自动化测试来测试我的-layer是否正常工作.我有一些使用Boost Unittest Framework进行简单比较测试的经验.

问题是,我希望引擎做的一些事情只是在调用之后处理cycle().所以Engine::getText()直接调用Engine::setText(...)会返回一个空字符串.如果我要等到下一次cycle()正确值的调用将被返回.

我现在想知道如果不能在同一个循环中处理它们,我应该如何编写测试.有没有最佳做法?是否可以在这样的环境中使用Boost Unittest Framework提供的"传统测试"方法?是否有其他框架针对这种专门案例?

我在这里使用C++,但我可以想象有一些与编程语言无关的答案.

更新:无法访问Engine外部cycle()

Ram*_*nda -1

您有两种选择:

如果您拥有的库可以同步使用或使用 c++11 futures 之类的工具(可以指示结果的准备情况),那么在您的测试用例中您可以执行以下操作

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

如果你没有上述最好的,你可以设置超时(但这不是一个好的选择,因为你可能会遇到虚假的失败):

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

}
Run Code Online (Sandbox Code Playgroud)