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