问题描述
|
我已经使用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);
测试运行的输出:
********* 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
解决方法
当“ 3”创建一个QApplication并运行您的所有测试时,它按顺序进行,而不是事件循环。因此,尽管您的套接字确实可以连接到服务器(意味着
qTestSocket->waitForConnected()
返回true
),但是由于该应用不会返回事件循环,因此QTcpServer
的信号不会发出,而TcpCommSocketTest::connectDummyServer()
也不会被调用。
尝试在initTestCase()
的末尾向qApp->processEvents()
拨打电话。应该叫ѭ10。
, 您可能正在连接到较早启动的服务器实例。使用过程监视器四处摸索,以确保您没有任何流浪实例。您的测试设置是否会自动启动并关闭虚拟服务器?可能是测试成功启动了服务器,但未能杀死它。
另外,从127.0.0.1起,虚拟服务器与测试代码在同一台计算机上运行,对吗?
, 确认ѭ11的返回值。如果服务器确实正在侦听端口9000,则应返回ѭ5。如果服务器返回ѭ13,则可能是端口9000被另一个进程阻塞,并且无法侦听。在这种情况下,您的“ 14”连接到该其他进程而不是您自己的服务器。