4

Qt の Tcp Sockets API を使用して、シン クライアント/サーバーを正常に構築しました。大量のデータをネットワーク経由で送信して検証したので、非常にうまく機能することはわかっています。しかし、私のプロジェクト マネージャーは一連の単体テストを望んでおり、Qt のテスト ライブラリを使用してそれらを実装しています。

とにかく、単体テストで sendData() メソッドを検証するために QTcpSocket からデータを受信するだけのダミーサーバーをセットアップしようとしています。テストソケットを接続すると、接続されていることが示されますが、ダミーサーバーとそのダミーソケットを接続するためのスロットは呼び出されません!

ここで私が間違っていることを誰かが見ることができますか? (テストクラスで壊れているように見える部分だけにコードを削除しました)

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

QApplicationQTEST_MAINを作成し、すべてのテストを実行しますが、イベント ループではなく順次実行します。したがって、ソケットは実際にサーバーに接続できますが (つまり、 を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です。その場合、qTestSocket自分のサーバーではなく、他のプロセスに接続します。

于 2011-06-22T03:28:22.380 に答える