2016-01-20 12 views
15

Sto cercando un esempio riuscito di integrazione Catch CatchLib con test CMake (Ctest). come ho capito questo è uno script cmake aggiuntivo che deve analizzare l'uscita dell'applicazione? Qualcuno lo ha già scritto? probabilmente condiviso questo?Integrazione Catch lib (unit test) e CTest (CMake)

========================================= ====

aggiornamento (soluzione è stata trovata):

ho commesso cmake script a CatchLib, per la cattura integrazione con CTest. questa è una versione semplificata dello script cmake di Fraser99 here

+1

C'è una discussione su CMake nella [documentazione di Catch's Build System] (https://github.com/philsquared/Catch/blob/master/docs/build-systems.md#cmake). – phoenix

risposta

24

L'integrazione di cattura con CMake è piuttosto semplice, in quanto è una libreria di sola intestazione.

Ecco un breve riassunto di quello che hai da fare:

è possibile presumere che le fonti di cattura sono già installati sul sistema di compilazione o utilizzare ExternalProject per loro recupero come parte del processo di generazione.

In entrambi i casi, si finirà con i file di intestazione Catch in alcune directory conosciute sulla macchina di compilazione. Vorrei raccomandare la creazione di un obiettivo di interfaccia per rendere queste informazioni note ai tuoi eseguibili di test:

add_library(Catch INTERFACE) 
target_include_directories(Catch INTERFACE ${YOUR_CATCH_INCLUDE_DIR}) 

In questo modo, è possibile specificare semplicemente prendere come una dipendenza per target_link_libraries:

add_executable(my_test ${MY_TEST_SOURCES}) 
target_link_libraries(my_test Catch) 

Come al solito con CMake, add_test si occupa di introdurre i test da CTest:

enable_testing() 
add_test(NAME MyAwesomeTest COMMAND my_test) 

E questo è tutto già. Esegui make test sul progetto creato per eseguire i test.

Ho un project on Github che esegue questa operazione se è necessario vedere un esempio operativo completo.

+0

grazie, questo è quello che stavo cercando – amigo421

+0

ma c'è uno script per aggiungere automaticamente i test ctest? – amigo421

+0

Solo se ne scrivi uno. Come dovrebbe CMake sapere quali dei tuoi eseguibili sono i test? – ComicSansMS

2

EDIT2: in questi giorni Catch2 installa il proprio modulo di CMake così, dopo l'installazione, può essere utilizzato in un altro progetto CMake con

include(GNUInstallDirs) 
find_package(Catch2 REQUIRED) 

È possibile rendere il vostro progetto CMake dipendono Cattura utilizzando find_package. In questo modo non includi Catch e puoi aggiornarlo indipendentemente. Il processo è spiegato in this recipe, tranne che in questo caso non è necessario gestire le librerie, poiché Catch è solo intestazione.

CMakeLists.txt (ammesso che abbiate il vostro FindCatch.cmake in atto [vedi sotto] e le vostre prove in my_tests.cpp):

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/") 
find_package(Catch REQUIRED) 

include_directories(${CATCH_INCLUDE_DIRS}) 

add_executable(my_tests my_tests.cpp) 
add_test(NAME MyTests COMMAND my_tests) 

Un esempio my_tests.cpp:

#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() 
#include "catch/catch.hpp" 

#include "stuff_to_test.h" 

TEST_CASE("A test case") 
{ 
    ... 
} 

... 

Sarà necessario aggiungere un modulo FindCatch.cmake al progetto, sotto cmake/Modules. Cerca nel web FindCatch.cmake.

Infine, è possibile creare ed eseguire i test con make test.


EDIT: In alternativa, è possibile avere cmake scaricare Cattura da Git durante la costruzione, seguendo these instructions da github di Catch. Ciò richiede però una dipendenza da git.