Seite 1 von 1

Wie Teste ich ein Socket?

Verfasst: 18. Juni 2009 10:42
von Seikilos
Ich versuche mich mit QtTest vertraut zu machen, habe jedoch ein Verständnisproblem.
Tests sind private slots einer Klasse, die aufgerufen werden, soweit ok.
Aber wie teste ich asynchron aufgerufene Slots?

Ich hab eine Klasse, die QUdpSockets nutzt und würde gerne nun die Funktionalität verifizieren in dem ich von einem TestSocket zu meiner Klasse kommuniziere. Dies funktioniert aber nur asynchron, sprich testsocket sendet, meine Klasse empfängt und ruft einen signal auf. Ich müsste nun eigentlich nun das testen, was von dem signal kommt, das kann ich tun in dem ich ein slot dran hänge.
Wenn QtTest jedoch private slots automatisch startet, dann hab ich doch an dieser Stelle ein Problem?

Verfasst: 18. Juni 2009 11:27
von -=Freaky=-
ich bin mir nicht sicher, ob du das suchst, aber guck dir mal QSignalSpy an.

mfg,
julian

Verfasst: 18. Juni 2009 12:40
von Seikilos
Hallo,
leider nicht.
Das Beispiel aus der SignalSpy Doku hier:

Code: Alles auswählen

 QCheckBox *box = ...;
 QSignalSpy spy(box, SIGNAL(clicked(bool)));

 // do something that triggers the signal
 box->animateClick();

 QCOMPARE(spy.count(), 1); // make sure the signal was emitted exactly one time
 QList<QVariant> arguments = spy.takeFirst(); // take the first signal

 QVERIFY(arguments.at(0).toBool() == true); // verify the first argument
Funktioniert nur in dem Fall, weil box->animateClick ein Blocking call ist, sprich die Ausführung des restlichen codes wartet, bis die Methode abgeschlossen ist.
Bei Sockets und asynchroner kommunikation kann der obige code nicht garantieren, dass QCOMPARE(spy.count(), 1); erst dann erfolgt, wenn clicked ausgeführt worden ist (bezogen auf sockets, nicht auf click)

Verfasst: 18. Juni 2009 12:47
von -=Freaky=-
ja da hast du recht.
ich hab sowas mal ganz provisorisch via

Code: Alles auswählen

while( mySignalSpy.count() < 1 )
  QThread::msleep( 10 /* oder wieviel auch immer */ );
gemacht, aber optimal ist das wohl nicht ...

mfg,
julian

Verfasst: 19. Juni 2009 10:02
von Seikilos
Einen ähnlichen Tipp habe ich von einem Entwickler eines Test Frameworks auch bekommen.
Geht wohl nur so

Verfasst: 22. Juni 2009 10:02
von Seikilos
Ist msleep in Qt 4.5 nicht mehr static protected? Denn wenn ja, wie rufst du das dann auf? :)

Verfasst: 22. Juni 2009 16:16
von -=Freaky=-
ich habe eine von QThread abgeleitete klasse.
die stellt eine static public methode msleep(unsigned long msec), in welcher wiederrum QThread::msleec( msec ) aufgerufen wird.
ist btw. nicht ganz auf meinem eigenen mist gewachsen, funktioniert aber gut. :)

// edit: der code, den ich oben gepostet habe, ist also quasi nur pseudo-code, QThread::msleep funktionert so natuerlich nicht.

mfg,
julian