Wie Teste ich ein Socket?

Alles rund um die Programmierung mit Qt
Antworten
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Wie Teste ich ein Socket?

Beitrag 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?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich bin mir nicht sicher, ob du das suchst, aber guck dir mal QSignalSpy an.

mfg,
julian
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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)
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag 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
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Einen ähnlichen Tipp habe ich von einem Entwickler eines Test Frameworks auch bekommen.
Geht wohl nur so
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Ist msleep in Qt 4.5 nicht mehr static protected? Denn wenn ja, wie rufst du das dann auf? :)
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag 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
Antworten