QTEST_APPLESS_MAIN liefert Fehler

Verschiedenes zu Qt
Antworten
Friedrich
Beiträge: 4
Registriert: 10. Januar 2019 18:51

QTEST_APPLESS_MAIN liefert Fehler

Beitrag von Friedrich » 13. Januar 2019 18:18

Hintergrund
Ich schreibe gerade ein Projekt, das ich gerne testen würde. Dafür habe ich folgende Dateistruktur entworfen:
Routenplaner
├───app
├───build
└───TestRoutenplaner

app und TestRoutenplaner sind Teilprojekte des Projektes Routenplaner.

Innerhalb des Testes baue ich mir aus bereitgestellten Daten Kommandozeilenaufrufe zusammen, die ich dann mit system() ausführe und anschließend analysiere. Kompiliert alles ganz wunderbar. Ich habe u. a. QtTest und QtTest/QtTest eingebunden sowie in der Klassendeklaration von Q_Object abgeleitet, Q_OBJECT in der ersten Zeile benannt, die Funktionen als private slots deklariert und an den relevanten Stellen nur QStrings verwendet.
Ich nutze QTEST_APPLESS_MAIN. Allerdings funktioniert QTEST_MAIN ebensowenig.
Das Programm ist auf dem aktuellen Stand.
Ich habe schon alles bereinigt, qmake ausgeführt und neu erstellt -- keine Änderung.

Die häufigsten Fehlerursachen dürften damit schon ausgeschlossen sein.

Das Problem
Wenn ich QTEST_APPLESS_MAIN in meinem Test entkommentiere, erhalte ich folgende Fehlermeldung (Ausschnitt aus der Logging-Datei):

Code: Alles auswählen

In file included from C:/Qt/5.12.0/mingw73_64/include/QtTest/QtTest:11:0,
                 from ../TestRoutenplaner/TestRoutenplaner.cpp:1:
../TestRoutenplaner/TestRoutenplaner.cpp: In function 'int main(int, char**)':
C:/Qt/5.12.0/mingw73_64/include/QtTest/qtest.h:365:16: error: expected ';' before 'tc'
     TestObject tc; \
                ^
../TestRoutenplaner/TestRoutenplaner.cpp:132:1: note: in expansion of macro 'QTEST_APPLESS_MAIN'
 QTEST_APPLESS_MAIN("RoutenplanerTest")
 ^
C:/Qt/5.12.0/mingw73_64/include/QtTest/qtest.h:365:18: warning: statement has no effect [-Wunused-value]
     TestObject tc; \
                  ^
../TestRoutenplaner/TestRoutenplaner.cpp:132:1: note: in expansion of macro 'QTEST_APPLESS_MAIN'
 QTEST_APPLESS_MAIN("RoutenplanerTest")
 ^
C:/Qt/5.12.0/mingw73_64/include/QtTest/qtest.h:367:26: error: 'tc' was not declared in this scope
     return QTest::qExec(&tc, argc, argv); \
                          ^
../TestRoutenplaner/TestRoutenplaner.cpp:132:1: note: in expansion of macro 'QTEST_APPLESS_MAIN'
 QTEST_APPLESS_MAIN("RoutenplanerTest")
 ^
C:/Qt/5.12.0/mingw73_64/include/QtTest/qtest.h:367:26: note: suggested alternative: 'tm'
     return QTest::qExec(&tc, argc, argv); \
                          ^
../TestRoutenplaner/TestRoutenplaner.cpp:132:1: note: in expansion of macro 'QTEST_APPLESS_MAIN'
 QTEST_APPLESS_MAIN("RoutenplanerTest")
 ^
mingw32-make[1]: *** [Makefile.Debug:1879: debug/TestRoutenplaner.o] Error 1
Der Compiler beschwert sich also über diese Stelle hier in qtest.h:

Code: Alles auswählen

#ifdef QT_TESTCASE_BUILDDIR
#  define QTEST_SET_MAIN_SOURCE_PATH  QTest::setMainSourcePath(__FILE__, QT_TESTCASE_BUILDDIR);
#else
#  define QTEST_SET_MAIN_SOURCE_PATH  QTest::setMainSourcePath(__FILE__);
#endif

#define QTEST_APPLESS_MAIN(TestObject) \
int main(int argc, char *argv[]) \
{ \
    TestObject tc; \   /* <-- hier erwartet der Compiler ein Komma vor TestObject */
    QTEST_SET_MAIN_SOURCE_PATH \
    return QTest::qExec(&tc, argc, argv); \
}
Was läuft da schief?

Das Projekt ist relativ groß, deswegen habe ich nur Ausschnitte gepostet. Bei Interesse kann ich das Projekt auf Github o. ä. hochladen. Ein Minimalbeispiel zu kompilieren ist mir nicht gelungen.

Das Problem tritt mit Windows ebenso wie mit Linux auf.

Friedrich
Beiträge: 4
Registriert: 10. Januar 2019 18:51

Re: QTEST_APPLESS_MAIN liefert Fehler

Beitrag von Friedrich » 14. Januar 2019 12:36

Das Problem hat sich erledigt. Das QTEST_APPLESS_MAIN -Makro und Konsorten erwarten den Namen der Testklasse ohne Anführungszeichen.

Diese Fehlerursache hatte ich fälschlicherweise ausgeschlossen, offenbar weil ich im entsprechenden Kompilierlauf noch was anderes geändert hatte und die entstehende kryptische Fehlermeldung diesem Makro zuschrieb.

Antworten