সিএমেক ও সিটিস্ট: পরীক্ষা করুন পরীক্ষা তৈরি করে না


91

make testলক্ষ্য ব্যবহার করে আমার কয়েকটি পরীক্ষা স্বয়ংক্রিয়ভাবে চালানোর জন্য আমি সিএমকেটে সিটিস্টেস্ট চেষ্টা করছি । সমস্যাটি হ'ল সিএমকে "বুঝতে" পারছেন না যে আমি যে পরীক্ষাটি চালাতে চাইছি তা নির্মাণ করা উচিত কারণ এটি প্রকল্পের অংশ।

সুতরাং আমি এই নির্ভরতা স্পষ্টভাবে নির্দিষ্ট করার জন্য একটি উপায় খুঁজছি।

উত্তর:


81

এটা তর্কসাপেক্ষে একটি CMake মধ্যে বাগ (আগের ট্র্যাক এখানে ) যে এই বাক্সের বাইরে কাজ করে না। একটি কার্যপ্রণালী নিম্নলিখিত করা হয়:

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

তারপরে আপনি চালাতে পারবেন make checkএবং এটি পরীক্ষাটি সংকলন ও চালনা করবে। আপনার যদি বেশ কয়েকটি পরীক্ষা করে থাকে তবে আপনাকে DEPENDS exe1 exe2 exe3 ...উপরের লাইনে ব্যবহার করতে হবে ।


4
সুতরাং আমি অনুমান করি যে "পরীক্ষা তৈরি করুন" টার্গেটটি অব্যবহৃত থাকবে কারণ মনে হয় আপনাকে একটি আলাদা টার্গেটের নামটি বেছে নিতে হবে add_custom_target কমান্ডে?
ক্লফ

হ্যাঁ "টেস্ট তৈরি করুন" এবং "চেক তৈরি করুন" এর মধ্যে কেবলমাত্র পার্থক্য হ'ল প্রথম শো "চালানো পরীক্ষা ..." প্রথম শো এবং কোনও বিল্ড নির্ভরতা পরীক্ষা করে না।
richq

4
@ আরকিউ - তবে আমি কীভাবে একাধিক প্রকল্পের সাথে এটি করতে পারি (যখন একটি সিএমকেলিস্ট.টিএসটি অন্যের উপ-প্রকল্প হয়) যাতে প্রত্যেকে checkলক্ষ্য নির্ধারণ করে এবং তারা সংঘর্ষে লিপ্ত হতে পারে
আরটিয়াম

4
@ আর্টিয়াম - সেক্ষেত্রে আপনি সম্ভবত "সমস্ত পরীক্ষা করুন" এর সমতুল্য ব্যবহার করা আরও ভাল। আসলে, আমি যাইহোক এই কি।
সমৃদ্ধ

4
প্রকৃতপক্ষে, কেউ কেউ এটিকে চিত্তবিন্যাসের একটি বৈশিষ্ট্য (কোনও বাগ নয়) হিসাবে বিবেচনা করে যা আপনি "পরীক্ষা তৈরি করুন" চালাতে পারেন এবং টেস্টগুলি চালাতে পারেন কারণ তারা কোনও পুনর্নির্মাণ না করে প্রথমে ...
ডিএলআরডেভ

55

আসলে ব্যবহারের একটি উপায় আছে 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
এটিই কেবলমাত্র স্কেল করে এবং পরীক্ষা চালানোর জন্য আপনাকে "সমস্ত তৈরি করুন" লক্ষ্যগুলি তৈরি করতে বাধ্য করে না। একটি সম্ভাব্য খারাপ দিক: বাইনারিগুলির উপর নির্মাণের ত্রুটির বিবরণ কেবল উত্পন্ন শেষের টেস্ট.লগ ফাইলে প্রদর্শিত হবে এবং স্টাডআউট / স্টার্ডারে নয়
ডেভ আব্রাহামস

4
ভাল উত্তর! যদিও আপনার বিল্ড টার্গেটে কনফিগারেশন যুক্ত করা উচিত। অন্যথায় সমস্ত কনফিগারেশনে পরীক্ষা চালানো সম্ভব নয়। add_test (NAME "$ {ARGV0} _BUILD" COMMAND "{{CMAKE_COMMAND}" - বিল্ড $ {CMAKE_BINARY_DIR} --তারেট $ {লক্ষ্য} "--config" "$ <CONFIG>")
ড্যানিয়েল

4
এটি পরীক্ষার প্রতিবেদককে একগুচ্ছ নোংরা পরীক্ষার সাহায্যে আটকে রাখে।

আপনি যদি সিএমকে> = 3.7 ব্যবহার করেন তবে প্রস্তাবিত পদ্ধতির ফিক্সচার ব্যবহার করা। দেখুন আমার উত্তর নিচে।
জন ফ্রিম্যান

13

আমি রিচকের উত্তরের বৈকল্পিক ব্যবহার করি। শীর্ষ-স্তরে 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 testmake all testtestcmakemaketestbuild_and_test

স্পষ্টতই, জিস্টেস্ট স্টাফগুলির প্রয়োজন নেই। আমি গুগল টেস্টের মতো / ব্যবহার করার মতোই হয়েছি এবং সিএমকে / সিটেষ্টের সাথে এটি ব্যবহারের একটি সম্পূর্ণ উদাহরণ ভাগ করতে চেয়েছি। আইএমএইচও, এই পদ্ধতির আমাকে ব্যবহার করার অনুমতি দেওয়ার সুবিধাও রয়েছে ctest -V, যা পরীক্ষাগুলি চলাকালীন গুগল টেস্ট আউটপুট দেখায়:

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

এই উদাহরণে, টেস্টের পরিবর্তে টেস্টের পরিবর্তে টেস্ট করার কী কী উপায় রয়েছে? ক্রেস্ট আউটপুটটি খুব অসম্পূর্ণ দেখায় এবং কেবল বলে যে এখানে একটি পরীক্ষা রয়েছে।
রাজীব

6

আপনি যদি অনুকরণ করার চেষ্টা করছেন make check, আপনি এই উইকি এন্ট্রি দরকারী পুরোপুরি দেখতে পাবেন:

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

আমি এটি যাচাই করেছি যা এটি সাফল্যের সাথে যা বলেছে তা করে (সিএমকে ২.৮.১০)।


4
এটি চলমান অবস্থায় সমস্ত নির্বাহযোগ্য তৈরি করবে make check। প্রভাবশালী সংকলনের সময়ে পরীক্ষার জন্য, এটি ctest -Rঅকেজো করে তোলে ।
usr1234567

4

নিজেকে মাথা ব্যথা বাঁচাও:

make all test

আমার জন্য বাক্সের বাইরে কাজ করে এবং পরীক্ষা চালানোর আগে নির্ভরতা তৈরি করে। এটি কতটা সহজ, এটি দেওয়া প্রায়ক্ষেত্রে দেশীয় make testকার্যকারিতাটি সুবিধাজনক করে তোলে কারণ এটি আপনাকে কোড বিচ্ছিন্ন হয়ে গেলেও শেষ সংকলন পরীক্ষা চালানোর বিকল্প দেয়।


4
সিডিএশ নিয়ে কাজ করে না। আপনাকে সমস্ত মেক অ্যান্ড অ্যান্ড কেষ্টকে কল করতে হবে এবং তারপরে বিল্ডিং আপলোড করা পরীক্ষার অংশ নয়। সুতরাং বিল্ড সতর্কতা বা ত্রুটিগুলি দৃশ্যমান নয়।
usr1234567

4
সমান্তরাল বিল্ড চাইলে এছাড়াও ভাল কাজ করে না, যেহেতু দুটি সমান্তরালে চলবে: আপনার প্রয়োজন make -j4 all && make test। এবং এটি একটি নন-মেক বিল্ড সরঞ্জাম ব্যবহার করে ফ্ল্যাশ।
পুলি

4

আপনি যদি সিএমকে> = 3.7 ব্যবহার করছেন তবে প্রস্তাবিত পদ্ধতিরটি ফিক্সচারগুলি ব্যবহার করা :

add_executable(test test.cpp)
add_test(test_build
  "${CMAKE_COMMAND}"
  --build "${CMAKE_BINARY_DIR}"
  --config "$<CONFIG>"
  --target test
)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP    test_fixture)
add_test(test test)
set_tests_properties(test       PROPERTIES FIXTURES_REQUIRED test_fixture)

এটি নিম্নলিখিতগুলি করে:

  • এর testথেকে নির্মিত একটি নির্বাহযোগ্য লক্ষ্য যুক্ত করেtest.cpp
  • একটি test_build"পরীক্ষা" যুক্ত করে যা লক্ষ্য তৈরি করতে কুমেক চালায়test
  • মার্কস test_buildপরীক্ষা চোকান একটি সেটআপ টাস্ক হতেtest_fixture
  • একটি testপরীক্ষা যোগ করুন যা কেবলমাত্র testএক্সিকিউটেবল চালায়
  • দৃ testxture়তা প্রয়োজন পরীক্ষা চিহ্নিত test_fixture

সুতরাং, প্রতিবার পরীক্ষা testচালাতে হয়, এটি প্রথমে পরীক্ষা চালায় test_buildযা প্রয়োজনীয় নির্বাহযোগ্য করে তোলে।


যদি $<CONFIG>সেট না করা থাকে তবে এর --targetজন্য যুক্তি হয়ে যাবে --config
লোশাদ ভিটপকাঃ

আমি বিশ্বাস করি $<CONFIG>সর্বদা শূন্য নয়। এটি কনফিগারেশনের নামের জন্য একটি জেনারেটর এক্সপ্রেশন: cmake.org/cmake/help/latest/manual/… আমি কোনওভাবেই কোনও পার্থক্য না করার কারণে এটিকে উদ্ধৃতিতে মোড়ানো উত্তরটি সম্পাদনা করব।
জন ফ্রিম্যান

আপনি কিভাবে চালায় cmake? আমি এই ভাবে করুন: mkdir build; cd build; cmake ..; make। এবং দেখে মনে হচ্ছে কোনও ডিফল্ট নেই এবং সমস্ত সম্পর্কিত ভেরিয়েবলগুলি CMAKE_BUILD_TYPEম্যানুয়ালি সেট না করা অবধি খালি রয়েছে । (বর্তমানে
দেবিয়ান

1

এটিই আমি হাতছাড়া করেছিলাম এবং ব্যবহার করে যাচ্ছি:

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")

ওয়াইএমএমভি


0

ডেরিকের উত্তর, সরল ও মন্তব্য করা হয়েছে:

# It is impossible to make target "test" depend on "all":
# https://gitlab.kitware.com/cmake/cmake/-/issues/8774
# Set a magic variable in a magic file that tells ctest
# to invoke the generator once before running the tests:
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake"
    "set(CTEST_CUSTOM_PRE_TEST ${CMAKE_MAKE_PROGRAM})\n"
)

এটি পুরোপুরি সঠিক নয়, যেহেতু এটি চলমান একযোগে সমস্যা সমাধান করে না ninja all test, যদি কেউ তা করে। বিপরীতে, কারণ এখন, আপনার দুটি নিনজা প্রক্রিয়া রয়েছে।

(এফটিআর, আমি এই সমাধানটি এখানেও ভাগ করে নিয়েছি ))


-3

উপরের সমস্ত উত্তর নির্ভুল। তবে আসলে সিএমকে সিটিস্টকে এর পরীক্ষার সরঞ্জাম হিসাবে ব্যবহার করে, সুতরাং মিশনটি করার জন্য আদর্শ পদ্ধতি (আমার মনে হয় এটি):

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

তারপরে cmake চালান এবং লক্ষ্যগুলি তৈরি করতে তৈরি করুন। এর পরে, আপনি হয় মেক টেস্ট চালাতে পারেন , বা কেবল চালাতে পারেন

ctest

আপনি ফলাফল পাবেন। এটি সিএমকে ২.৮ এর অধীনে পরীক্ষা করা হয়।

এখানে বিশদটি পরীক্ষা করুন: http://cmake.org/Wiki/CMake/Testing_With_CTest# সিম্পল_স্টেস্টিং


4
ডাউনভোটেড কারণ কখনও কখনও আপনি কেবল পরীক্ষাগুলি চালানোর জন্য প্রয়োজনীয় লক্ষ্যগুলি তৈরি করতে চান।
ডেভ আব্রাহামস

12
এই উত্তরটি প্রশ্ন ভুল বুঝা বলে মনে হয়: ওপি ইতিমধ্যে ঠিক করছে হিসাবে এই উত্তর বিশেষ পরামর্শ দেওয়া হচ্ছে: ব্যবহার CTest, enable_testing(), add_test(), ইত্যাদি সমস্যা তিনি নিজে বিল্ড কমান্ড পরীক্ষাগুলি চালানোর পূর্বে জারি করার রয়েছে। তিনি make testপ্রয়োজনীয় হিসাবে টেস্ট এক্সিকিউটেবলগুলি স্বয়ংক্রিয়ভাবে তৈরি করার লক্ষ্যটি চান ।
bames53

-4

সমস্ত উত্তরগুলি ভাল, তবে তারা আদেশ দিয়ে একটি পরীক্ষা চালানোর জন্য traditionতিহ্য লঙ্ঘন করে make test। আমি এই কৌশলটি করেছি:

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

এর অর্থ হল পরীক্ষার মধ্যে বিল্ডিং (allyচ্ছিকভাবে) এবং এক্সিকিউটেবল টার্গেট চালানো থাকে।


6
:-D বিধি # 1: sh ছাড়া সিস্টেম ব্যবহার করবেন না। আপনি কি এমন সিস্টেম জানেন?
ডায়মাস

11
হ্যাঁ, উইন্ডোজ এর মধ্যে একটি।
ডেভিড ফিউয়ার

4
makeএটিতে হার্ডকোডও রয়েছে এবং সিএমকেকের অন্যান্য বিল্ড সরঞ্জামগুলির জন্য স্ক্রিপ্ট উত্পন্ন করার বৈশিষ্ট্যটি হারিয়েছে।
পুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.