4

我已经使用 Qt 的 Tcp Sockets API 成功构建了一个瘦客户端/服务器。我知道它工作得很好,因为我已经通过网络发送了大量数据并对其进行了验证。但是,我的项目经理想要一套单元测试,我正在使用 Qt 的测试库来实现它们。

无论如何,我正在尝试设置一些虚拟服务器来简单地从 QTcpSocket 接收数据,以验证单元测试中的 sendData() 方法。当我连接测试套接字时,显示它已连接,但连接虚拟服务器及其虚拟套接字的插槽从未被调用!

谁能看到我在这里做错了什么?(我已将代码剥离到仅在测试类中似乎损坏的部分)

从 tst_tcpcommsocket.h

#ifndef TST_TCPCOMMSOCKET_H
#define TST_TCPCOMMSOCKET_H

#include <QtCore/QString>
#include <QtTest/QtTest>

#include <iostream>

#include <QTcpSocket>
#include <QTcpServer>

class TcpCommSocketTest : public QObject
{
    Q_OBJECT

private:
    QTcpSocket* qTestSocket;
    QTcpSocket* qDummySocket;
    QTcpServer* qDummyServer;

public:
        TcpCommSocketTest();

public slots:
    void connectDummyServer();

private Q_SLOTS:
    void initTestCase();    
    void sendDataTest();    
    void cleanupTestCase();
};

#endif // TST_TCPCOMMSOCKET_H

来自 tst_tcpcommsocket.cpp

#include "tst_tcpcommsocket.h"

void TcpCommSocketTest::connectDummyServer()
{
    cout << "connection attempt" << endl;
    qDummySocket = qDummyServer->nextPendingConnection();
}

void TcpCommSocketTest::initTestCase()
{
    qDummySocket = NULL;
    qDummyServer = new QTcpServer();
    qDummyServer->listen( QHostAddress("127.0.0.1"), 9000 );
    connect( qDummyServer, SIGNAL(newConnection()), SLOT(connectDummyServer()) );

    qTestSocket = new QTcpSocket();
    qTestSocket->connectToHost( QHostAddress("127.0.0.1"), 9000 );

    QVERIFY( qTestSocket->waitForConnected( 5000 ) );
    QVERIFY( qTestSocket->state() == QTcpSocket::ConnectedState );
}

void TcpCommSocketTest::sendDataTest()
{
    int i=0;
    QVERIFY( qDummySocket != NULL );
}

QTEST_MAIN(TcpCommSocketTest);

测试运行的输出:

********* Start testing of TcpCommSocketTest *********
Config: Using QTest library 4.7.3, Qt 4.7.3
PASS   : TcpCommSocketTest::initTestCase()
FAIL!  : TcpCommSocketTest::sendDataTest() 'qDummySocket != NULL' returned FALSE. ()
   Loc: [-]
cleanup
PASS   : TcpCommSocketTest::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped
4

3 回答 3

4

虽然QTEST_MAIN创建 QApplication 并运行所有测试,但它是按顺序执行的,而不是事件循环。因此,虽然您的套接字确实可以连接到服务器(意味着qTestSocket->waitForConnected()返回true),但由于应用程序不会返回到事件循环,因此QTcpServer不会发出 ' 信号,也TcpCommSocketTest::connectDummyServer()不会被调用。

尝试qApp->processEvents()initTestCase(). 它应该connectDummyServer()被调用。

于 2011-06-22T17:06:05.520 回答
1

您可能正在连接到之前启动的服务器实例。使用进程监视器四处查看以确保您没有任何杂散实例。您的测试设置是否会自动启动和关闭虚拟服务器?可能是测试成功启动了服务器,但未能杀死它。

另外,从 127.0.0.1 开始,虚拟服务器与测试代码在同一台机器上运行,对吗?

于 2011-06-22T01:41:15.590 回答
1

验证的返回值qDummyServer->listen()true如果服务器确实在端口 9000 上侦听,它应该返回。如果它返回false,则可能是端口 9000 被另一个进程阻塞,它无法侦听。在这种情况下,您qTestSocket连接到该其他进程而不是您自己的服务器。

于 2011-06-22T03:28:22.380 回答