[gelöst] QTestLib

Alles rund um die Programmierung mit Qt
Antworten
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

[gelöst] QTestLib

Beitrag von Mani99 »

Hi,

ich möchte in meinem Programm UnitTests mit der QTestLib einbauen. Ich habe das Tutorial aus der Qt-Hilfe schon durch und die Funktionen sind mir klar.

Was mir jetzt nicht ganz klar ist, wie das genau bei einem Projekt eingebaut wird. Hier in diesem Forum gibts mehrere Beiträge, in denen beschrieben steht, wie man so etwas aufbaut mit *.pri und *.pro Dateien usw. z.B. dieser Beitrag.

Nur das ist alles sehr allgemein gehalten, bzw. am ende des Beitrags ist ein Link zu einem Programm das die QTestLib verwendet, jedoch ist das Programm sehr umfangreich.
Kann mir jemand ein beispiel (event. kleines programm) oder so geben wie man so etwas in einem projekt einbaut oder einen Link wo das etwas genauer erklärt wird?

Danke!
Zuletzt geändert von Mani99 am 5. August 2011 14:29, insgesamt 1-mal geändert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QTestLib

Beitrag von RHBaum »

Bei .pro dateien kann ich ned helfen, verwende die nich (entweder nutz ich Visual Studio projecte und solutions, oder cmake)

Aber generell sind paar Begrifflichkeiten aehm ... zweideutig formuliert.

Für mich ist project = binary. Also genau eine Übersetzungseinheit.
Dein QTest muss immer eine eigene Übersetzungseinheit sein (es "überschreibt" die main() )
Generelll voll automatisiert man das ganze, in dem man die normale Sache, also die exe, lib oder dll baut.
Danach den QTest als exe baut ...
danach den Test Laufen laesst und den rueckgabecode auswertet
das ganze in ein Make script / in eine solution packt ...

das (q)make sollte dann failen, wenn return != 0 ist !

um andere programme laufen zu lassen, gibts den system() befehl , glaub auch unter qmake
den Pfad zum gebauten binary (exe) solltest innerhalb des (q)make scripts kennen !

Ciao ...
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Re: QTestLib

Beitrag von Mani99 »

Hi, danke für die antwort(en).

Aber das ist genau das bei dem ich nicht weiter komme. Ich weiß ja nicht einmal ob ich bei meinem Gedankengang auf dem Richtigen weg bin!

Gehen wir von folgendem einfachen Szenario aus:

Ich habe ein Projekt welches folgende Struktur hat

main.cpp
meine_klasseA (.h + .cpp)
meine_klasseB (.h + .cpp)
meine_klasseC (.h + .cpp)

Wie kombiniere ich das jetzt mit der QTestLib? Wie gehe ich da jetzt weiter vor um Testfunktionen einzubauen?

Danke!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QTestLib

Beitrag von RHBaum »

1. frage, was willst du mit dem QTest überhaupt testen ?
- deine Application als solches (quasi ein GUI oder Konsole input / output test)
- Komponenten deiner Applikation ? Also ob Klasse A Korrekt funktioniert, ....

wenn Antwort gleich B :
DU brauchst ein neues Binaray, aka Project, aka Target ....
Dafuer solltest du dir ein neues Verzeichniss fuer den test unterhalb der make struktur anlegen

In diesem TestProject legst du eine Qt-Klasse (normal ohne gui) an, abgeleitet von QOBject.
Dort schreibst du deine TestFUnktionalitaeten als private slots
in der Implementation ,also der cpp deiner Testklasse, gibts du das QTEST_MAIN(QTestKlasse) Makro mit an, das erzeugt dir eine main() ...
in den TestMethoden instanziierst Du deine Klassen halt, und machst wilde sachen .. was du halt testen willst.
Dazu braucht das QTestProject natuerlich die header und Impls der zu testenden klassen ...
wenn die in keiner lib sind : die c/cpp files direct aus den orginalen verzeichnissen deinem Project mit Zuweisen.
wenn die in einer lib sind: dein TestProject gegen die lib linken.
den pfad zu den h/hpp deiner klassen dem TestProject als includepfad hinzufügen.

dein übergeordnetes makefile so anpassen, dass es in das TestProject Verzeichniss springt und das makefile damit ausfuehrt (das TestProject wird als binary gebaut)
dein uebergeordnetes makefile so anpassen, das es das gebildete binary des TestProjects ausführt - knallt wenn nen Test fehlschlaegt weil rueckgabe != 0
Damit knallt auch dein uebergeordneter makeaufruf !

Was du verstehen solltest:
Wie kombiniere ich das jetzt mit der QTestLib?
DU kombinierst innerhalb deines eigentlichen Projectes gar nix ...
der Code zum testen soll ja nicht mit ausgeliefert werden und in deiner exe oder dll stecken ...
der QTest sollte also 100% getrennt von deinem eigentlichen Projekt sein.
Also deine Ursprungsklassen solltest du wegen deinem Test gar nicht anfassen ....
Ausserdem testest du auch nie die internen funktionen, sondern nur die externen nicht private oder protected, nur was andere zu gesicht bekommen ... bzw die schnittstellen der klassen die du selbst von extern benutzen kannst.

DU legst eigentlich nen komplett neues project an, was deinen Test Implementiert.
Damit Das compilieren deiner Exe und der Test automatisch gehen must du nur dem QMake beibringen, das es neben dem Binary auch das TestProject baut, und dann auch ausfuehrt.
Das macht man eigentlich, in dem man mit übergeordneten makefiles arbeitet, also du innerhalb des makefiles in ein verzeichniss springst, und da das makefile ausführt.

Also nochmal, Dein binary und dein TestProject sind eigentlich 2 unterschiedliche Projecte, die nur die gleichen klassen/codebasis verwenden.
Und die automatisierung passiert nur ueber ein übergeordnetes makefile ...


Ciao ...
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Re: QTestLib

Beitrag von Mani99 »

Danke für die erklärung, jetzt hab ich es glaub ich verstanden!

Zusammenfassend, ob ich alles richtig verstanden habe:

Ich erstelle neben dem eigentlichen projekt noch ein testprojekt, in dem ich testfälle baue. Diese testfälle rufen dann methoden aus aus den zu testenden libs auf. Und auf grund des rückgabewertes wird dann das eigentliche projekt kompiliert oder eben nicht.

Hab ich das jetzt richtig verstanden?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QTestLib

Beitrag von RHBaum »

Ich erstelle neben dem eigentlichen projekt noch ein testprojekt,

jupp
in dem ich testfälle baue.

jupp
Diese testfälle rufen dann methoden aus aus den zu testenden libs auf.
oder instanzieren klassen und rufen daran methoden auf
oder instanzieren xtausend mal eine klasse und checken, ob das unter einer bestimmten zeit bleibt
.... unvam.
Und auf grund des rückgabewertes wird dann das eigentliche projekt kompiliert oder eben nicht.
wenn es so gefordert ist, kann man es machen.
Aber zumindest der make aufruf sollte kein success zurueck liefern ^^ Ob das eigentliche Project gebaut wurde oder nicht , ist eher zweitrangig.
Trifft eh nur fuer nen Komponententest zu, wenn gegen ne lib testest, oder die schnittstellen ner dll testest, wirst das project sowieso bauen muessen.
Man sollt nur den Aufrufer davon abhalten, dass project als "erfolgreich" gebaut, anzunehmen und es zu distributieren :-)

Ciao ...
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Re: QTestLib

Beitrag von Mani99 »

Ok, danke damit kann ich was anfangen!
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: [gelöst] QTestLib

Beitrag von serious_sammy »

Hallo zusammen, auch wenn der Thread bereits etwas älter ist habe ich leider ein ähnliches Problem.
Ich würde gern mit Unittest arbeiten und würde gerne alle Tests oder auch nur selektiv nur einige auf einmal durchlaufen lassen.

Lieder ist die Dokumentation hinsichtlich der Einrichtung und Verwendung von QTest etwas dürftig.
Ich bin aktuell soweit das ich weiß das man für das testen mindestens zwei Projekte anlegen sollte, eines für das eigentliche Programm und ein anderes für das Testen.
Leider scheinen Abhängigkeiten ein echtes Problem darzustellen, da für mich immer noch nicht klar ist was in welchem .pro File stehen muss damit ich am ende eine Sinnvolle Ausgabe habe.

Am liebsten wäre mir ein kurzes gut dokumentiertes Beispiel Projekt. Ggf. mit ein paar simplen Beispieltests bzw. einem kurzen Benchmark.
Leider konnte ich soetwas noch nicht finden.

Falls jemand ein gutes Beispiel zu Hand hat oder sogar eins schreiben würde wäre ich sehr dankbar.

Vielen Dank, Sammy
Antworten