如何在Qt测试框架中对信号进行基准测试?

时间:2018-08-08 11:12:53

标签: c++ qt testing signals benchmarking

我正在Qt C ++中实现连接扫描算法,并且使用Qt测试框架将一些测试添加到了项目中。我查看了Qt测试框架的文档,但找不到找到基准测试异步方法并等待其信号的方法。

您可以使用QSignalSpy来测试信号,但是它会等待一段时间才能检查信号是否触发。 QBENCHMARK可以测量执行一段代码的时间。我想测量异步方法的调用与该方法调用的线程所发出的信号之间的时间。

QString str1 = "foo";
QString str2 = "foo";

QBENCHMARK {
    str1.localeAwareCompare(str2);
}

上面的代码适用于同步操作,但不适用于带信号的异步操作。

1 个答案:

答案 0 :(得分:0)

Qt的测试框架中没有任何东西可以实现这一目标。 但是,借助QEventLoop,您可以等待信号触发(这会使您的代码再次同步)。

如果在事件循环周围应用QBENCHMARK宏,则可以对异步方法进行基准测试。这有一个缺点:创建QEventLoop并将信号连接到事件循环的quit()方法上仍然有一些开销。

QBENCHMARK_ONCE {
    planner->getConnections(
                QUrl("http://irail.be/stations/NMBS/008811189"), // From: Vilvoorde
                QUrl("http://irail.be/stations/NMBS/008891009"), // To: Brugge
                QDateTime::fromString("2018-08-02T13:00:00.000Z", Qt::ISODate), // Departure time (UTC)
                4 // Max transfers
                );

    QEventLoop loop;
    connect(planner, SIGNAL(routesFound(QList<CSA::Route*>)), &loop, SLOT(quit()));
    loop.exec();
}