我已经使用Qt的Tcp套接字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);
Test Run的输出:
********* 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
答案 0 :(得分:4)
虽然QTEST_MAIN
创建了一个QApplication并运行了所有测试,但它按顺序执行,而不是使用事件循环。因此,虽然您的套接字确实可以连接到服务器(意味着qTestSocket->waitForConnected()
返回true
),但由于应用程序没有返回事件循环,QTcpServer
的信号将无法获得发出,TcpCommSocketTest::connectDummyServer()
永远不会被调用。
尝试在qApp->processEvents()
末尾添加对initTestCase()
的通话。它应该让connectDummyServer()
被调用。
答案 1 :(得分:1)
您可以连接到之前启动的服务器实例。使用进程监视器来查看,以确保您没有任何杂散实例。您的测试设置是否会自动启动并关闭虚拟服务器?可能是测试成功启动了服务器,但没有杀死它。
另外,从127.0.0.1开始,虚拟服务器与测试代码在同一台机器上运行吗?
答案 2 :(得分:1)
验证qDummyServer->listen()
的返回值。如果服务器确实正在侦听端口9000,它应返回true
。如果它返回false
,则端口9000可能被另一个进程阻止,并且它无法侦听。在这种情况下,您的qTestSocket
连接到其他进程而不是您自己的服务器。