সর্বোচ্চ ইউনিট পরীক্ষার দক্ষতার জন্য কীভাবে সি ++ ইউনিট টেস্ট কোডটি সংগঠিত করা উচিত?


47
  • এই প্রশ্নটি ইউনিট টেস্টিং ফ্রেমওয়ার্কগুলি সম্পর্কে নয়
  • এই প্রশ্নটি ইউনিট টেস্ট লেখার বিষয়ে নয়
  • ইউটি কোডটি কোথায় লেখা হবে এবং কীভাবে / কখন / কোথায় এটি সংকলন করতে হবে এবং চালাতে হবে সে সম্পর্কে এই প্রশ্নটি ।

ইন উত্তরাধিকার কোড সঙ্গে কার্যকরভাবে কাজ করা , মাইকেল পালক asserts যে

ভাল ইউনিট পরীক্ষা ... দ্রুত চালান

এবং সেটা

একটি ইউনিট পরীক্ষা যা চালাতে সেকেন্ডের 1/10 তম লাগে। এটি একটি ধীর ইউনিট পরীক্ষা।

আমি মনে করি এই সংজ্ঞাগুলি অর্থবোধ করে। আমি আরও মনে করি যে তারা বোঝাচ্ছে যে আপনাকে ইউনিট টেস্টের একটি সেট এবং সেই কোড টেস্টগুলির একটি সেট রাখতে হবে যা আলাদাভাবে বেশি সময় নেয়, তবে আমি অনুমান করি যে আপনি কেবলমাত্র ইউনিট টেস্ট কল করার জন্য যে মূল্যটি প্রদান করেন তা দ্রুত চলে (খুব) ।

স্পষ্টতই সি ++ তে সমস্যা হ'ল আপনার ইউনিট টেস্ট ( গুলি ) চালানোর জন্য আপনাকে এই করতে হবে:

  1. আপনার কোড সম্পাদনা করুন (আপনি কোন "চক্র" এর উপর নির্ভর করে উত্পাদন বা ইউনিট পরীক্ষা)
  2. কম্পাইল
  3. লিংক
  4. স্টার্ট ইউনিট পরীক্ষা এক্সিকিউটেবল ( গুলি )

সম্পাদনা করুন (অদ্ভুত কাছের ভোটের পরে) : বিশদে যাওয়ার আগে, আমি এখানে বিষয়টির সংক্ষিপ্তসার চেষ্টা করব:

সি ++ ইউনিট টেস্ট কোড কীভাবে কার্যকরভাবে সংগঠিত করা যায়, যাতে (পরীক্ষা) কোডটি সম্পাদনা করা এবং পরীক্ষার কোড চালানো উভয়ই দক্ষ?


প্রথম সমস্যা তারপর সিদ্ধান্ত নিতে হয় যেখানে যাতে ইউনিট টেস্ট কোড লাগাতে:

  • এটি সম্পাদনা করা এবং সম্পর্কিত উত্পাদন কোডের সাথে মিশ্রিত করা এটি "প্রাকৃতিক"।
  • আপনার বর্তমানে পরিবর্তিত ইউনিটের জন্য সংকলন চক্র শুরু করা সহজ / দ্রুত

দ্বিতীয় , সম্পর্কিত, সমস্যা তাহলে কি তাই কম্পাইল করার যে প্রতিক্রিয়া ক্ষণিক হয়।

চরম বিকল্প:

  • প্রতিটি ইউনিট-টেস্ট-টেস্ট-ইউনিট পৃথক সিপিপি ফাইলে বাস করে এবং এই সিপিপি ফাইলটি + পৃথকভাবে সংযুক্ত করা হয় (উত্স কোড ইউনিট ফাইলের সাথে এটি পরীক্ষা করে) একটি একক এক্সিকিউটেবল যা এরপরে এই এক ইউনিট পরীক্ষা চালায়।
    • (+) এটি একক টেস্ট ইউনিটের জন্য প্রারম্ভকালীন (সংকলন + লিঙ্ক!) সময়কে ন্যূনতম করে।
    • (+) পরীক্ষাটি সুপার দ্রুত চলে, কারণ এটি কেবল একটি ইউনিট পরীক্ষা করে।
    • (-) পুরো স্যুটটি কার্যকর করতে এক হাজার কোটি প্রক্রিয়া শুরু করতে হবে। পরিচালনা করতে সমস্যা হতে পারে।
    • (-) প্রক্রিয়া শুরু করার ওভারহেড দৃশ্যমান হয়ে যাবে
  • অন্য দিকটি হ'ল - স্থির - প্রতি টেস্টে একটি সিপিপি ফাইল, তবে সমস্ত পরীক্ষার সিপিপি ফাইল (তারা যে কোডটি পরীক্ষা করে তা একত্রে) এক্সিকিউটেবলের সাথে লিঙ্কযুক্ত (প্রতি মডিউল / প্রতি প্রকল্প / আপনার পছন্দ চয়ন করুন)।
    • (+) সংকলনের সময়টি এখনও ঠিক থাকবে কারণ কেবল পরিবর্তিত কোডই সংকলন করবে।
    • (+) পুরো স্যুটটি কার্যকর করা সহজ, কারণ চালানোর জন্য কেবলমাত্র এক এক্সি আছে।
    • (-) স্যুটটি লিঙ্ক করতে যুগে যুগে সময় লাগবে, কারণ যে কোনও বস্তুর প্রতিটি সংশোধন পুনরায় লিঙ্ককে ট্রিগার করবে।
    • (-) (?) স্যুটটি চালাতে আরও বেশি সময় লাগবে, যদিও সমস্ত ইউনিট টেস্ট দ্রুত হয়, সময়টি ঠিক হওয়া উচিত।

তাহলে, আসল বিশ্বের সি ++ ইউনিট টেস্টগুলি কীভাবে পরিচালনা করা হয়? যদি আমি কেবল সেই জিনিসটি রাত্রি / ঘন্টা প্রতি চালিত করি তবে দ্বিতীয় অংশটি আসলে কিছু যায় আসে না, তবে প্রথম অংশটি, অর্থাত্ ইউটি কোডটি কীভাবে উত্পাদন কোডে "দম্পতি" করা যায়, যাতে বিকাশকারীদের উভয়কেই রাখা "প্রাকৃতিক" হয় আমার মনে হয় সবসময় ফোকাস। (এবং যদি বিকাশকারীদের ফোকাসে ইউটি কোড থাকে তবে তারা এটি চালাতে চাইবে, যা আমাদের দ্বিতীয় ভাগে ফিরে আসে brings)

বাস্তব বিশ্বের গল্প এবং অভিজ্ঞতা প্রশংসা!

নোট:

  • এই প্রশ্নটি ইচ্ছাকৃতভাবে অনির্দিষ্ট প্ল্যাটফর্ম এবং মেক / প্রজেক্ট সিস্টেম ছেড়ে যায়।
  • প্রশ্নগুলি ট্যাগ করা UT এবং C ++ শুরু করার জন্য দুর্দান্ত জায়গা, তবে দুর্ভাগ্যক্রমে অনেকগুলি প্রশ্ন এবং বিশেষত উত্তরগুলি খুব বেশি বিবরণে বা নির্দিষ্ট ফ্রেমওয়ার্কগুলিতে নিবদ্ধ।
  • কিছুক্ষণ আগে, আমি বুস্ট ইউনিট পরীক্ষার কাঠামোর বিষয়ে অনুরূপ প্রশ্নের উত্তর দিয়েছি । আমি এই কাঠামোর "বাস্তব", দ্রুত ইউনিট টেস্টগুলির অভাব বোধ করি। এবং আমি অন্য প্রশ্নটি খুব সংকীর্ণ দেখতে পাই, তাই এই নতুন প্রশ্নটি।

6
সময় সংকলন করার জন্য যথাসম্ভব ত্রুটিগুলি সরিয়ে নেওয়ার জন্য আরও একটি জটিলতা প্রবর্তন করা হয়েছে - ইউনিট পরীক্ষার একটি ভাল স্যুট প্রায়শই পরীক্ষা করতে সক্ষম হতে হয় যে নির্দিষ্ট ব্যবহার সংকলন করতে ব্যর্থ হয়।

3
@ ক্লোজারস: আপনি দয়া করে যুক্তি দিতে পারেন যে আপনাকে এই প্রশ্নটি বন্ধ করতে পরিচালিত করেছিল?
লুক টুরাইল

কেন এটি বন্ধ করতে হয়েছিল তা আমি বেশ দেখতে পাচ্ছি না। :-(আপনি এই ফোরামে না থাকলে এই জাতীয় প্রশ্নের উত্তর সন্ধানের জন্য কোথায় অনুমান?

2
@ জো: সংকলক যখন যাইহোক আমাকে বলবে তখন কিছু সংকলন হবে কিনা তা জানতে আমার কেন ইউনিট পরীক্ষার প্রয়োজন?
ডেভিড থর্নলি

2
@ ডেভিড: কারণ আপনি এটি নিশ্চিত করতে চান যে এটি সংকলন করে না । দ্রুত উদাহরণটি একটি পাইপলাইন অবজেক্ট হবে যা কোনও ইনপুট গ্রহণ করে এবং আউটপুট উত্পাদন করে Pipeline<A,B>.connect(Pipeline<B,C>)এমন সংকলন করা Pipeline<A,B>.connect(Pipeline<C,D>)উচিত যেখানে সংকলন করা উচিত নয়: প্রথম পর্যায়ে আউটপুট টাইপ দ্বিতীয় স্তরের ইনপুট ধরণের সাথে বেমানান।
sebastiangeiger

উত্তর:


6

আমাদের একটি এক্সিকিউটেবলে সমস্ত ইউনিট পরীক্ষা (একটি মডিউল জন্য) আছে। পরীক্ষা দলে দলে রাখা হয়। আমি পরীক্ষার রানারের কমান্ড লাইনে একটি (পরীক্ষা / গোষ্ঠী) নাম নির্দিষ্ট করে একক পরীক্ষা (বা কিছু পরীক্ষা) বা পরীক্ষার একটি গোষ্ঠী কার্যকর করতে পারি। বিল্ড সিস্টেমটি "বিল্ড" গ্রুপ চালাতে পারে, পরীক্ষা বিভাগ "সমস্ত" চালাতে পারে। বিকাশকারী "BUG1234" এর মতো একটি গ্রুপে কিছু পরীক্ষা করতে পারেন যার সাথে তিনি কাজ করছেন সেই মামলার ইস্যু ট্র্যাকার সংখ্যা 1234।


6

প্রথমত, আমি "1) আপনার (উত্পাদন) কোড এবং আপনার ইউনিট পরীক্ষা সম্পাদনা" এর সাথে একমত নই। আপনার একবারে একটি মাত্র পরিবর্তন করতে হবে, অন্যথায় যদি ফলাফল পরিবর্তন হয় তবে আপনি জানেন না যে এটির কারণে কী ঘটেছে।

আমি একটি ডিরেক্টরি ট্রিতে ইউনিট পরীক্ষা রাখতে চাই যা মূল গাছের ছায়া দেয়। যদি আমি আছে /sources/componentA/alpha/foo.ccএবং /objects/componentA/beta/foo.oতারপর, আমি কিছু করতে চান /UTest_sources/componentA/alpha/test_foo.ccএবং /UTest_objects/componentA/beta/test_foo.o। আমি স্ট্যাব / মক অবজেক্ট এবং পরীক্ষাগুলির জন্য অন্যান্য উত্সগুলির জন্য একই ছায়া গাছ ব্যবহার করি। কিছু প্রান্তের কেস থাকবে, তবে এই স্কিমটি জিনিসগুলিকে অনেক সহজ করে। একটি ভাল সম্পাদক ম্যাক্রো অনায়াসে বিষয় উত্সের পাশাপাশি পরীক্ষার উত্স টানতে পারে। একটি ভাল বিল্ড সিস্টেম (যেমন GNUMake) উভয় সংকলন করতে পারে এবং একটি কমান্ড (উদাহরণস্বরূপ make test_foo) দিয়ে পরীক্ষা চালাতে পারে, এবং এই জাতীয় প্রক্রিয়াটি বাজিলিয়ান পরিচালনা করতে পারে - কেবলমাত্র যাদের সূত্রগুলি শেষবার পরীক্ষার পরে পরিবর্তিত হয়েছে - বেশ সহজেই (আমার কাছে এই প্রক্রিয়াগুলি আরম্ভ করার ওভারহেড কখনই কোনও সমস্যা হতে পারে নি, এটি হে (এন))।

একই কাঠামোর ক্ষেত্রে আপনার বৃহত্তর-স্কেল টেস্ট থাকতে পারে (আর ইউনিট পরীক্ষা হবে না) যা অনেকগুলি বস্তুকে এক সাথে সংযুক্ত করে এবং অনেকগুলি পরীক্ষা চালায়। কৌশলটি হ'ল এই পরীক্ষাগুলি তৈরি করতে / চালাতে কত সময় নেয় সে অনুসারে বাছাই করা এবং সেই অনুযায়ী আপনার প্রতিদিনের শিডিয়ুলের মধ্যে সেগুলি কাজ করে। যখনই আপনার মতো মনে হয় ওয়ান-সেকেন্ড বা কম পরীক্ষা চালান; দশ সেকেন্ড পরীক্ষা এবং প্রসারিত শুরু; পাঁচ মিনিটের পরীক্ষা এবং একটি বিরতি নিতে; আধ ঘন্টা পরীক্ষা এবং মধ্যাহ্নভোজন যেতে; ছয় ঘন্টা পরীক্ষা এবং বাড়িতে যান। যদি আপনি দেখতে পান যে আপনি প্রচুর সময় নষ্ট করছেন যেমন একটি মাত্র ছোট ফাইল পরিবর্তন করার পরে একটি বিশাল পরীক্ষার সংযোগ দিচ্ছেন, আপনি এটি ভুল করছেন - লিঙ্কটি তাত্ক্ষণিক হলেও আপনি এখনও একটি দীর্ঘ পরীক্ষা চালিয়ে যাবেন জন্য বলা হয়নি।


বিজ্ঞাপন (1) - হ্যাঁ এটিকে opালুভাবে অঙ্কিত করা হয়েছিল
মার্টিন বা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.