2010-06-17 5 views
11

Ich baue einige Tests mit CTest. Normalerweise kann ich den Test, indem Sie einfach die Zeile ein:CTest mit mehreren Befehlen

ADD_TEST(Test_Name executable args) 

Allerdings habe ich auf ein Problem stoßen, ich habe einige Tests, die zwei Befehle benötigen, um zu laufen, damit es funktioniert, ist es Wie auch immer, ich kann zwei Programme innerhalb eines einzigen C-Tests ausführen, oder muss ich für jeden einen neuen Test erstellen?

Vielen Dank.

Antwort

14

Der Befehl add_test akzeptiert nur eine ausführbare Datei, aber Sie können jede ausführbare Datei ausführen, die wirklich ein Skript ist. Um dies plattformübergreifend zu tun, schreibe das Skript in CMake selbst. CMake verfügt über die -P Option zum Ausführen beliebiger Abschnitte der CMake-Skriptsprache, wenn Sie make oder make test statt zur Makefile-Generierungszeit ausführen.

Leider können Sie einem solchen Skript keine Argumente übergeben. Aber Sie können Variablen auf Werte setzen, was genauso gut ist.

Dieses Skript Sie runtests.cmake nennen kann, läuft er die Befehle CMD1 und CMD2 und prüft, die jeweils für einen Nicht-Null-Return-Code, aus CMake Rückkehr selbst mit einem Fehler, wenn das passiert:

macro(EXEC_CHECK CMD) 
    execute_process(COMMAND ${CMD} RESULT_VARIABLE CMD_RESULT) 
    if(CMD_RESULT) 
     message(FATAL_ERROR "Error running ${CMD}") 
    endif() 
endmacro() 
exec_check(${CMD1}) 
exec_check(${CMD2}) 

.. . und dann Testfälle wie so hinzufügen:

add_executable(test1 test1.c) 
add_executable(test2 test2.c) 
add_test(NAME test 
    COMMAND ${CMAKE_COMMAND} 
      -DCMD1=$<TARGET_FILE:test1> 
      -DCMD2=$<TARGET_FILE:test2> 
    -P ${CMAKE_CURRENT_SOURCE_DIR}/runtests.cmake) 

$<TARGET_FILE:test1> auf den vollständigen Pfad zu der ausführbaren Datei zur Build-Datei Generation Zeit erweitert wird. Wenn Sie make test oder gleichwertig ausführen, wird "cmake -P rottests.cmake" ausgeführt, und die CMD1- und CMD2-Variablen werden auf die entsprechenden Testprogramme gesetzt. Das Skript führt dann Ihre 2 Programme nacheinander aus. Wenn eines der Testprogramme fehlschlägt, schlägt der gesamte Test fehl. Wenn Sie die Ausgabe des Tests sehen müssen, können Sie make test ARGS=-V

+0

Hmm ... das sieht gut aus, obwohl ich das Skript während der Testzeit ausgeführt werden muss, nicht bauen Zeit oder makefile Generierungszeit. –

+0

Oh, mit "Build-Zeit" meinte ich, wenn Sie irgendeinen 'make'-Befehl ausführen, einschließlich' make test'. Im Gegensatz dazu, wenn Sie 'cmake' ausführen, um die Makefiles zu generieren. Das habe ich jetzt in der Antwort geklärt. – richq