如何测试Qt SCXML状态机

时间:2016-11-18 13:11:28

标签: qt scxml

我正在尝试使用Qt测试框架验证状态机的行为。我根本不知道我应该如何测试Qt SCXML实现。当然有QSignalSpy,但这只适用于不需要运行事件循环的信号/ slops。我基本上想做的是:

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

我尝试QCoreApplication::processEvents()这有时可行,但有时在调用processEvents()时也会遇到困难。我想我可能会触发无限循环。谷歌也没有帮助,但必须有一种方法来正确地做到这一点。

2 个答案:

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

在没有这些信号到达的情况下,可能与定时器结合以结束循环

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