কীভাবে ইউনিট টেস্টগুলি বিস্তৃতভাবে বিদ্রূপ না করে লেখা উচিত?


80

আমি যেমন বুঝতে পেরেছি, ইউনিট পরীক্ষাগুলির পয়েন্ট হ'ল বিচ্ছিন্নভাবে কোডের ইউনিটগুলি পরীক্ষা করা । এই যে মানে:

  1. কোডবেজে অন্য কোনও সম্পর্কযুক্ত কোড পরিবর্তনের মাধ্যমে তাদের ভাঙা উচিত নয় ।
  2. ইন্টিগ্রেশন পরীক্ষার বিপরীতে পরীক্ষিত ইউনিটে একটি বাগ দ্বারা কেবল একটি ইউনিট পরীক্ষা করা উচিত (যা হিপগুলিতে ভেঙে যেতে পারে)।

এগুলির দ্বারা বোঝা যায় যে পরীক্ষিত ইউনিটের প্রতিটি বাহ্যিক নির্ভরতা উপহাস করা উচিত। এবং আমার অর্থ বাইরের সমস্ত নির্ভরতা , কেবলমাত্র "বাইরের স্তরগুলি" যেমন নেটওয়ার্কিং, ফাইল সিস্টেম, ডাটাবেস ইত্যাদি ..

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

এখন, প্রশ্ন (গুলি)।

  1. ইউনিট পরীক্ষাগুলি কীভাবে সঠিকভাবে লেখা উচিত?
  2. তাদের এবং ইন্টিগ্রেশন পরীক্ষার মধ্যে লাইনটি ঠিক কোথায় অবস্থিত?

আপডেট 1

নিম্নলিখিত সিউডো কোড বিবেচনা করুন:

class Person {
    constructor(calculator) {}

    calculate(a, b) {
        const sum = this.calculator.add(a, b);

        // do some other stuff with the `sum`
    }
}

কোন পরীক্ষা যা নির্ভরশীলতাটিকে Person.calculateবিদ্রূপ না করে পদ্ধতিটি পরীক্ষা করে Calculator(প্রদত্ত যে এটি Calculatorএকটি হালকা ওজনের শ্রেণি যা "বাইরের বিশ্বের" অ্যাক্সেস করে না) একটি ইউনিট পরীক্ষা হিসাবে বিবেচনা করা যেতে পারে?


10
এর অংশটি হ'ল ডিজাইনের অভিজ্ঞতা যা সময়ের সাথে আসবে। আপনি কীভাবে আপনার উপাদানগুলি কাঠামো তৈরি করবেন তা শিখবেন যাতে নির্ভরতাগুলি তাদের উপহাস করা খুব কঠিন না হয়। এর অর্থ হ'ল টেস্টাবিলিটি কোনও সফ্টওয়্যারটির গৌণ নকশা লক্ষ্য হতে হবে। এই লক্ষ্যটি সন্তুষ্ট করা আরও সহজ যদি টেস্টটি কোডের সাথে আগে বা এক সাথে লেখা হয়, যেমন টিডিডি এবং / অথবা বিডিডি ব্যবহার করে।
আমন

33
একটি ফোল্ডারে দ্রুত এবং নির্ভরযোগ্যভাবে চালিত পরীক্ষাগুলি রাখুন। ধীর এবং সম্ভাব্যভাবে ভঙ্গুর এমন পরীক্ষাগুলি অন্যটিতে রাখুন। যত দ্রুত সম্ভব প্রথম ফোল্ডারে পরীক্ষা চালান (আক্ষরিক অর্থে প্রতিবার আপনি টাইপ করার সময় বিরতি দিন এবং কোড সংকলনগুলি আদর্শ, তবে সমস্ত দেব পরিবেশ এটিকে সমর্থন করে না)। কম ধীরে ধীরে ধীর পরীক্ষাগুলি চালান (যখন আপনার কাছে কফির বিরতি থাকে)। ইউনিট এবং ইন্টিগ্রেশন নামগুলি নিয়ে চিন্তা করবেন না। আপনি চাইলে তাদের দ্রুত এবং ধীরে কল করুন। এটা কোন ব্যাপার না।
ডেভিড আরনো

6
"যে কার্যত প্রতিটি ইউনিট পরীক্ষার উপহাস করা উচিত" হ্যাঁ, তাই না? "মশকরা সম্পর্কে একটি দ্রুত গুগল অনুসন্ধান অনেকগুলি নিবন্ধ প্রকাশ করেছে যা দাবি করে যে" মশকরা একটি কোডের গন্ধ "" তারা ভুল বলে
মাইকেল

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

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

উত্তর:


59

ইউনিট পরীক্ষার পয়েন্ট হ'ল বিচ্ছিন্নভাবে কোডের ইউনিটগুলি পরীক্ষা করা।

ইউনিট টেস্টে মার্টিন ফাউলর

ইউনিট টেস্টিং সম্পর্কে প্রায়শই সফ্টওয়্যার বিকাশে কথা বলা হয় এবং এটি এমন একটি শব্দ যা আমি আমার পুরো সময় লেখার প্রোগ্রামগুলির সাথে পরিচিত ছিল। বেশিরভাগ সফ্টওয়্যার বিকাশের পরিভাষার মতো তবে এটি খুব খারাপ সংজ্ঞায়িত এবং আমি দেখি যে বিভ্রান্তি প্রায়শই ঘটতে পারে যখন লোকেরা মনে করে যে এটি আসলের চেয়ে আরও দৃ .়ভাবে সংজ্ঞায়িত হয়েছে।

কেন্ট বেক টেস্ট ড্রাইভেন ডেভলপমেন্টে কী লিখেছেন , উদাহরণ দ্বারা

আমি তাদের "ইউনিট পরীক্ষা" বলি, তবে তারা ইউনিট পরীক্ষার স্বীকৃত সংজ্ঞাটির সাথে খুব ভাল মেলে না

"ইউনিট পরীক্ষার পয়েন্ট অফ পয়েন্ট" এর যে কোনও প্রদত্ত দাবি "ইউনিট টেস্ট" এর কোন সংজ্ঞা বিবেচনা করা হচ্ছে তার উপর নির্ভর করবে।

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

আপনি যে বিবাদমান পরামর্শটি দেখেছেন তা অনুমানের বিভিন্ন সেটের অধীনে পরিচালিত লোকদের কাছ থেকে আসে।

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

আপনি তুলনা করতে চাইতে পারেন:

কোনও পরীক্ষা যা ক্যালকুলেটর নির্ভরতার উপহাস না করে পার্সোন ক্যালকুলেট পদ্ধতি পরীক্ষা করে (প্রদত্ত যে ক্যালকুলেটর একটি হালকা ওজনের শ্রেণি যা "বাইরের বিশ্বের" অ্যাক্সেস করে না) কে ইউনিট পরীক্ষা হিসাবে বিবেচনা করা যেতে পারে?

আমি মনে করি এটি জিজ্ঞাসা করা ভুল প্রশ্ন; এটি আবার লেবেল সম্পর্কে একটি যুক্তি , যখন আমি বিশ্বাস করি যে আমরা আসলে যা যত্ন করি সেগুলি বৈশিষ্ট্য

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

যদি অনুরোধ করা Calculator::addপরীক্ষা চালানোর জন্য প্রয়োজনীয় সময়কে উল্লেখযোগ্যভাবে বৃদ্ধি না করে (বা এই ব্যবহারের ক্ষেত্রে অন্য কোনও গুরুত্বপূর্ণ বৈশিষ্ট্য), তবে আমি পরীক্ষার দ্বিগুণ ব্যবহার করে বিরক্ত করব না - এটি ব্যয়কে ছাড়িয়ে যাওয়ার সুবিধা দেয় না it ।

এখানে দুটি অনুমান লক্ষ করুন: ব্যয়ের মূল্যায়নের অংশ হিসাবে একজন মানুষ এবং বেনিফিটের মূল্যায়নে অচলিত পরিবর্তনগুলির সংক্ষিপ্ত স্ট্যাক। সেই পরিস্থিতিতে যেখানে এই শর্তগুলি ধরে রাখে না, "বিচ্ছিন্নকরণ" এর মানটি খানিকটা বদলে যায়।

হ্যারি পারসিভালের হট লাভা দেখুন ।


5
এক জিনিস উপহাস কাজ করে যোগ প্রমাণ ক্যালকুলেটর যে পারেন অর্থাত ব্যঙ্গ থাকুন যে নকশা দম্পতি ব্যক্তি এবং ক্যালকুলেটর না (যদিও এই অন্যান্য উপায়ে চেক করা যাবে)
জে।

40

কীভাবে ইউনিট টেস্টগুলি বিস্তৃতভাবে বিদ্রূপ না করে লেখা উচিত?

আপনার কোডে পার্শ্ব প্রতিক্রিয়া হ্রাস করে।

আপনার উদাহরণ কোডটি গ্রহণ করা, যদি calculatorউদাহরণস্বরূপ কোনও ওয়েব এপিআইয়ের সাথে কথা হয়, তবে হয় আপনি ভঙ্গুর পরীক্ষাগুলি তৈরি করেন যা সেই ওয়েব এপিআইয়ের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হওয়ার উপর নির্ভর করে, বা আপনি এটির একটি উপহাস তৈরি করেন। তবে এটি যদি একটি নির্বিচারে, গণনা কার্যের রাষ্ট্র-মুক্ত সেট হয় তবে আপনি এটি উপহাস করবেন না (এবং করা উচিত নয়)। যদি আপনি তা করেন তবে আপনি আপনার বিদ্রূপটি বাস্তব কোডের সাথে আলাদাভাবে আচরণ করার ঝুঁকি নিয়েছেন, যাতে আপনার পরীক্ষাগুলিতে বাগগুলি বাড়ে।

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

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


8
এটি অনুশীলনে এবং অর্থহীন শব্দার্থ বিতর্কের পক্ষে উভয় ক্ষেত্রেই সঠিক উত্তর।
জারেড স্মিথ

আপনার কাছে কি এমন একটি তুচ্ছ ওপেন সোর্স কোডবেসের উদাহরণ রয়েছে যা এই জাতীয় শৈলী ব্যবহার করে এবং এখনও ভাল পরীক্ষার কভারেজ পায়?
জোয়ারি সেব্রেচটস

4
@ জোয়ারি সেব্রেচট প্রতিটি একক এফপি? উদাহরণ
জারেড স্মিথ

আমি যা খুঁজছি তা পুরোপুরি নয়, কারণ এটি কেবল ফাংশনগুলির সংগ্রহ যা একে অপরের থেকে স্বতন্ত্র, ফাংশনগুলির সিস্টেম যা একে অপরকে কল করে না। যদি কোনও ফাংশনটি শীর্ষ স্তরের একটি হয় তবে এটির পরীক্ষা করার উদ্দেশ্যে কোনও ফাংশনটিতে জটিল তর্কগুলি তৈরি করতে আপনি কীভাবে ঘুরতে পারেন? যেমন একটি গেমের মূল লুপ।
জোয়েরি সেব্রিচটস

1
@ জোয়েরিসেবার্টস হুম, হয় আপনি যা চান তা ভুল বোঝাবুঝি করছি, বা আমি যে উদাহরণ দিয়েছি তার মধ্যে আপনি গভীর গভীর খোঁড়াখুঁড়ি করেননি। রামদা ফাংশনগুলি তাদের উত্সে (উদাঃ R.equals) সমস্ত জায়গাতে অভ্যন্তরীণ কলগুলি ব্যবহার করে । এগুলি বেশিরভাগ অংশ খাঁটি ফাংশনের জন্য, এগুলি সাধারণত পরীক্ষাগুলিতে উপহাস করা হয় না।
জারেড স্মিথ

31

এই সমস্যাগুলি তাদের অসুবিধায় একেবারেই আলাদা। প্রথমে প্রশ্ন 2 নেওয়া যাক।

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

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

অনেক অনুশীলনকারীরা আশঙ্কা করছেন যে ইউনিট পরীক্ষা বি যদি ইউনিট টেস্ট এ দ্বারা ইতিমধ্যে পরীক্ষিত ক্লাসগুলি পুনরায় ব্যবহার করে, তবে ইউনিট এ এর ​​একটি ত্রুটি একাধিক জায়গায় পরীক্ষার ব্যর্থতার কারণ হয়ে দাঁড়ায়। আমি এই বিবেচনা করার সময় একটি সমস্যা: একটি পরীক্ষা স্যুট সফল হয়েছে 100% অর্ডার আপনি আশ্বাস আপনার যা দরকার দিতে, তাই এটি একটি বড় সমস্যা অনেকগুলি ব্যর্থতা আছে নয় - সব পরে, আপনি কি একটি ত্রুটি আছে। শুধুমাত্র তাত্পর্যপূর্ণ সমস্যা যদি একটি ত্রুটি খুব কম ব্যর্থতা ট্রিগার করে ।

অতএব, উপহাস করার কোনও ধর্ম তৈরি করবেন না। এটি একটি উপায়, শেষ নয়, তাই যদি আপনি অতিরিক্ত প্রচেষ্টা এড়ানো থেকে দূরে সরে যেতে পারেন তবে আপনার এটি করা উচিত।


4
The only critical problem would be if a defect triggered too few failures.এটি উপহাসের একটি দুর্বল পয়েন্ট। আমাদের প্রত্যাশিত আচরণটি "প্রোগ্রাম" করতে হবে, আমরা এটি করতে ব্যর্থ হতে পারি, যাতে আমাদের পরীক্ষাগুলি "মিথ্যা ধনাত্মক" হিসাবে শেষ হয়। তবে নির্ধারণবাদ (পরীক্ষার সর্বাধিক গুরুত্বপূর্ণ শর্ত) অর্জনের জন্য উপহাস করা একটি খুব কার্যকর কৌশল। আমি সম্ভব হলে আমার সমস্ত প্রকল্পে সেগুলি ব্যবহার করি। যখন ইন্টিগ্রেশন খুব জটিল হয় বা নির্ভরতা খুব শক্ত হয় তখন তারা আমাকেও দেখায়।
লাইভ

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

11
@ আলেকজান্ডারলোমিয়া: আপনি ইউনিটকে কী বলবেন? আপনি কি স্ট্রিংকে একটি ইউনিট বলবেন? আমি করব, তবে আমি এটিকে উপহাস করার স্বপ্ন দেখব না।
বার্ট ভ্যান ইনজেন শেহেনো

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

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

6

ঠিক আছে, সুতরাং আপনার প্রশ্নের সরাসরি উত্তর দিতে:

ইউনিট পরীক্ষাগুলি কীভাবে সঠিকভাবে লেখা উচিত?

আপনি যেমন বলেছিলেন, আপনার নির্ভরতা উপহাস করা উচিত এবং প্রশ্নে কেবলমাত্র ইউনিটটি পরীক্ষা করা উচিত।

তাদের এবং ইন্টিগ্রেশন পরীক্ষার মধ্যে লাইনটি ঠিক কোথায় অবস্থিত?

ইন্টিগ্রেশন টেস্ট হ'ল একক পরীক্ষা যেখানে আপনার নির্ভরতাগুলি উপহাস করা হয় না।

কোনও পরীক্ষা যা ক্যালকুলেটরকে বিদ্রূপ না করে পার্সোন ক্যালকুলেট পদ্ধতি পরীক্ষা করে তাকে ইউনিট পরীক্ষা হিসাবে বিবেচনা করা যেতে পারে?

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

তবে, একটি সতর্কতা লোকেরা কী করে আপনার পরীক্ষাগুলি কল করা উচিত বলে মনে করে তা কি সত্যিই যত্নশীল?

তবে আপনার আসল প্রশ্নটি মনে হচ্ছে:

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

আমি মনে করি যে এখানে সমস্যাটি হ'ল অনেক লোক সম্পূর্ণরূপে নির্ভরতা পুনরায় তৈরি করতে মক ব্যবহার করে। উদাহরণস্বরূপ আমি আপনার উদাহরণ হিসাবে ক্যালকুলেটর উপহাস করতে পারেন

public class MockCalc : ICalculator
{
     public Add(int a, int b) { return 4; }
}

আমি এর মতো কিছু করব না:

myMock = Mock<ICalculator>().Add((a,b) => {return a + b;})
myPerson.Calculate()
Assert.WasCalled(myMock.Add());

আমি যুক্তি দেব যে, এটি "আমার উপহাসের পরীক্ষা" বা "বাস্তবায়ন পরীক্ষা করা" হবে। আমি বলব " মকস লিখবেন না! * এর মতো"।

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


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

কোনও প্রোব না, আমি মনে করি সমস্যাটি হ'ল দুটি বিষয়ের সংজ্ঞা প্রত্যেকের দ্বারা 100% একমত নয়।
ইভান

আমি আপনার বর্গ নামান্তর হবে MockCalcথেকে StubCalc, এবং এটি একটি শহরের উপর অসম্পূর্ণ নিবন্ধ না একটি উপহাস কল। martinfowler.com/articles/…
বিডএসএল

@ বিডিএসএল এই নিবন্ধটি 15 বছরের পুরানো
ইভান

4
  1. ইউনিট পরীক্ষাগুলি কীভাবে সঠিকভাবে প্রয়োগ করা উচিত?

আমার থাম্বের নিয়মটি হ'ল সঠিক ইউনিট পরীক্ষা:

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

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

  1. তাদের [ইউনিট পরীক্ষা] এবং ইন্টিগ্রেশন পরীক্ষার মধ্যে ঠিক কোথায় রেখা রয়েছে?

আমি এই পার্থক্যটি সবচেয়ে দরকারী বলে মনে করেছি:

  • ইউনিট পরীক্ষাগুলি "ব্যবহারকারীর কোড" অনুকরণ করে , কোড-স্তরের ইন্টারফেসগুলির কাঙ্ক্ষিত আচরণ এবং শব্দার্থবিজ্ঞানের বিরুদ্ধে বাস্তবায়ন শ্রেণীর আচরণ যাচাই করে ।
  • ইন্টিগ্রেশন টেস্টগুলি ব্যবহারকারীর অনুকরণ করে , নির্দিষ্ট ব্যবহারের ক্ষেত্রে এবং / অথবা ফর্মাল এপিআইয়ের বিরুদ্ধে চলমান অ্যাপ্লিকেশনটির আচরণ যাচাই করে । একটি ওয়েব পরিষেবার জন্য, "ব্যবহারকারী" একটি ক্লায়েন্ট অ্যাপ্লিকেশন হবে।

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

  1. এটি কি সত্য যে কার্যত প্রতিটি ইউনিট পরীক্ষার উপহাস করা উচিত?

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

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

পরীক্ষিত ইউনিটে একটি বাগ দ্বারা কেবল একটি ইউনিট পরীক্ষা করা উচিত।

আমি এটি যুক্তিসঙ্গত প্রত্যাশা বলে মনে করি না, কারণ এটি পুনরায় ব্যবহারের বিরুদ্ধে কাজ করে। আপনার একটি privateপদ্ধতি থাকতে পারে , উদাহরণস্বরূপ, এটি publicআপনার ইন্টারফেস দ্বারা প্রকাশিত একাধিক পদ্ধতি দ্বারা ডাকা হয় । সেই এক পদ্ধতিতে প্রবর্তিত বাগের ফলে একাধিক পরীক্ষায় ব্যর্থতা হতে পারে। এর অর্থ এই নয় যে প্রতিটি publicপদ্ধতিতে আপনার একই কোডটি অনুলিপি করা উচিত ।


3
  1. কোডবেজে অন্য কোনও সম্পর্কযুক্ত কোড পরিবর্তনের মাধ্যমে তাদের ভাঙা উচিত নয় ।

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

  1. ইন্টিগ্রেশন পরীক্ষার বিপরীতে পরীক্ষিত ইউনিটে একটি বাগ দ্বারা কেবল একটি ইউনিট পরীক্ষা করা উচিত (যা হিপগুলিতে ভেঙে যেতে পারে)।

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

তাদের এবং ইন্টিগ্রেশন পরীক্ষার মধ্যে লাইনটি ঠিক কোথায় অবস্থিত?

আমি মনে করি না যে এটি একটি গুরুত্বপূর্ণ পার্থক্য। কোনওভাবে কোডের একটি 'ইউনিট' কী?

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

কীভাবে ইউনিট টেস্টগুলি বিস্তৃতভাবে বিদ্রূপ না করে লেখা উচিত?

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


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

1

প্রথমত, কিছু সংজ্ঞা:

একটি ইউনিট পরীক্ষা অন্য ইউনিট থেকে বিচ্ছিন্নভাবে ইউনিট পরীক্ষা করে, তবে এর অর্থ কী কোনও প্রামাণিক উত্স দ্বারা দৃ concrete়ভাবে সংজ্ঞায়িত করা হয়নি, তাই এটি আরও ভাল সংজ্ঞা দিন: যদি I / O সীমানা অতিক্রম করা হয় (আই / ও নেটওয়ার্ক কিনা, ডিস্ক, স্ক্রিন বা ইউআই ইনপুট) রয়েছে, সেখানে একটি লাইন আঁকতে পারি এমন একটি আধা-উদ্দেশ্যমূলক জায়গা place কোডটি যদি I / O এর উপর নির্ভর করে তবে এটি একটি ইউনিটের সীমানা অতিক্রম করছে এবং সুতরাং সেই আই / ও এর জন্য দায়বদ্ধ ইউনিটকে উপহাস করা দরকার।

এই সংজ্ঞায়নের অধীনে, খাঁটি ফাংশনগুলির মতো জিনিসগুলিকে ঠাট্টা করার জন্য আমি কোন বাধ্যতামূলক কারণ দেখতে পাচ্ছি না, যার অর্থ ইউনিট টেস্টিং খাঁটি ফাংশনগুলিতে, বা পার্শ্ব-প্রতিক্রিয়া ছাড়াই ফাংশনগুলিকে ndsণ দেয়।

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

কোড গন্ধ

এর জন্য, আমরা উইকিপিডিয়ায় ফিরে যাব:

কম্পিউটার প্রোগ্রামিংয়ে একটি কোডের গন্ধ কোনও প্রোগ্রামের উত্স কোডের কোনও বৈশিষ্ট্য যা সম্ভবত কোনও গভীর সমস্যা নির্দেশ করে।

এটি পরে চালিয়ে যায় ...

"গন্ধগুলি কোডের নির্দিষ্ট কাঠামো যা মৌলিক নকশার নীতি লঙ্ঘন এবং নকশার মানকে নেতিবাচকভাবে প্রভাবিত করে" indicate সূর্যনারায়ণ, গিরিশ (নভেম্বর 2014) সফ্টওয়্যার ডিজাইন গন্ধ জন্য রিফ্যাক্টরিং। মরগান কাউফম্যান পি। 258।

কোড গন্ধ সাধারণত বাগ হয় না; এগুলি প্রযুক্তিগতভাবে ভুল নয় এবং প্রোগ্রামটি কার্যকর হতে বাধা দেয় না। পরিবর্তে, তারা নকশায় দুর্বলতাগুলি নির্দেশ করে যা বিকাশকে কমিয়ে দিতে পারে বা ভবিষ্যতে বাগ বা ব্যর্থতার ঝুঁকি বাড়িয়ে তুলতে পারে।

অন্য কথায়, সমস্ত কোডের গন্ধ খারাপ হয় না। বরং তারা সাধারণ ইঙ্গিতও রয়েছে যে কিছু তার অনুকূল আকারে প্রকাশ করা যাবে না পারে, এবং গন্ধ হতে পারে প্রশ্নে কোড উন্নত করার সুযোগ নির্দেশ করে।

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

সমস্ত সফ্টওয়্যার বিকাশের সারমর্মটি হ'ল বড় সমস্যাটিকে ছোট ছোট, স্বতন্ত্র টুকরো (পচন) ভাঙ্গতে এবং একসাথে সমাধানগুলি রচনা করে এমন একটি অ্যাপ্লিকেশন তৈরি করে যাতে বড় সমস্যা (রচনা) সমাধান করে।

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

কোড গন্ধকে কী উপহাস করে তা এমন নয় যে উপহাসের সাথে সহজাতভাবে কিছু ভুল আছে - কখনও কখনও এটি খুব দরকারী useful এটি কোডের গন্ধকে কী তৈরি করে তা হ'ল এটি আপনার অ্যাপ্লিকেশনটিতে কাপলিংয়ের সমস্যাযুক্ত উত্সকে নির্দেশ করতে পারে। কখনও কখনও দম্পতির লেখার উত্সটি সরিয়ে ফেলা মক লেখার চেয়ে অনেক বেশি উত্পাদনশীল।

এখানে অনেক ধরণের সংযোগ রয়েছে এবং কিছু অন্যের চেয়ে ভাল। উপহাসগুলি একটি কোড গন্ধ তা বুঝতে পেরে আপনি গন্ধটিকে আরও খারাপ কিছুতে পরিণত করার আগে অ্যাপ্লিকেশন ডিজাইনের লাইফসাইকেলের শুরুতে সবচেয়ে খারাপ প্রকারগুলি সনাক্ত এবং এড়াতে শিখতে পারেন ।


0

উপহাস কেবলমাত্র ইউনিট পরীক্ষায়ও শেষ অবলম্বন হিসাবে ব্যবহার করা উচিত।

একটি পদ্ধতি একক নয়, এমনকি একটি শ্রেণিও একক নয়। ইউনিটটি কোডের যে কোনও লজিকাল বিভাজন যা বোঝায় সেটিকে বিবেচনা না করেই তা বোঝায়। ভালভাবে পরীক্ষিত কোড পাওয়ার একটি গুরুত্বপূর্ণ উপাদান হ'ল অবাধে চুল্লী তৈরি করতে সক্ষম হচ্ছেন এবং অবাধে চুল্লী চালাতে সক্ষম হবার অংশটি এর অর্থ এটি করতে আপনার পরীক্ষা পরিবর্তন করতে হবে না। আপনি যত বেশি বিদ্রূপ করবেন, রিফ্যাক্টর করার সময় আপনার পরীক্ষাগুলি আরও পরিবর্তন করতে হবে। আপনি যদি পদ্ধতিটিকে ইউনিট হিসাবে বিবেচনা করেন, তবে প্রতিবার আপনার চুল্লিটি চালানোর সময় আপনাকে পরীক্ষাগুলি পরিবর্তন করতে হবে। এবং আপনি যদি ক্লাসটিকে ইউনিট হিসাবে বিবেচনা করেন, তবে প্রতিবার যখন আপনি কোনও শ্রেণি একাধিক ক্লাসে বিভক্ত করতে চান তখন আপনাকে পরীক্ষাগুলি পরিবর্তন করতে হবে। আপনার কোডটি রিফ্যাক্টর করার জন্য যখন আপনাকে আপনার পরীক্ষাগুলি পুনরুদ্ধার করতে হয়, তখন এটি লোককে তাদের কোডটি রিফ্যাক্টর না করার জন্য বাছাই করে, যা কোনও প্রকল্পের মধ্যে ঘটে যাওয়া সবচেয়ে খারাপ বিষয় সম্পর্কে is আপনার পরীক্ষাগুলি রিফ্যাক্টর না করেই আপনি একাধিক ক্লাসে একটি শ্রেণি বিভক্ত করতে পারেন বা আপনি বড় আকারের 500 লাইনের স্প্যাগেটি ক্লাস দিয়ে শেষ করতে চলেছেন এটি প্রয়োজনীয় essential আপনি যদি ইউনিট টেস্টিংয়ের সাথে আপনার ইউনিট হিসাবে পদ্ধতি বা ক্লাসগুলি চিকিত্সা করছেন তবে আপনি সম্ভবত অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং করছেন না তবে অবজেক্টের সাথে কিছু ধরণের মিউট্যান্ট ফাংশনাল প্রোগ্রামিং করছেন।

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

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

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

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