সিএমকে: ইউনিট পরীক্ষার সাথে প্রকল্প কাঠামো


139

আমি উত্পাদনের উত্সগুলিকে ( srcসাবফোল্ডারটিতে) এবং পরীক্ষাগুলি (সাবফোল্ডারে) অন্তর্ভুক্ত করার জন্য আমার প্রকল্পের কাঠামোর চেষ্টা করছি test। আমি এটি তৈরিতে সিএমকে ব্যবহার করছি। সর্বনিম্ন উদাহরণ হিসাবে আমার কাছে নিম্নলিখিত ফাইলগুলি রয়েছে:

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8) 
project (TEST) 

add_subdirectory (src) 
add_subdirectory (test) 

src / CMakeLists.txt:

add_executable (demo main.cpp sqr.cpp) 

src / sqr.h

#ifndef SQR_H
#define SQR_H
double sqr(double);    
#endif // SQR_H

src / sqr.cpp

#include "sqr.h"
double sqr(double x) { return x*x; }

src / main.cpp - sqr ব্যবহার করে, আসলেই কিছু যায় আসে না

পরীক্ষা / CMakeLists.txt:

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)

include_directories (${TEST_SOURCE_DIR}/src) 

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp) 

target_link_libraries(test
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                      )

enable_testing()
add_test(MyTest test)

পরীক্ষা / test.cpp:

#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>

#include "sqr.h"

BOOST_AUTO_TEST_CASE(FailTest)
{
    BOOST_CHECK_EQUAL(5, sqr(2));
}

BOOST_AUTO_TEST_CASE(PassTest)
{
    BOOST_CHECK_EQUAL(4, sqr(2));
}

কিছু প্রশ্ন:

  1. এই কাঠামোটি কি কোনও অর্থবোধ করে? এই কোডটি কাঠামোগত করার সময় সেরা অনুশীলনগুলি কী কী? (আমি সি # এবং জাভা থেকে আসছি, এবং সেখানে এটি এক অর্থে আরও সহজ)
  2. আমি srcফোল্ডারের ফোল্ডার থেকে সমস্ত ফাইল তালিকাভুক্ত করতে হবে তা আমার পছন্দ নয় test/CMakeLists.txt। এটি যদি একটি লাইব্রেরি প্রকল্প হয় তবে আমি কেবল লাইব্রেরিটি লিঙ্ক করব। অন্য প্রকল্প থেকে সমস্ত সিপিপি ফাইল তালিকাবদ্ধকরণ এড়ানোর উপায় আছে?
  3. কি লাইন enable_testing()এবং add_test(MyTest test)করছেন? আমি কোন প্রভাব দেখিনি। আমি কীভাবে সিএমকে (বা সিস্টেস্ট) থেকে পরীক্ষা চালাতে পারি?
  4. এখন পর্যন্ত আমি কেবল cmake .মূল ফোল্ডারে দৌড়েছি , কিন্তু এটি সর্বত্র অস্থায়ী ফাইলগুলির সাথে বিশৃঙ্খলা তৈরি করেছে। আমি কীভাবে যুক্তিসঙ্গত কাঠামোর সংকলনের ফলাফল পেতে পারি?

আমি নিজেকে সিএমকে আভিজাত্য হিসাবে বিবেচনা করি, তাই আমি স্বীকৃত সেরা অনুশীলনগুলি কী তা জানি না, তবে এফডাব্লুআইডাব্লু আমি একটি "স্কয়ার" লাইব্রেরি তৈরি করতাম যা মূল এবং পরীক্ষা উভয়েরই উপর নির্ভর করে। (* বা এর নৈতিক সমতুল্য)
ব্যবহারকারীর 786653

উত্তর:


125

1 এবং 2 প্রশ্নের জন্য আমি আপনার মূল পরীক্ষার ফাইলগুলি মেইন সিপিপি (কেবলমাত্র এসসিআর / এসকিআরসিপি এবং এসসিআর / এসকিআর। H) বাদ দিয়ে একটি গ্রন্থাগার তৈরি করার পরামর্শ দিচ্ছি এবং তারপরে আপনি তালিকা এড়াতে পারবেন (এবং আরও গুরুত্বপূর্ণভাবে পুনরায় সংকলন) সমস্ত উত্স দুইবার।

প্রশ্ন 3 এর জন্য, এই আদেশগুলি "মাই টেস্ট" নামে একটি পরীক্ষা যুক্ত করে যা কোনও যুক্তি ছাড়াই আপনার এক্সিকিউটেবল "টেস্ট" কে ডাকে। তবে, যেহেতু আপনি এই আদেশগুলি / CMakeLists.txt পরীক্ষার জন্য যুক্ত করেছেন এবং আপনার শীর্ষ-স্তরের সিএমকেলিস্ট.টিএসটিএসটি নয়, আপনি কেবল আপনার বিল্ড ট্রি (পরীক্ষা cd test && ctest -N) এর "পরীক্ষা" উপ-ডিরেক্টরিতে পরীক্ষা শুরু করতে পারেন । আপনি যদি পরীক্ষাটি আপনার শীর্ষ-স্তরের বিল্ড ডিরেক্টরি add_testথেকে চালাতে চান তবে আপনাকে শীর্ষ স্তরের সিএমকেলিস্ট.টেক্সট থেকে কল করতে হবে । এর অর্থ হ'ল আপনাকে আরও ভার্বোজ ফর্মটি ব্যবহার করতে হবে add_testযেহেতু আপনার পরীক্ষার এক্সপি একই সিএমকেলিস্টস টেক্সটে সংজ্ঞায়িত করা হয়নি

আপনার ক্ষেত্রে, যেহেতু আপনি মূল ফোল্ডারে cmake চালাচ্ছেন, তাই আপনার বিল্ড ট্রি এবং আপনার উত্স গাছটি এক এবং একই। এটি ইন-সোর্স বিল্ড হিসাবে পরিচিত এবং আদর্শ নয়, যা প্রশ্ন 4 এর দিকে পরিচালিত করে।

বিল্ড ট্রি উৎপাদনের জন্য পছন্দের পদ্ধতিটি হ'ল একটি উত্স-বহির্ভূত বিল্ড করা, অর্থাত্ আপনার উত্স গাছের বাইরে কোথাও একটি ডিরেক্টরি তৈরি করা এবং সেখান থেকে চক্রটি কার্যকর করা। এমনকি আপনার প্রকল্পের মূলটিতে একটি "বিল্ড" ডিরেক্টরি তৈরি করা এবং সম্পাদন করা cmake ..একটি পরিষ্কার কাঠামো সরবরাহ করবে যা আপনার উত্স গাছের সাথে হস্তক্ষেপ করবে না।

একটি চূড়ান্ত বিষয় হ'ল এক্সিকিউটেবলকে "পরীক্ষা" (কেস-সংবেদনশীল) বলা এড়ানো। যে কারণে, এই উত্তরটি দেখুন

এই পরিবর্তনগুলি অর্জন করতে, আমি নিম্নলিখিতগুলি করব:

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src) 
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)


src / CMakeLists.txt:

add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)


পরীক্ষা / CMakeLists.txt:

find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
                     ${Boost_INCLUDE_DIRS}
                     )
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
                       Sqr
                       ${Boost_FILESYSTEM_LIBRARY}
                       ${Boost_SYSTEM_LIBRARY}
                       ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                       )

2
আমি কেবল লক্ষ্য করেছি যে আপনি সেই অনুসারে .h ফাইলগুলি CMakeLists.txt ফাইলগুলিতেও যুক্ত করেছেন। এটা কি প্রয়োজন? এবং আমি তাদের ছেড়ে চলে গেলে কী হবে?
গ্রাজনিও

3
@ গ্রাজেনিও এটি কেবল একটি সুবিধার বৈশিষ্ট্য - লক্ষ্যগুলির অংশ হিসাবে তারা আইডিই'র মতো এমএসভিসির মতো প্রদর্শিত হয়, তবে অন্যথায় এর কোনও প্রভাব নেই।
ফ্রেজার

1
TEST_SOURCE_DIR কোথায় সেট করা আছে?
অ্যাগসোল

6
কল করার সময় এটি স্বয়ংক্রিয়ভাবে সিএমকে দ্বারা সেট করা হয়েছে project (TEST)- cmake.org/cmake/help/v3.6/variable/PROJECT-NAME_SOURCE_DIR.html
ফ্রেজার

> তারা লক্ষ্যগুলির অংশ হিসাবে আইডিইর মতো এমএসভিসির মতো উপস্থিত হয় --- এমএসভিসি "অন্তর্ভুক্ত ডিরেক্টরি" হিসাবে শিরোনাম দিয়ে ডিরেক্টরি চিহ্নিত করতে সমর্থন করে না?
isnullxbh

46

আমি @ ফ্রেজারের উদাহরণটি পছন্দ করি তবে পরীক্ষায় / সিএমকেলিস্ট.টেক্সটে অ্যাড_টেস্ট কমান্ডটি ব্যবহার করব এবং অ্যাড_সুবডাইরেক্টরি (পরীক্ষা) এর আগে সক্ষম_টেষ্টিং ব্যবহার করব।

পরীক্ষার / সিএমকেলিস্ট.সেক্সটটিতে আপনার পরীক্ষাগুলি নির্দিষ্ট করার সময় আপনি শীর্ষ-স্তর বিল্ড ডিরেক্টরি থেকে আপনার পরীক্ষাগুলি চালাতে পারেন।

ফলাফলটি দেখতে এরকম হবে (আমি @ ফ্রেজারের উদাহরণটি পুনরায় ব্যবহার করেছি):

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)

enable_testing ()
add_subdirectory (test)

src / CMakeLists.txt

add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)

পরীক্ষা / CMakeLists.txt

find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
                     ${Boost_INCLUDE_DIRS}
                     )
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
                       Sqr
                       ${Boost_FILESYSTEM_LIBRARY}
                       ${Boost_SYSTEM_LIBRARY}
                       ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                       )
add_test (NAME MyTest COMMAND Test)

1
ধন্যবাদ, ctest -Nসাবডির যোগ করার আগে পরীক্ষার সক্রিয় করার বিষয়ে আপনার পরামর্শ না দেওয়া পর্যন্ত আমি কোনও পরীক্ষা দেখালাম না ।
আলফের্গ

@ আলাফের্গ: তারা অন্যথায় বিল্ড ডিয়ারের ভিতরে পরীক্ষা সাবডিরের মধ্যে শেষ করবে।
গৌতেহ

4
আমি চাই সিএমকে কাঠামোর সাথে সাদৃশ্যপূর্ণ কিছু থাকত।
রুপিচেকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.