Ich verwende CATCH v1.1 build 14, um Komponententests meines C++ Codes durchzuführen.Catch.hpp Komponententest: Wie können Testfälle dynamisch erstellt werden?
Als Teil des Tests möchte ich die Ausgänge mehrerer Module in meinem Code überprüfen. Es gibt keine festgelegte Anzahl von Modulen. Mehr Module können jederzeit hinzugefügt werden. Der Code zum Testen jedes Moduls ist jedoch identisch. Daher denke ich, es wäre ideal, den Testcode in eine for
Schleife zu legen. In der Tat habe ich unter Verwendung von catch.hpp
überprüft, dass ich Abschnitte innerhalb eines Testfalls dynamisch erstellen kann, wobei jeder Abschnitt einem Modul entspricht. Ich kann dies tun, indem Sie die SECTION
Makro in einer for-Schleife umschließt, zum Beispiel:
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
TEST_CASE("Module testing", "[module]") {
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
(Dies ist kein vollständiges Arbeitsbeispiel, aber Sie bekommen die Idee.)
Hier ist mein Dilemma ist. Ich möchte die Module unabhängig testen, so dass bei Ausfall eines Moduls die anderen Module weiterhin getestet werden, anstatt den Test abzubrechen. Die Art, wie CATCH funktioniert, wird jedoch den gesamten Testfall abbrechen, wenn eine einzige REQUIRE
fehlschlägt. Aus diesem Grund möchte ich für jedes Modul einen separaten Testfall erstellen, nicht nur einen separaten Abschnitt. Ich habe versucht, meine for
Schleife außerhalb des TEST_CASE
Makro setzen, aber dieser Code nicht zu kompilieren (wie ich erwartet hatte):
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
TEST_CASE("Module testing", "[module]") {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
Es könnte möglich sein, dies main()
von writing my own zu tun, aber ich kann nicht sehen, wie zu tun es genau. (Würde ich meinen TEST_CASE
Code direkt in die main()
? Was passiert, wenn ich meinen TEST_CASE
Code in einer anderen Datei behalten? Auch wäre es meine anderen, Standardtestfälle auswirken?)
ich auch CHECK
Makros verwenden kann anstelle von REQUIRE
Makros zu vermeiden, den Testfall abzubrechen, wenn ein Modul fehlschlägt, aber dann bekomme ich das gegenteilige Problem: Es versucht, den Test auf einem Modul fortzusetzen, das früh ausfallen sollte. Wenn ich einfach jedes Modul in seinen eigenen Testfall legen könnte, würde das mir das ideale Verhalten geben.
Gibt es eine einfache Möglichkeit, Testfälle in CATCH dynamisch zu erstellen? Wenn ja, kannst du mir ein Beispiel geben, wie es geht? Ich habe die CATCH-Dokumentation gelesen und online gesucht, konnte jedoch keine Hinweise dazu finden.
Ich benutze Ihren ersten Vorschlag, und das bringt mich am meisten dorthin. Im Idealfall möchte ich Module zur Laufzeit dynamisch erkennen und jeweils einen Testfall generieren, aber ich fange an zu denken, dass es mit Catch nicht möglich ist. Ein Hintergrund: Die Module definieren abgeleitete Klassen aus einer abstrakten Basisklasse, die ich definiere. Sie erzeugen unterschiedliche Ausgänge, aber das Verfahren zur Überprüfung der Ausgänge ist gleich. Andere Entwickler fügen ihre eigenen Module hinzu, daher wäre es schön, wenn sie unsere Testfunktion nutzen könnten, um ihre eigenen Module auf Konformität zu prüfen. Vielleicht mache ich es falsch, aber ich sehe keinen besseren Weg. –
Weitere Diskussionen hierzu finden Sie in der Google Group: https://groups.google.com/forum/#!searchin/catch-forum/section/catch-forum/mRBKqtTrITU/FoHEoMn3SN8J – JBRWilkinson