Sto usando CATCH v1.1 build 14 per eseguire il test dell'unità del mio codice C++.Test dell'unità Catch.hpp: come creare dinamicamente i casi di test?
Come parte del test, vorrei controllare le uscite di diversi moduli nel mio codice. Non c'è un numero fisso di moduli; più moduli possono essere aggiunti in qualsiasi momento. Tuttavia, il codice per testare ciascun modulo è identico. Pertanto, penso che sarebbe ideale inserire il codice di prova in un ciclo for
. Infatti, usando catch.hpp
, ho verificato che posso creare in modo dinamico sezioni in un caso di test, in cui ogni sezione corrisponde a un modulo. Posso fare questo racchiudendo la macro SECTION
in un ciclo for, per esempio:
#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*/);
}
}
}
(Questo non è un esempio di lavoro completo, ma si ottiene l'idea.)
Ecco il mio dilemma. Vorrei testare i moduli in modo indipendente, in modo tale che se un modulo si guasta, continuerà a testare gli altri moduli invece di interrompere il test. Tuttavia, il modo in cui CATCH funziona, interromperà l'intero Test Case se un singolo REQUIRE
non riesce. Per questo motivo, vorrei creare un caso di test separato per ogni modulo, non solo una sezione separata. Ho provato a mettere il mio for
ciclo di fuori del TEST_CASE
macro, ma questo codice non riesce a compilare (come mi aspettavo):
#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*/);
}
}
}
Potrebbe essere possibile fare questo writing my ownmain()
, ma non riesco a vedere come fare esattamente. (Avrei messo il mio codice TEST_CASE
direttamente nel main()
? Cosa succede se voglio mantenere il mio codice TEST_CASE
in un file diverso? Inoltre, avrebbe sui miei altri, casi di test più standard?)
posso anche usare CHECK
macro invece dei macro REQUIRE
per evitare di interrompere il Test Case quando un modulo si guasta, ma poi ho il problema opposto: prova a continuare il test su un modulo che avrebbe dovuto fallire presto. Se potessi inserire ogni modulo nel proprio Test Case, questo dovrebbe darmi il comportamento ideale.
C'è un modo semplice per creare dinamicamente i casi di test in CATCH? Se è così, puoi darmi un esempio di come farlo? Ho letto la documentazione CATCH e ho cercato online, ma non ho trovato alcuna indicazione su come farlo.
Sto usando il tuo primo suggerimento, e questo mi fa quasi tutto il tragitto. Idealmente, mi piacerebbe rilevare dinamicamente i moduli in fase di esecuzione e generare un test case per ciascuno, ma sto iniziando a pensare che non sia possibile con Catch. Qualche background: i moduli definiscono le classi derivate da una classe base astratta che definisco. Producono uscite diverse, ma la procedura per controllare le uscite è la stessa. Altri sviluppatori aggiungono i propri moduli, quindi sarebbe bello se potessero usare la nostra funzione di test per verificare la conformità dei propri moduli. Forse sto sbagliando, ma non vedo un modo migliore. –
C'è più discussione su questo nel Gruppo Google: https://groups.google.com/forum/#!searchin/catch-forum/section/catch-forum/mRBKqtTrITU/FoHEoMn3SN8J – JBRWilkinson