ইউনিট টেস্টিং সি ++: কী পরীক্ষা করতে হবে?


20

টি এল; ডিআর

ভাল, দরকারী পরীক্ষাগুলি লেখা শক্ত, এবং সি ++ এর দাম বেশি cost আপনি কি অভিজ্ঞ বিকাশকারীরা কখন এবং কখন পরীক্ষা করতে হবে সে সম্পর্কে আপনার যুক্তিটি ভাগ করতে পারেন?

দীর্ঘ কাহিনী

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

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

এখন আমি একটি নতুন প্রকল্প উত্তরাধিকার সূত্রে পেয়েছি এবং কীভাবে এটি পরীক্ষা করতে হবে তা ভাবছি। এটি নেটিভ সি ++ / ওপেনজিএল অ্যাপ্লিকেশন, সুতরাং ইন্টিগ্রেশন টেস্টগুলি আসলে কোনও বিকল্প নয়। তবে সি ++ তে ইউনিট টেস্টিং জাভা থেকে কিছুটা শক্ত (আপনার স্পষ্টতই স্টাফ তৈরি করতে হবে virtual), এবং প্রোগ্রামটি ভারিভাবে ওরিয়েন্টেড নয়, তাই আমি কিছু জিনিসকে উপহাস / স্টাব করতে পারি না।

আমি পরীক্ষাগুলি লেখার খাতিরে কিছু পরীক্ষা লেখার জন্য পুরোপুরি ছিঁড়ে ফেলতে চাই না এবং ওও-আইজ পুরো জিনিসটিই চাই না। সুতরাং আমি আপনাকে জিজ্ঞাসা করছি: আমার কীসের জন্য পরীক্ষা লিখতে হবে? উদাহরণ:

  • আমি যে ক্রিয়াকলাপ / ক্লাসগুলি ঘন ঘন পরিবর্তনের প্রত্যাশা করি?
  • ফাংশন / ক্লাস যেগুলি ম্যানুয়ালি পরীক্ষা করা আরও বেশি কঠিন?
  • ফাংশন / ক্লাসগুলি যা ইতিমধ্যে পরীক্ষা করা সহজ?

তারা পরীক্ষা সম্পর্কে কীভাবে যায় তা দেখার জন্য আমি কয়েকটি শ্রদ্ধেয় সি ++ কোড বেসগুলি তদন্ত করতে শুরু করেছি investigate এই মুহুর্তে আমি ক্রোমিয়াম উত্স কোডটি সন্ধান করছি, তবে কোড থেকে তাদের পরীক্ষার যৌক্তিকতা বের করা আমার পক্ষে কঠিন। কারও কাছে যদি উদাহরণ রয়েছে বা জনপ্রিয় সি ++ ব্যবহারকারীদের (কমিটির সদস্যগণ, বই লেখক, গুগল, ফেসবুক, মাইক্রোসফ্ট, ...) এর কাছে এই বিষয়ে যোগাযোগ করা যায় তবে এটি অতিরিক্ত সহায়ক হতে পারে।

হালনাগাদ

এটি লেখার পর থেকে আমি এই সাইট এবং ওয়েবের চারপাশে আমার পথ অনুসন্ধান করেছি। কিছু ভাল জিনিস পাওয়া গেছে:

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

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

সুতরাং এই প্রশ্নের উত্তর দেওয়ার সময়, দয়া করে মনে রাখবেন যে আমাকে পরীক্ষার লেখার জন্য বরং একটি বড় বিনিয়োগ করতে হবে।


3
সি ইউনিট পরীক্ষায় অসুবিধার জন্য +1। যদি আপনার ইউনিট পরীক্ষার জন্য কোডটি পরিবর্তন করা দরকার তবে তা করবেন না।
ডিপিডি

2
@ ডিডিডি: আমি এতটা নিশ্চিত নই, যদি সত্যিই কিছু পরীক্ষা করার মতো হয়? বর্তমান কোড বেসে, আমি সিমুলেশন কোডটিতে খুব কমই যেকোন কিছু পরীক্ষা করতে পারি কারণ এগুলি প্রত্যক্ষভাবে গ্রাফিক্স ফাংশনগুলিকে কল করে এবং আমি এগুলিকে মক / স্টাব করতে পারি না। আমি এখনই যা পরীক্ষা করতে পারি সেগুলি হ'ল ইউটিলিটি ফাংশন। তবে আমি সম্মত, কোডটিকে "পরীক্ষামূলক" বোধ করার জন্য এটি পরিবর্তন করা ... ভুল বলে। টিডিডি প্রবক্তারা প্রায়শই বলে যে এটি আপনার সমস্ত কোডটি সমস্ত কল্পনাপ্রসূত উপায়ে আরও ভাল করে তুলবে, তবে আমি বিনীতভাবে তাতে একমত নই। প্রতিটি কিছুর জন্য ইন্টারফেস এবং কয়েকটি বাস্তবায়ন প্রয়োজন হয় না।
ফুটবল

আমি আপনাকে একটি সাম্প্রতিক উদাহরণ দেই: আমি একটি পুরো দিন একটি সিঞ্জ ফাংশন (সি ++ / সিআইএতে লিখিত) পরীক্ষা করার চেষ্টা করে কাটিয়েছি এবং পরীক্ষার সরঞ্জাম এমএস টেস্ট সবসময় এই পরীক্ষার জন্য ক্র্যাশ হয়ে যায়। দেখে মনে হচ্ছে এটি সরল সিপিপি রেফারেন্সে কিছু সমস্যা আছে। পরিবর্তে আমি কেবল এর কলিং ফাংশনটির আউটপুট পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করেছে। আমি পুরো একটি দিন ইউটি ফাংশনে নষ্ট করি। এটি ছিল মূল্যবান সময়ের ক্ষতি। এছাড়াও আমি আমার প্রয়োজন অনুসারে কোনও স্ট্যাবিং সরঞ্জাম পাইনি। আমি যেখানেই সম্ভব ম্যানুয়াল স্টাবিং করেছি।
ডিপিডি

এটি কেবলমাত্র আমি ধরণের জিনিস এড়াতে চাই: ডিআই অনুমান যে আমরা সি ++ ডিভেসগুলি বিশেষত পরীক্ষার বিষয়ে ব্যবহারিক হতে হবে। আপনি এটি পরীক্ষা করে শেষ করেছেন, সুতরাং আমি অনুমান করি যে এটি ঠিক আছে।
ফুটবল

@ ডিডিডি: আমি এ সম্পর্কে আরও কিছু ভেবেছি, এবং আমি মনে করি আপনি ঠিক বলেছেন, প্রশ্ন হ'ল আমি কী ধরণের ট্রেড অফ করতে চাই। বেশ কয়েকটি সত্তা পরীক্ষা করার জন্য কি পুরো গ্রাফিক সিস্টেমটিকে পুনরায় সংশোধন করার উপযুক্ত? আমি জানি সেখানে কোনও ত্রুটি ছিল না, তাই সম্ভবত: না এটি যদি বগি বোধ শুরু করে, আমি পরীক্ষা লিখব। খুব খারাপ আমি আপনার উত্তরটি গ্রহণ করতে পারছি না কারণ এটি একটি মন্তব্য :)
ফুটবল

উত্তর:


5

ওয়েল, ইউনিট টেস্টিং শুধুমাত্র একটি অংশ। সংহতকরণ পরীক্ষাগুলি আপনার দলের সমস্যার সাথে আপনাকে সহায়তা করে। ইন্টিগ্রেশন টেস্ট সমস্ত ধরণের অ্যাপ্লিকেশন, এবং নেটিভ এবং ওপেনএল অ্যাপ্লিকেশনগুলির জন্যও লেখা যেতে পারে। স্টিভ ফ্রিম্যান এবং নাট প্রাইস (উদাহরণস্বরূপ http://www.amazon.com/Growing-Object- ওরিয়েন্টড- সফটওয়্যার- গাইডেড- সাইনচার / ডিপি/0321503627) দ্বারা "টেস্ট দ্বারা পরিচালিত গার্জিং অবজেক্ট অরিয়েন্টেড সফটওয়্যার" পরীক্ষা করা উচিত । এটি আপনাকে জিইউআই এবং নেটওয়ার্ক যোগাযোগের মাধ্যমে একটি অ্যাপ্লিকেশন বিকাশের মাধ্যমে ধাপে ধাপে নিয়ে যায়।

পরীক্ষামূলক সফ্টওয়্যার যা পরীক্ষা চালিত ছিল না তা অন্য গল্প। মাইকেল পালকগুলি "লিগ্যাসি কোডের সাথে কার্যকরভাবে কাজ করা" পরীক্ষা করুন (http://www.amazon.com/Working- কার্যকরভাবে- শ্রেনী- মিশেল- ফিথারস / dp/0131177052)।


আমি দুটো বইই জানি। জিনিসগুলি হ'ল: ১. আমরা টিডিডি নিয়ে যেতে চাই না, কারণ এটি আমাদের সাথে ভালভাবে কাজ করে নি। আমরা পরীক্ষা চাই, কিন্তু ধর্মীয়ভাবে নয়। ২. আমি নিশ্চিত যে ওপেনজিএল অ্যাপ্লিকেশনগুলির জন্য ইন্টিগ্রেশন পরীক্ষাগুলি কোনওভাবেই সম্ভব, তবে এটির জন্য অনেক বেশি প্রচেষ্টা প্রয়োজন। আমি অ্যাপ্লিকেশনটি উন্নত করে রাখতে চাই, কোনও গবেষণা প্রকল্প শুরু করতে চাই না।
futlib

সচেতন থাকুন যে ইউনিটের পরীক্ষা "সত্যের পরে" সর্বদা কঠোর হয় তারপরে "প্রথম পরীক্ষা", কারণ কোডটি পরীক্ষামূলক (পুনর্ব্যবহারযোগ্য, রক্ষণাবেক্ষণযোগ্য ইত্যাদি) হিসাবে নকশাকৃত হয় না। আপনি যদি যাইহোক এটি করতে চান তবে আপনি টিডিডি এড়িয়ে গেলেও মাইকেল পালকের কৌশলগুলি (উদাহরণস্বরূপ seams) আটকে থাকার চেষ্টা করুন। উদাহরণস্বরূপ, যদি আপনি কোনও ফাংশন প্রসারিত করতে চান তবে "স্প্রাউট পদ্ধতি" এর মতো কিছু চেষ্টা করুন এবং নতুন পদ্ধতিটিকে টেস্টযোগ্য রাখার চেষ্টা করুন। এটি করা সম্ভব, তবে আরও শক্ত আইএমএইচও।
এরিকশাফার

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

আপনি অবশ্যই বলছেন, আমি যে নতুন কোডটি পরীক্ষামূলকভাবে লিখছি সে বিষয়ে সতর্ক থাকব। এই কোড বেসে জিনিসগুলি এখনই কীভাবে কাজ করে তা সহজ হবে না।
ফুটবল

আপনি যখন কোনও বৈশিষ্ট্য / ফাংশন যুক্ত করেন, তখন কীভাবে আপনি এটি পরীক্ষা করতে পারেন তা ভেবে দেখুন। আপনি কোনও কুৎসিত নির্ভরতা ইনজেকশন করতে পারেন? আপনি কীভাবে জানবেন যে ফাংশনটি এটি করার কথা বলে তা করে। আপনি কোন আচরণ পর্যবেক্ষণ করতে পারেন? আপনি সঠিকতা জন্য পরীক্ষা করতে পারে এমন কোন ফলাফল আছে? আপনি কি চেক করতে পারেন এমন কোন আক্রমণকারী রয়েছে?
এরিকশাফার

2

এটি একটি লজ্জার টিডিডি "আপনার পক্ষে ভাল কাজ করে না।" আমি মনে করি এটি কোথায় পরিণত হবে বোঝার মূল চাবিকাঠি। টিডিডি কীভাবে কাজ করে নি তা পুনর্বিবেচনা করুন এবং বুঝুন, আপনি কী আরও ভাল করতে পারতেন, কেন অসুবিধা হয়েছিল।

সুতরাং, অবশ্যই আপনার ইউনিট পরীক্ষাগুলি আপনার যে বাগগুলি খুঁজে পেয়েছিল তা ধরেনি। বিন্দু ধরনের। :-) আপনি এই বাগগুলি খুঁজে পাননি কারণ ইন্টারফেসগুলি কীভাবে কাজ করা উচিত এবং কীভাবে সেগুলি সঠিকভাবে পরীক্ষা করা হয়েছিল তা নিশ্চিত করে কীভাবে আপনি প্রথমে সেগুলি ঘটতে বাধা দিয়েছিলেন।

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

অবশ্যই নতুন উন্নয়ন টিডিডি থেকে উপকৃত হবে। নতুন বৈশিষ্ট্য যুক্ত হওয়ার সাথে সাথে, টিডিডি-তে রিফ্যাক্টরিং নতুন বিকাশের পরীক্ষা করতে সহায়তা করতে পারে, পাশাপাশি উত্তরাধিকারের ক্রিয়াকলাপগুলির জন্য নতুন ইউনিট পরীক্ষার বিকাশও করতে পারে।


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

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

2

আমি সি ++ তে টিডিডি করিনি তাই আমি এ বিষয়ে কোনও মন্তব্য করতে পারি না, তবে আপনার কোডটির প্রত্যাশিত আচরণটি পরীক্ষা করার কথা। বাস্তবায়ন পরিবর্তিত হতে পারে, আচরণ (সাধারণত?) একই থাকা উচিত। জাভা \ C # কেন্দ্রিক বিশ্বে, এর অর্থ আপনি কেবলমাত্র পাবলিক পদ্ধতিগুলি পরীক্ষা করতে পারেন, প্রত্যাশিত আচরণের জন্য পরীক্ষা লিখতে এবং প্রয়োগের আগে যা করা হয় (যা সাধারণত সম্পন্ন হওয়ার চেয়ে ভাল বলা হয় :))।

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