2011-06-22 25 views
4

QtのTcp Sockets APIを使ってシンクライアント/サーバを構築しました。私はそれが非常にうまく動作していることを知っています。なぜなら、私はワイヤでたくさんのデータを送ってそれを確認したからです。しかし、私のプロジェクトマネージャはユニットテストのスイートを望んでおり、Qtのテストライブラリを使ってそれらを実装しています。QTcpClientは正常に接続しますが、自分のサーバーには接続しません。どこに接続していますか?

私は単純にユニットテストでsendData()メソッドを検証するためにQTcpSocketからデータを受け取るようにダミーサーバを設定しようとしています。テストソケットに接続すると接続されていますが、ダミーサーバーとダミーソケットを接続するスロットは決して呼び出されません。

私はここで間違っているのを誰も見ることができますか? 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); 

テストから

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 

から(私はダウンダウンテストクラスで壊れているように見える部分だけにコードを剥奪しました)ランの出力:

********* 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

関連する問題