SavePeople () এর ইউনিট পরীক্ষা করা উচিত
হ্যাঁ, এটা করা উচিত। তবে এমনভাবে আপনার পরীক্ষার শর্তগুলি লেখার চেষ্টা করুন যা বাস্তবায়ন থেকে স্বতন্ত্র। উদাহরণস্বরূপ, আপনার ব্যবহারের উদাহরণটিকে ইউনিট পরীক্ষায় রূপান্তর করা:
function testSavePeople() {
myDataStore = new Store('some connection string', 'password');
myPeople = ['Joe', 'Maggie', 'John'];
savePeople(myDataStore, myPeople);
assert(myDataStore.containsPerson('Joe'));
assert(myDataStore.containsPerson('Maggie'));
assert(myDataStore.containsPerson('John'));
}
এই পরীক্ষাটি একাধিক জিনিস করে:
- এটি ফাংশনের চুক্তি যাচাই করে
savePeople()
- এটি বাস্তবায়নের বিষয়ে চিন্তা করে না
savePeople()
- এটি উদাহরণ ব্যবহারের দলিল করে
savePeople()
মনে রাখবেন যে আপনি এখনও স্টোরটিকে স্টক / স্টাব / নকল করতে পারেন। এই ক্ষেত্রে আমি সুস্পষ্ট ফাংশন কলগুলি পরীক্ষা করব না, তবে অপারেশনের ফলাফলের জন্য। এইভাবে আমার পরীক্ষা ভবিষ্যতের পরিবর্তনগুলি / পুনরুদ্ধারকারীদের জন্য প্রস্তুত।
উদাহরণস্বরূপ, আপনার ডেটা স্টোর বাস্তবায়ন saveBulkPerson()
ভবিষ্যতে কোনও পদ্ধতি সরবরাহ করতে পারে - এখন savePeople()
ব্যবহারের বাস্তবায়নের পরিবর্তনটি saveBulkPerson()
ইউনিট পরীক্ষা যতক্ষণ saveBulkPerson()
প্রত্যাশা অনুযায়ী কাজ করবে না ভাঙবে । এবং যদি saveBulkPerson()
কোনওরকম প্রত্যাশার মতো কাজ না করে তবে আপনার ইউনিট পরীক্ষাটি এটি ধরবে।
বা এই জাতীয় পরীক্ষাগুলি প্রতিটি ভাষার নির্মাণের জন্য অন্তর্নির্মিত পরীক্ষার পরিমাণ হবে?
যেমনটি বলা হয়েছে, প্রত্যাশিত ফলাফল এবং ফাংশন ইন্টারফেসের জন্য পরীক্ষার চেষ্টা করুন, বাস্তবায়নের জন্য নয় (যদি না আপনি ইন্টিগ্রেশন টেস্টগুলি করেন - তবে নির্দিষ্ট ফাংশন কলগুলি ধরা কার্যকর হতে পারে)। যদি কোনও ক্রিয়াকলাপ বাস্তবায়নের একাধিক উপায় থাকে তবে সেগুলির সকলেরই আপনার ইউনিট পরীক্ষা দিয়ে কাজ করা উচিত।
আপনার প্রশ্নের আপডেট সম্পর্কে:
রাষ্ট্র পরিবর্তনের পরীক্ষা! যেমন ময়দার কিছু ব্যবহার করা হবে। আপনার বাস্তবায়ন অনুসারে, জোর দিয়ে বলুন যে ব্যবহারের পরিমাণটি dough
ফিট করে pan
বা dough
এটি ব্যবহৃত হয়েছে তা জোড় করে। দাবী করে যে, pan
ফাংশন কল পর কুকিজ ধারণ করে। পূর্বের মতো oven
খালি / একই অবস্থায় রয়েছে তা জোর দিয়ে দিন।
অতিরিক্ত পরীক্ষার জন্য, প্রান্তের মামলাগুলি যাচাই করুন: oven
কল করার আগে যদি খালি না থাকে তবে কী ঘটবে ? পর্যাপ্ত পরিমাণ না থাকলে কী হয় dough
? যদি pan
ইতিমধ্যে পূর্ণ হয়?
ময়দা, প্যান এবং চুলা বস্তু থেকে এই পরীক্ষাগুলির জন্য প্রয়োজনীয় সমস্ত ডেটা আপনি সরিয়ে নিতে সক্ষম হবেন। ফাংশন কলগুলি ক্যাপচার করার দরকার নেই। ফাংশনটি এমন আচরণ করুন যেন এর বাস্তবায়ন আপনার কাছে পাওয়া না যায়!
আসলে, বেশিরভাগ টিডিডি ব্যবহারকারীরা ফাংশনটি লেখার আগে তাদের পরীক্ষাগুলি লেখেন যাতে তারা প্রকৃত বাস্তবায়নের উপর নির্ভর করে না dependent
আপনার সর্বশেষ সংযোজনের জন্য:
যখন কোনও ব্যবহারকারী একটি নতুন অ্যাকাউন্ট তৈরি করে, তখন অনেকগুলি জিনিস হওয়া দরকার: 1) ডাটাবেজে নতুন ব্যবহারকারী রেকর্ড তৈরি করা দরকার 2) একটি স্বাগত ইমেল প্রেরণ করা প্রয়োজন 3) ব্যবহারকারীর আইপি ঠিকানা জালিয়াতির জন্য রেকর্ড করা দরকার উদ্দেশ্য।
সুতরাং আমরা একটি পদ্ধতি তৈরি করতে চাই যা সমস্ত "নতুন ব্যবহারকারী" পদক্ষেপের সাথে একত্রিত হয়:
function createNewUser(validatedUserData, emailService, dataStore) {
userId = dataStore.insertUserRecord(validateduserData);
emailService.sendWelcomeEmail(validatedUserData);
dataStore.recordIpAddress(userId, validatedUserData.ip);
}
এই আমি উপহাস করবে / শহরের উপর অসম্পূর্ণ নিবন্ধ / জাল মত একটি ফাংশন (যাই হোক না কেন আরো সাধারণ বলে মনে হয়) এর জন্য dataStore
এবং emailService
প্যারামিটার। এই ফাংশনটি নিজেই কোনও পরামিতিগুলিতে কোনও রাষ্ট্রীয় স্থানান্তর করে না, এটি তাদের কয়েকটি পদ্ধতির জন্য তাদেরকে অর্পণ করে। আমি যাচাই করতে চেষ্টা করব যে ফাংশনে কলটি 4 টি কাজ করেছে:
- এটি ডেটা স্টোরটিতে একটি ব্যবহারকারীর প্রবেশ করিয়েছে
- এটি একটি স্বাগত ইমেল প্রেরণ করেছে (বা কমপক্ষে সংশ্লিষ্ট পদ্ধতিটিকে বলা হয়)
- এটি ব্যবহারকারীদের আইপি ডাটা স্টোরের মধ্যে রেকর্ড করে
- এটি যে কোনও ব্যতিক্রম / ত্রুটির মুখোমুখি হয়েছিল (যদি থাকে)
প্রথম 3 টি চেক মক, স্টাব বা নকল dataStore
এবং emailService
(পরীক্ষার সময় আপনি সত্যিই ইমেলগুলি প্রেরণ করতে চান না) দিয়ে করা যেতে পারে। যেহেতু আমাকে কয়েকটি মন্তব্যের জন্য এটি সন্ধান করতে হয়েছিল, এই পার্থক্যগুলি:
- একটি নকল এমন একটি বস্তু যা মূল হিসাবে একই রকম আচরণ করে এবং একটি নির্দিষ্ট পরিমাণে অবিচ্ছেদ্য। এর কোডটি সাধারণত টেস্ট জুড়ে পুনরায় ব্যবহার করা যেতে পারে। এটি উদাহরণস্বরূপ, একটি ডাটাবেস মোড়কের জন্য একটি সাধারণ ইন-মেমরি ডাটাবেস হতে পারে।
- এই পরীক্ষার প্রয়োজনীয় ক্রিয়াকলাপগুলি সম্পাদনের জন্য একটি স্টাব কেবল প্রয়োজনীয় প্রয়োগ করে। বেশিরভাগ ক্ষেত্রে, একটি স্টাব একটি পরীক্ষা বা পরীক্ষার একটি গ্রুপের সাথে সুনির্দিষ্ট যা মূলগুলির পদ্ধতিগুলির কেবলমাত্র একটি ছোট সেট প্রয়োজন। এই উদাহরণে এটি এমন একটি হতে পারে
dataStore
যা কেবলমাত্র insertUserRecord()
এবং এর উপযুক্ত সংস্করণ প্রয়োগ করে recordIpAddress()
।
- মক হ'ল একটি বস্তু যা আপনাকে এটি কীভাবে ব্যবহৃত হয় তা যাচাই করতে দেয় (প্রায়শই আপনাকে এর পদ্ধতিতে কলগুলি মূল্যায়নের মাধ্যমে)। আমি তাদের ইউনিট পরীক্ষায় অল্প পরিমাণে ব্যবহার করার চেষ্টা করবো যেহেতু এগুলি ব্যবহার করে আপনি প্রকৃতপক্ষে তার ইন্টারফেসের আনুগত্যটি নয় ফাংশন বাস্তবায়ন পরীক্ষা করার চেষ্টা করেন, তবে তাদের এখনও ব্যবহার রয়েছে। আপনার প্রয়োজন কেবল মক তৈরিতে সহায়তা করার জন্য অনেকগুলি মক ফ্রেমওয়ার্ক রয়েছে।
মনে রাখবেন যে এর মধ্যে যে কোনও একটি পদ্ধতি ত্রুটি ছুঁড়ে ফেলেছে, আমরা ত্রুটিটি কলিং কোডে বুদবুদ করতে চাই, যাতে এটি ততোধিক ফিট হিসাবে দেখা যায় handle যদি এটি এপিআই কোড দ্বারা কল করা হয় তবে এটি ত্রুটিটিকে একটি উপযুক্ত এইচটিটিপি প্রতিক্রিয়া কোডে অনুবাদ করতে পারে। এটি যদি কোনও ওয়েব ইন্টারফেস দ্বারা ডাকা হয়, তবে এটি ত্রুটিটি ব্যবহারকারীকে প্রদর্শিত উপযুক্ত বার্তায় অনুবাদ করতে পারে। মুল বক্তব্যটি হ'ল এই ফাংশনটি কীভাবে ত্রুটি ছুঁড়ে ফেলা হতে পারে তা পরিচালনা করতে জানে না।
প্রত্যাশিত ব্যতিক্রম / ত্রুটিগুলি বৈধ পরীক্ষার কেস: আপনি নিশ্চিত করেন যে এই জাতীয় ঘটনা ঘটলে ফাংশনটি আপনার প্রত্যাশা মতো আচরণ করে। এটি যখন চান তখন সংশ্লিষ্ট মক / নকল / স্টাব বস্তুকে ফেলে দিয়ে অর্জন করা যায়।
আমার বিভ্রান্তির সারমর্মটি হ'ল এই জাতীয় ক্রিয়াকলাপটি পরীক্ষা করার জন্য পরীক্ষায় নিজেই সঠিক প্রয়োগের পুনরাবৃত্তি করা প্রয়োজন বলে মনে হয় (নির্দিষ্ট পদ্ধতিতে পদ্ধতিগুলিকে মককে ডাকা হয় বলে উল্লেখ করে) এবং এটি ভুল বলে মনে হয়।
কখনও কখনও এটি করতে হবে (যদিও আপনি ইন্টিগ্রেশন পরীক্ষায় বেশিরভাগ ক্ষেত্রে এটি যত্নশীল হন)। প্রায়শই, প্রত্যাশিত পার্শ্ব প্রতিক্রিয়া / রাষ্ট্র পরিবর্তনগুলি যাচাই করার অন্যান্য উপায় রয়েছে।
সঠিক ফাংশন কলগুলি যাচাইকরণের পরিবর্তে ভঙ্গুর ইউনিট পরীক্ষার ব্যবস্থা করে: মূল ফাংশনে কেবলমাত্র ছোট পরিবর্তনই ব্যর্থ হয়। এটি পছন্দসই বা নাও হতে পারে তবে আপনি যখনই কোনও ফাংশন পরিবর্তন করেন তখন এটি সম্পর্কিত ইউনিট টেস্টে পরিবর্তন দরকার (এটি রিফ্যাক্টরিং, অপ্টিমাইজিং, বাগ ফিক্সিং, ...)।
দুঃখের বিষয়, সেই ক্ষেত্রে ইউনিট পরীক্ষাটি তার কিছু বিশ্বাসযোগ্যতা হারিয়ে ফেলে: যেহেতু এটি পরিবর্তন করা হয়েছিল, পরিবর্তনটি আগের মতো আচরণ করার পরে এটি কার্যকারিতাটি নিশ্চিত করে না।
উদাহরণস্বরূপ, oven.preheat()
আপনার কুকি বেকিং উদাহরণে কাউকে (অনুকূলকরণ!) একটি কল যুক্ত করার বিষয়টি বিবেচনা করুন :
- যদি আপনি চুলা বস্তুটিকে উপহাস করে থাকেন তবে এটি কলটি প্রত্যাশা করবে না এবং পরীক্ষায় ব্যর্থ হবে, যদিও পদ্ধতিটির পর্যবেক্ষণযোগ্য আচরণটি পরিবর্তন হয়নি (আশা করি আপনার কাছে এখনও কুকিজের একটি প্যান রয়েছে)।
- আপনি কেবল পরীক্ষার জন্য যে পদ্ধতিগুলি যুক্ত করেছেন বা কিছু ছদ্মবেশী পদ্ধতি সহ পুরো ইন্টারফেস যুক্ত করেছেন কিনা তার উপর নির্ভর করে একটি স্টাব ব্যর্থ বা নাও হতে পারে।
- একটি জাল ব্যর্থ হবে না, যেহেতু এটি পদ্ধতিটি কার্যকর করা উচিত (ইন্টারফেস অনুযায়ী)
আমার ইউনিট পরীক্ষায়, আমি যথাসম্ভব সাধারণ হওয়ার চেষ্টা করি: যদি বাস্তবায়ন পরিবর্তন হয় তবে দৃশ্যমান আচরণ (কলারের দৃষ্টিকোণ থেকে) এখনও একই থাকে, আমার পরীক্ষাগুলি পাস হওয়া উচিত। আদর্শভাবে, আমি কেবলমাত্র বিদ্যমান ইউনিট পরীক্ষা পরিবর্তন করতে হবে তা কেবল বাগ ফিক্স হওয়া উচিত (পরীক্ষার, পরীক্ষার অধীনে ফাংশনটি নয়)।