Ich begann mit Unit Tests in Qt zu experimentieren und würde gerne Kommentare zu einem Szenario hören, bei dem Unit Testsignale und Slots getestet wurden.Qt Ereignisschleife und Komponententest?
Hier ein Beispiel:
Der Code i ist testen möchte (m_socket ist ein Zeiger auf QTcpSocket
): Ich kann ein zurückgekehrter testen
void CommunicationProtocol::connectToCamera()
{
m_socket->connectToHost(m_cameraIp,m_port);
}
Da dies ein asynchroner Aufruf Wert. Ich würde jedoch gerne testen, ob tatsächlich das Antwortsignal ausgegeben wird, das die Steckdose bei einer erfolgreichen Verbindung (void connected()
) aussendet.
Ich habe den Test unten geschrieben:
void CommunicationProtocolTest::testConnectToCammera()
{
QSignalSpy spy(communicationProtocol->m_socket, SIGNAL(connected()));
communicationProtocol->connectToCamera();
QTest::qWait(250);
QCOMPARE(spy.count(), 1);
}
Meine Motivation war, wenn die Antwort nicht in 250ms passiert, ist etwas nicht in Ordnung.
Jedoch wird das Signal nie gefangen, und ich kann nicht sicher sagen, wenn es sogar ausgestrahlt wird. Aber ich habe bemerkt, dass ich die Ereignisschleife nirgendwo im Testprojekt starte. Im Entwicklungsprojekt wird die Ereignisschleife im Wesentlichen mit QCoreApplication::exec()
gestartet.
Um es zusammenzufassen, wenn das Gerät eine Klasse zu testen, die auf Signale und Slots abhängt, wo sollte die
QCoreApplication a(argc, argv);
return a.exec();
in der Testumgebung ausgeführt werden?
In der main() Funktion? Sie können das Makro 'QTEST_MAIN (CommunicationProtocolTest)' in Ihrem Komponententest verwenden. – vahancho
'qWait' dreht seine eigene Event-Schleife, das ist also kein Problem. Versuchen Sie es mit einem längeren Timeout. Im Idealfall würden Sie Ihre eigene Mock-up-Implementierung eines 'QAbstractSocket' bereitstellen, der zum Testen verwendet wird. –
@vahancho Danke, das hat das Problem gelöst, jedoch beschränkt es mich, nur eine einzige Klasse pro Lauf zu testen. – TheMeaningfulEngineer