Pertanyaan CMake & CTest: membuat tes tidak membuat tes


Saya mencoba CTest di CMake agar dapat menjalankan beberapa pengujian saya secara otomatis make test target. Masalahnya adalah CMake tidak "memahami" bahwa tes yang ingin saya jalankan harus dibangun karena ini adalah bagian dari proyek.

Jadi saya mencari cara untuk secara eksplisit menentukan ketergantungan ini.


76
2018-04-09 09:22


asal


Jawaban:


ini bisa dibilang Sebuah bug di CMake (sebelumnya dilacak sini) bahwa ini tidak bekerja di luar kotak. Sebuah solusi adalah melakukan hal-hal berikut:

add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)

Maka Anda bisa berlari make check dan itu akan mengkompilasi dan menjalankan tes. Jika Anda memiliki beberapa tes, maka Anda harus menggunakannya DEPENDS exe1 exe2 exe3 ... di baris di atas.


58
2018-04-10 05:57



Sebenarnya ada cara untuk menggunakannya make test. Anda perlu menentukan build dari tes yang dapat dieksekusi sebagai salah satu tes dan kemudian menambahkan dependensi di antara tes. Itu adalah:

ADD_TEST(ctest_build_test_code
         "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES(ctest_run_test_code
                     PROPERTIES DEPENDS ctest_build_test_code)

43
2018-05-30 21:32



Saya menggunakan varian jawaban richq. Di tingkat atas CMakeLists.txt, Saya menambahkan target khusus, build_and_test, untuk membuat dan menjalankan semua tes:

find_package(GTest)
if (GTEST_FOUND)
    enable_testing()
    add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
    add_subdirectory(test)
endif()

Di berbagai sub-proyek CMakeLists.txt file di bawah test/, Saya menambahkan setiap tes yang dapat dieksekusi sebagai ketergantungan build_and_test:

include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)

Dengan pendekatan ini, saya hanya perlu make build_and_test dari pada make test (atau make all test), dan itu memiliki keuntungan hanya membangun kode tes (dan dependensinya). Sayang saya tidak bisa menggunakan nama target test. Dalam kasus saya, itu tidak terlalu buruk karena saya memiliki skrip tingkat atas yang melakukan debug dan rilis keluar-dari-pohon (dan cross-compiled) dibangun dengan menelepon cmake lalu make, dan itu diterjemahkan test ke build_and_test.

Tentunya, hal-hal GTest tidak diperlukan. Saya kebetulan menggunakan / seperti Google Test, dan ingin berbagi contoh lengkap untuk menggunakannya dengan CMake / CTest. IMHO, pendekatan ini juga memiliki manfaat yang memungkinkan saya untuk menggunakannya ctest -V, yang menunjukkan hasil Uji Google saat tes dijalankan:

1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN      ] proj1.dummy
1: [       OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [  PASSED  ] 1 test.
1/2 Test #1: proj1_test .......................   Passed    0.03 sec

11
2018-02-25 05:53



Jika Anda mencoba meniru make check, Anda mungkin menemukan entri wiki ini berguna:

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

Saya baru saja memeriksanya yaitu apa yang dikatakannya berhasil (CMake 2.8.10).


5
2018-03-12 16:08



Selamatkan diri Anda sakit kepala:

make all test

Bekerja di luar kotak untuk saya dan akan membangun dependensi sebelum menjalankan tes. Mengingat betapa sederhananya hal ini, hampir membuat penduduk asli make test fungsionalitas yang nyaman karena memberikan Anda pilihan untuk menjalankan tes kompilasi terakhir bahkan jika kode Anda rusak.


4
2018-04-04 08:48



Semua jawaban di atas sempurna. Tetapi sebenarnya CMake menggunakan CTest sebagai alat pengujiannya, jadi metode standar (menurut saya) untuk melakukan misi adalah:

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

Lalu lari cmake dan membuat untuk membangun target. Setelah itu, Anda bisa berlari buat tes, atau jalankan saja

ctest

Anda akan mendapatkan hasilnya. Ini diuji di bawah CMake 2.8.

Periksa detail di: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing


-2
2017-08-24 14:20



Semua jawaban itu bagus, tetapi itu menyiratkan pelanggaran tradisi untuk menjalankan tes demi perintah make test. Saya telah melakukan trik ini:

add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")

Ini berarti bahwa pengujian terdiri dari membangun (opsional) dan menjalankan target yang dapat dieksekusi.


-4
2018-05-20 13:25