cmake & ctest: جعل الاختبار لا يبني الاختبارات
-
06-09-2019 - |
سؤال
أحاول CTEST في CMAKE من أجل تشغيل بعض الاختبارات الخاصة بي تلقائيا باستخدام make test
استهداف. المشكلة هي cmake لا "فهم" أن الاختبار الذي ترغب في تشغيله يجب أن يتم بناؤه لأنه جزء من المشروع.
لذلك أنا أبحث عن وسيلة لتحديد هذا التبعية صراحة.
المحلول
أنه يمكن القول أ علة في cmake. (تعقب سابقا هنا) أن هذا لا يعمل خارج الصندوق. الحل هو القيام بما يلي:
add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
DEPENDS ExeName)
ثم يمكنك تشغيل make check
وسوف تجميع وتشغيل الاختبار. إذا كان لديك العديد من الاختبارات، فسيتعين عليك استخدامها DEPENDS exe1 exe2 exe3 ...
في الخط أعلاه.
نصائح أخرى
هناك في الواقع طريقة للاستخدام make test
. وبعد تحتاج إلى تحديد بناء اختبار قابل للتنفيذ كواحدة من الاختبارات ثم إضافة تبعيات بين الاختبارات. إنه:
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)
يمكنني استخدام تبديل إجابة ريتش. في المستوى الأعلى 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، وأراد مشاركة مثال كامل لاستخدامه مع 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
إذا كنت تحاول محاكاة make check
, ، قد تجد هذا إدخال Wiki مفيد:
http://www.cmake.org/wiki/cmakeemulatemakecheck.
لقد فحصت للتو هذا هو ما يقوله النجاح (CMAKE 2.8.10).
أنقذ نفسك الصداع:
make all test
يعمل خارج الصندوق بالنسبة لي وسوف نبني التبعيات قبل تشغيل الاختبار. بالنظر إلى مدى بسيطة هذا، فإنه يكاد يجعل الأم make test
تعمل الوظيفة مريحة لأنها تمنحك خيار تشغيل اختبارات تجميع الأخيرة حتى إذا تم كسر التعليمات البرمجية الخاصة بك.
هذا هو ما وضعت به واستخدام:
set(${PROJECT_NAME}_TESTS a b c)
enable_testing()
add_custom_target(all_tests)
foreach(test ${${PROJECT_NAME}_TESTS})
add_executable(${test} EXCLUDE_FROM_ALL ${test}.cc)
add_test(NAME ${test} COMMAND $<TARGET_FILE:${test}>)
add_dependencies(all_tests ${test})
endforeach(test)
build_command(CTEST_CUSTOM_PRE_TEST TARGET all_tests)
string(CONFIGURE \"@CTEST_CUSTOM_PRE_TEST@\" CTEST_CUSTOM_PRE_TEST_QUOTED ESCAPE_QUOTES)
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake" "set(CTEST_CUSTOM_PRE_TEST ${CTEST_CUSTOM_PRE_TEST_QUOTED})" "\n")
ymmv.
إذا كنت تستخدم Cmake> = 3.7، فإن النهج الموصى به هو استخدامه تركيبات:
add_executable(test test.cpp)
add_test(test_build
"${CMAKE_COMMAND}"
--build "${CMAKE_BINARY_DIR}"
--config $<CONFIG>
--target test
)
add_test(test test)
set_tests_properties(test PROPERTIES FIXTURES_REQUIRED test_fixture)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP test_fixture)
جميع الإجابات المذكورة أعلاه مثالية. ولكن في الواقع استخدام cmake ctest كأدوات اختبار لها، لذلك الطريقة القياسية (أعتقد أنه) للقيام المهمة هي:
enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)
ثم اركض cmake. و صنع لبناء الأهداف. بعد ذلك، يمكنك إما تشغيل جعل اختبار, ، أو تشغيل فقط
ctest
سوف تحصل على النتيجة. يتم اختبار هذا تحت CMAKE 2.8.
التحقق من التفاصيل في: http://cmake.org/wiki/cmake/testing_with_ctest#simple_testing.
جميع الإجابات جيدة، لكنها تعني انتهاك للتقليد لتشغيل اختبار من قبل القيادة make test
. وبعد لقد فعلت هذه الخدعة:
add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")
هذا يعني أن الاختبار يتكون من مبنى (اختياريا) وإدارة الهدف القابل للتنفيذ.