2011-06-22 49 views
4

我已經成功構建了一個使用Qt的Tcp套接字API的瘦客戶機/服務器。我知道它工作得很好,因爲我通過電線發送了大量數據並進行了驗證。但是,我的項目經理想要一套單元測試,並且正在使用Qt的測試庫來實現它們。QTcpClient成功連接,但不連接到我的服務器。它在哪裏連接?

無論如何,我試圖設置一些虛擬服務器來簡單地接收來自QTcpSocket的數據,以驗證單元測試中的sendData()方法。當我連接測試插座時,顯示它已連接,但連接虛擬服務器和虛擬插座的插槽永遠不會被調用!

任何人都可以看到我在做什麼錯在這裏? (我已經剝離的代碼down下來,只是,似乎在測試類斷裂的部分)

從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); 

測試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 

回答

4

雖然QTEST_MAIN創建一個QApplication並運行所有測試,但它是按順序執行的,而不是事件循環。因此,雖然您的套接字確實可以連接到服務器(意思是qTestSocket->waitForConnected()返回true),但由於應用程序不會返回到事件循環,因此QTcpServer的信號不會被髮射,並且TcpCommSocketTest::connectDummyServer()也不會被調用。

嘗試在initTestCase()的末尾添加對qApp->processEvents()的呼叫。它應該讓connectDummyServer()被調用。

+0

非常感謝。這是正確的解決方案。我的單元測試現在完全可用。 – dusktreader

1

您可能會連接到inst服務器的更早啓動。用流程監視器來確保你沒有任何流浪的事件。您的測試設置是否會自動啓動並關閉虛擬服務器?這可能是測試成功啓動服務器,但未能殺死它。

另外,從127.0.0.1開始,虛擬服務器與測試代碼運行在同一臺機器上嗎?

+0

我在listen()調用周圍添加了一個QVERIFY(),它傳遞的很好。我也試過QVERIFY(qDummyServer-> isListening()),並且傳遞正常。我檢查了一下,並且沒有任何流浪的進程在運行(ps -e),並且netstat沒有顯示任何在端口9000上監聽的內容。虛擬服務器運行在同一臺機器上。 – dusktreader

1

驗證qDummyServer->listen()的返回值。如果服務器確實在監聽端口9000,它應該返回true。如果它返回false,那麼端口9000可能被另一個進程阻塞,並且它不能監聽。在這種情況下,您的qTestSocket連接到該其他進程而不是您自己的服務器。

+0

請參閱我對Digikata答案的評論。我很難過.... – dusktreader