ฉันใช้ตัวแปรของคำตอบของ richq ในระดับบนสุดCMakeLists.txt
ฉันเพิ่มเป้าหมายที่กำหนดเองbuild_and_test
เพื่อสร้างและเรียกใช้การทดสอบทั้งหมด:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
ในCMakeLists.txt
ไฟล์โปรเจ็กต์ย่อยต่างๆภายใต้test/
ฉันเพิ่มการทดสอบปฏิบัติการแต่ละครั้งโดยอ้างอิงจาก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)
ด้วยวิธีนี้ฉันต้องทำ make build_and_test
แทนที่จะเป็นmake test
(หรือmake all test
) และมีประโยชน์ในการสร้างรหัสทดสอบเท่านั้น (และการอ้างอิง) น่าเสียดายที่ไม่สามารถใช้ชื่อเป้าหมายtest
ได้ ในกรณีของฉันมันไม่ได้เลวร้ายนักเพราะฉันมีสคริปต์ระดับบนสุดที่ทำการดีบักและรีลีสแบบไม่ใช้ต้นไม้ (และคอมไพล์ข้าม) สร้างโดยการโทรcmake
จากนั้นmake
และแปลtest
เป็นbuild_and_test
ไฟล์.
เห็นได้ชัดว่าสิ่งที่ GTest ไม่จำเป็นต้องใช้ ฉันเพิ่งใช้ / ชอบ Google Test และต้องการแบ่งปันตัวอย่างที่สมบูรณ์ของการใช้งานกับ CMake / CTest IMHO วิธีนี้ยังมีประโยชน์ในการอนุญาตให้ฉันใช้ctest -V
ซึ่งจะแสดงผลลัพธ์การทดสอบของ Google ในขณะที่การทดสอบทำงาน:
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