سؤال

أحاول 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>>")

هذا يعني أن الاختبار يتكون من مبنى (اختياريا) وإدارة الهدف القابل للتنفيذ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top