2009-04-09 23 views
69

मैं make test लक्ष्य का उपयोग करके अपने कुछ परीक्षण स्वचालित रूप से चलाने के लिए सीएमके में सीटीएस्ट की कोशिश कर रहा हूं। समस्या यह है कि सीएमके "समझ में नहीं आता है कि जिस परीक्षण को मैं चलाने के इच्छुक हूं उसे बनाया जाना है क्योंकि यह परियोजना का हिस्सा है।सीएमके और सीटीएस्ट: परीक्षण परीक्षण नहीं करता

तो मैं स्पष्ट रूप से इस निर्भरता को निर्दिष्ट करने का एक तरीका ढूंढ रहा हूं।

उत्तर

54

यह है यकीननbug in CMake (पहले here ट्रैक किया गया) है कि इस बॉक्स से बाहर काम नहीं करता है एक।

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

तो फिर तुम make check चला सकते हैं और यह संकलन और परीक्षण चलेंगे: एक वैकल्पिक हल निम्न करने के लिए है। यदि आपके पास कई परीक्षण हैं, तो आपको उपर्युक्त पंक्ति में DEPENDS exe1 exe2 exe3 ... का उपयोग करना होगा।

+0

सही उत्तर, धन्यवाद :) – claf

+1

तो मुझे लगता है कि "परीक्षण करें" लक्ष्य अप्रयुक्त रहेगा क्योंकि ऐसा लगता है कि आपको add_custom_target कमांड में एक अलग लक्ष्य नाम चुनना है? – claf

+0

हां। "मेक टेस्ट" और "मेक चेक" के बीच एकमात्र अंतर पहले शो "रनिंग टेस्ट ..." है और किसी भी बिल्ड निर्भरता की जांच नहीं करता है। – richq

39

वास्तव में 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) 
+11

यह एकमात्र ऐसा है जो स्केल करता है और परीक्षण को चलाने के लिए आपको "सभी को" लक्ष्य बनाने के लिए मजबूर नहीं करता है। एक संभावित नकारात्मक पक्ष: द्विआधारी पर बिल्ड त्रुटियों का विवरण केवल उत्पन्न LastTest.log फ़ाइल में दिखाई देता है, न कि stdout/stderr –

+1

पर अच्छा जवाब! हालांकि आपको निर्माण लक्ष्य में कॉन्फ़िगरेशन जोड़ना चाहिए। अन्यथा सभी विन्यास में परीक्षण चलाने के लिए संभव नहीं है। add_test ( नाम "$ {ARGV0} _BUILD" COMMAND "$ {CMAKE_COMMAND}" --build $ {CMAKE_BINARY_DIR} --target $ {target} "--config" "$ " ) – Daniel

+0

यह मोज़री फोनी टेस्ट के गुच्छा के साथ टेस्ट रिपोर्टर। – Barry

-2

सभी उपरोक्त उत्तरों सही हैं। लेकिन असल में CMake तो मानक विधि (मुझे लगता है कि यह है) मिशन है क्या करने के लिए अपने परीक्षण उपकरण के रूप में CTest उपयोग करते हैं,:

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

फिर cmake चलाने और बनाने के लक्ष्य का निर्माण। उसके बाद, आप या तो मेकअप परीक्षण चला सकते हैं, या बस चलाने

ctest 

आप परिणाम मिल जाएगा। यह सीएमके 2.8 के तहत परीक्षण किया जाता है।

चेक विवरण पर: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

+0

यह सही जवाब है! – jopasserat

+5

डाउनवॉटेड क्योंकि कभी-कभी आप केवल परीक्षणों के लिए आवश्यक लक्ष्यों को बनाना चाहते हैं। –

+11

यह उत्तर प्रश्न को गलत समझता प्रतीत होता है: ओपी पहले से ही ऐसा कर रहा है क्योंकि यह उत्तर अनुशंसा करता है: सीटीएस्ट का उपयोग करके, 'enable_testing() ',' add_test() 'आदि। समस्या यह है कि उसे मैन्युअल रूप से बिल्ड कमांड जारी करना होगा परीक्षण चलाने के लिए।वह आवश्यक रूप से परीक्षण निष्पादन योग्य बनाने के लिए 'परीक्षण करें' लक्ष्य चाहता है। – bames53

12

मैं richq के जवाब का एक संस्करण का उपयोग करें। विभिन्न उप परियोजना में CMakeLists.txt फ़ाइलों test/ तहत

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

, मैं build_and_test की निर्भरता के रूप में प्रत्येक परीक्षा निष्पादन जोड़ें: उच्च-स्तरीय CMakeLists.txt में, मैं एक कस्टम लक्ष्य, 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 में अनुवाद करता है।

जाहिर है, जीटीएस्ट सामान की आवश्यकता नहीं है। मैं बस 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 
+0

इस उदाहरण में, सीटीएस्ट के बजाय सीटीएस्ट-वी क्या करने के लिए परीक्षण करने का कोई तरीका है? सीटीएस्ट आउटपुट बहुत अपूर्ण दिखता है और बस कहता है कि एक भी परीक्षण है। – Rajiv

5

आप make check का अनुकरण करने की कोशिश कर रहे हैं, तो आप इस विकि प्रविष्टि उपयोगी मिल सकता है:: IMHO, इस दृष्टिकोण भी है, जबकि परीक्षण चलाने मुझे ctest -V, जो गूगल टेस्ट उत्पादन से पता चलता उपयोग करने की अनुमति को लाभ मिलता है

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

मैं सिर्फ जांच कर लेंगे कि क्या यह सफलता के साथ कहते हैं करता है (CMake 2.8.10)।

+1

यह 'चेक करें' चलाने पर सभी निष्पादन योग्य बनाएगा। हावी संकलन के समय के परीक्षण के लिए, यह 'ctest -R' बेकार बनाता है। – usr1234567

-3

सभी उत्तरों अच्छे हैं, लेकिन वे make test द्वारा एक परीक्षण चलाने के लिए परंपरा का उल्लंघन करते हैं।

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

इसका मतलब है कि परीक्षण इमारत (वैकल्पिक) और निष्पादन योग्य लक्ष्य के संचालन के होते हैं: मैं इस चाल किया है।

+14

नियम # 1: cmake में खोल कोड का उपयोग न करें :-) – Igor

+5

:-D नियम # 1: बिना सिस्टम के सिस्टम का उपयोग न करें। क्या आप इस तरह के सिस्टम को जानते हैं? – dyomas

+10

हां, विंडोज इनमें से एक है। –

3

खुद को बचाने सिरदर्द:

make all test 

मेरे लिए बॉक्स से बाहर काम करता है और परीक्षण चलाने से पहले निर्भरता का निर्माण होगा। यह देखते हुए कि यह कितना आसान है, यह लगभग देशी make test कार्यक्षमता को सुविधाजनक बनाता है क्योंकि यह आपको अंतिम संकलन परीक्षण चलाने का विकल्प देता है भले ही आपका कोड टूटा हुआ हो।

+1

सीडीएएस के साथ काम नहीं करता है। आपको सभी && ctest को कॉल करना होगा और फिर इमारत अपलोड किए गए परीक्षण का हिस्सा नहीं है। इसलिए चेतावनियां बनाएं या त्रुटियां दिखाई नहीं दे रही हैं। – usr1234567

+2

यदि आप समानांतर निर्माण चाहते हैं तो भी अच्छी तरह से काम नहीं करता है, क्योंकि दोनों समानांतर में चलेंगे: आपको 'make -j4 all && test' की आवश्यकता है। और यह गैर-मेक बिल्ड टूल का उपयोग करके भी flaky है। – poolie