Qtestlib:QNetworkRequest未执行

Qtestlib:QNetworkRequest未执行,qt,qnetworkaccessmanager,qtestlib,Qt,Qnetworkaccessmanager,Qtestlib,我想测试对Web服务器的异步请求。为此,我创建了一个简单的单元测试来快速尝试几行代码: void AsynchronousCall::testGet() { QNetworkAccessManager *nam = new QNetworkAccessManager(this); QUrl url("http://myownhttpserver.org"); QNetworkRequest req(url); this->connect(nam, S

我想测试对Web服务器的异步请求。为此,我创建了一个简单的单元测试来快速尝试几行代码:

void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);

}

void AsynchronousCall::reqFinished(QNetworkReply *rep)
{
    qDebug() << rep->readAll();
    qDebug() << "finshed";
}
void AsynchronousCall::testGet()
{
QNetworkAccessManager*nam=新的QNetworkAccessManager(此);
QUrl url(“http://myownhttpserver.org");
QNetworkRequest请求(url);
此->连接(nam,信号(已完成(QNetworkReply*)),此,插槽(已完成(QNetworkReply*));
QNetworkReply*rep=nam->get(请求);
}
void AsynchronousCall::reqFinished(QNetworkReply*rep)
{
qDebug()readAll();
qDebug()获取(req);执行请求


有什么提示吗?我的every unittests中必须使用loop.exec()吗?

如果要测试异步行为,必须使用QEventLoop或其他具有类似功能的类。我建议您编写如下帮助器方法:

bool waitForSignal(QObject *sender, const char *signal, int timeout = 1000) {
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(timeout);
    timer.setSingleShot(true);

    loop.connect(sender, signal, SLOT(quit()));
    loop.connect(&timer, SIGNAL(timeout()), SLOT(quit()));
    timer.start();
    loop.exec();

    return timer.isActive();
}
void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);
    QVERIFY(waitForSignal(nam, SIGNAL(finished(QNetworkReply*)), 5000));
}
然后您可以在单元测试中使用它,如下所示:

bool waitForSignal(QObject *sender, const char *signal, int timeout = 1000) {
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(timeout);
    timer.setSingleShot(true);

    loop.connect(sender, signal, SLOT(quit()));
    loop.connect(&timer, SIGNAL(timeout()), SLOT(quit()));
    timer.start();
    loop.exec();

    return timer.isActive();
}
void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);
    QVERIFY(waitForSignal(nam, SIGNAL(finished(QNetworkReply*)), 5000));
}
您的测试还存在其他问题:

  • 依赖于网络连接的测试不应该是单元测试。您希望您的单元测试快速进行,这是网络连接无法实现的
  • 您的测试并没有真正测试任何东西:它只是将一些信息放入调试控制台。您应该定义期望值,并使用QVERIFY和QCOMPARE宏进行验证
  • QTest太糟糕了。如果您是从头开始创建测试库,请改用+开始

  • 单元测试对于测试网络服务是很好的,尽管有争议的是,QTest是否是测试外部事物的方法是可行的……事实证明,KDE有一个函数QTest::kWaitForSignal,它做了完全相同的事情。