如何测试Qt SCXML状态机

5

我正在尝试使用Qt测试框架验证状态机的行为。但是我不明白我应该如何测试Qt SCXML实现。当然有QSignalSpy,但那只限于不需要运行事件循环的信号/槽。我想要做的是:

myStateMachine.submitEvent("MyEvent");
// Run event loop
// Check result

我尝试过使用QCoreApplication::processEvents(),有时可以正常工作,但有时在调用processEvents()时会被卡住。我猜可能是触发了一个无限循环。我通过谷歌搜索没有找到答案,但一定有正确的方法。

2个回答

3

在基于QtTest的测试中,您可以使用QTest::qWait()来运行给定时间的事件循环。

您还可以使用QSignalSpy在一定时间内等待信号发生,参见QSignalSpy::wait()

如果有多个信号可以触发测试继续进行,您还可以使用嵌套事件循环,例如下面这样:

QEventLoop loop;
connect(sender1, SIGNAL(signal1()), &loop, SLOT(quit()));
connect(sender2, SIGNAL(signal2()), &loop, SLOT(quit()));
loop.exec();

如有必要,可以与计时器结合使用以结束循环,以防没有这些信号中的任何一个到达


0

我们曾经遇到过同样的问题,而且我们利用了QScxmlStateMachine::reachedStableState信号。

// We declared a QTestEventLoop as m_eventLoop
connect(stateMachine, &QScxmlStateMachine::reachedStableState, 
        &m_eventLoop, &QTestEventLoop::exitLoop);

stateMachine->submitEvent("MyEvent");
m_eventLoop.enterLoopMSecs(3000);
// check the state, results etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接