Próbuję CTest w CMake, aby automatycznie uruchamiać niektóre z moich testów przy użyciu make test
celu. Problem polega na tym, że CMake nie „rozumie”, że test, który chcę uruchomić, musi zostać zbudowany, ponieważ jest częścią projektu.
Dlatego szukam sposobu na jawne określenie tej zależności.
dependencies
cmake
ctest
claf
źródło
źródło
check
cel i mogą się zderzyćWłaściwie jest sposób na użycie
make test
. Musisz zdefiniować kompilację pliku wykonywalnego testu jako jeden z testów, a następnie dodać zależności między testami. To jest:źródło
Używam wariantu odpowiedzi Richqa. Na najwyższym poziomie
CMakeLists.txt
dodaję cel niestandardowybuild_and_test
do tworzenia i uruchamiania wszystkich testów:W różnych
CMakeLists.txt
plikach podprojektów poniżejtest/
dodaję każdy plik wykonywalny testu jako zależnośćbuild_and_test
:Przy takim podejściu po prostu muszę
make build_and_test
zamiastmake test
(lubmake all test
), a to ma tę zaletę, że buduje tylko kod testowy (i jego zależności). Szkoda, że nie mogę użyć nazwy docelowejtest
. W moim przypadku nie jest tak źle, ponieważ mam skrypt najwyższego poziomu, który wykonuje debugowanie poza drzewem i zwalnia (i kompiluje krzyżowo), wywołując,cmake
a następniemake
, i przekłada się totest
nabuild_and_test
.Oczywiście rzeczy GTest nie są wymagane. Po prostu używam / lubię Google Test i chciałem podzielić się pełnym przykładem użycia go z CMake / CTest. IMHO, to podejście ma również tę zaletę, że pozwala mi używać
ctest -V
, które pokazuje wyniki testu Google podczas wykonywania testów:źródło
Jeśli próbujesz emulować
make check
, ten wpis wiki może okazać się przydatny:http://www.cmake.org/Wiki/CMakeEmulateMakeCheck
Właśnie sprawdziłem, że robi to, co mówi, z sukcesem (CMake 2.8.10).
źródło
make check
. W przypadku testów z dominującymi czasami kompilacji jest toctest -R
bezużyteczne.Oszczędź sobie bólu głowy:
U mnie działa po wyjęciu z pudełka i przed uruchomieniem testu zbuduje zależności. Biorąc pod uwagę, jak proste jest to, prawie sprawia, że natywna
make test
funkcjonalność jest wygodna, ponieważ daje możliwość uruchomienia ostatnich testów kompilacji, nawet jeśli twój kod jest uszkodzony.źródło
make -j4 all && make test
. Działa też niestabilnie przy użyciu narzędzia do kompilacji innego niż Make.Jeśli używasz CMake> = 3.7, zalecanym podejściem jest użycie urządzeń :
Robi to w następujący sposób:
test
wykonywalny cel zbudowany ztest.cpp
test_build
„test”, który uruchamia Cmake, aby zbudować celtest
test_build
test jako zadanie konfiguracyjne urządzeniatest_fixture
test
test, który po prostu uruchamiatest
plik wykonywalnytest
test jako wymagający zamocowaniatest_fixture
.Tak więc za każdym razem, gdy test
test
ma być uruchomiony, najpierw uruchamia testtest_build
, który buduje niezbędny plik wykonywalny.źródło
$<CONFIG>
nie jest ustawiona,--target
stanie się argumentem dla--config
.$<CONFIG>
jest zawsze niepusty. Jest to wyrażenie generatora dla nazwy konfiguracji: cmake.org/cmake/help/latest/manual/… I tak zmodyfikuję odpowiedź, aby umieścić ją w cudzysłowie, tylko dlatego, że nie ma to znaczenia.cmake
? Zrobić w ten sposób:mkdir build; cd build; cmake ..; make
. Wygląda na to, że nie ma żadnych wartości domyślnych, a wszystkie powiązane zmienne są puste, dopóki nieCMAKE_BUILD_TYPE
zostaną ustawione ręcznie. (obecnie na Debianie 10, innych platform nie sprawdzałem)Oto, co wymyśliłem i używałem:
YMMV
źródło
Odpowiedź Derricka, uproszczona i skomentowana:
Nie jest to całkowicie poprawne, ponieważ nie rozwiązuje problemu współbieżności uruchamiania
ninja all test
, na wypadek gdyby ktoś to zrobił. Wręcz przeciwnie, ponieważ teraz masz dwa procesy ninja.(Ftr, ja również wspólne rozwiązanie to tutaj .)
źródło
Wszystkie powyższe odpowiedzi są doskonałe. Ale tak naprawdę CMake używa CTest jako swoich narzędzi testowych, więc standardowa metoda (myślę, że tak) do wykonania misji to:
Następnie uruchom cmake i zrobić zbudować cele. Następnie możesz uruchomić make test lub po prostu uruchomić
otrzymasz wynik. Jest to testowane pod CMake 2.8.
Sprawdź szczegóły na: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing
źródło
enable_testing()
,add_test()
, itd. Problemem jest to, że musi ręcznie wydać polecenie build przed uruchomieniem testów. Chce, aby obiektmake test
docelowy automatycznie budował testowe pliki wykonywalne, jeśli to konieczne.Wszystkie odpowiedzi są dobre, ale sugerują naruszenie tradycji przeprowadzania testu na polecenie
make test
. Zrobiłem tę sztuczkę:Oznacza to, że test składa się z kompilacji (opcjonalnie) i uruchomienia wykonywalnego celu.
źródło
make
i traci funkcję CMake polegającą na generowaniu skryptów dla innych narzędzi do kompilacji.