ফেকিং, বিদ্রূপ করা এবং স্টাবিংয়ের মধ্যে পার্থক্য কী?


704

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

আমি এগুলি কীভাবে ব্যবহার করি তা এখানে:

ভুয়া : এমন একটি শ্রেণি যা একটি ইন্টারফেস প্রয়োগ করে তবে এতে স্থির ডেটা এবং কোনও যুক্তি থাকে না। বাস্তবায়নের উপর নির্ভর করে কেবল "ভাল" বা "খারাপ" ডেটা দেয়।

মক : এমন একটি শ্রেণি যা একটি ইন্টারফেস প্রয়োগ করে এবং নির্দিষ্ট পদ্ধতি থেকে নিক্ষেপ করার জন্য ব্যতিক্রমগুলি ফেরত / ব্যতিক্রমগুলিকে গতিশীলভাবে সেট করার ক্ষমতা দেয় এবং নির্দিষ্ট পদ্ধতিগুলি বলা হয়েছে / না বলা হয়েছে কিনা তা খতিয়ে দেখার ক্ষমতা সরবরাহ করে।

স্টাব : মক ক্লাসের মতো, এটি পদ্ধতি যাচাই করা হয়েছে / ডেকেছে তা যাচাই করার ক্ষমতা সরবরাহ করে না except

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


6
ঠিক আছে আপনি মূলত আপনার "প্রশ্ন" এ সবই বলেছেন :) আমি মনে করি সেগুলি এই শর্তগুলির বেশ ভালভাবে গৃহীত সংজ্ঞা
ইরান গাল্পেরিন

2
ফেকের উইকিপিডিয়া সংজ্ঞা এর থেকে পৃথক, জোর দিয়ে যে একটি ফেক "সহজ বাস্তবায়ন হিসাবে ব্যবহৃত হয়, উদাহরণস্বরূপ সত্যিকারের ডাটাবেস অ্যাক্সেস না করে পরীক্ষাগুলিতে একটি মেমরি ডাটাবেস ব্যবহার করে)" en.wikedia.org/wiki/Test_double
জুমালাইফগার্ড

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

test.googleblog.com/2013/07/… (একটি সংক্ষিপ্ত এক পৃষ্ঠার সংক্ষিপ্তসার)।
শ্রীভাতসার

এখানে এটি ব্যাখ্যা করার জন্য আমার পদক্ষেপটি দেওয়া হচ্ছে: টেস্ট দ্বিগুণ: জাল, স্টাবস এবং মকস (উদাহরণ সহ ব্লগ পোস্ট)
মাইকেল-ঠোঁটস্কি

উত্তর:


547

আপনি কিছু তথ্য পেতে পারেন:

মক এবং স্টাব সম্পর্কে মার্টিন ফাউলারের কাছ থেকে

নকল বস্তুগুলিতে আসলে কার্যকরী বাস্তবায়ন থাকে তবে সাধারণত কিছু শর্টকাট নেয় যা এগুলি উত্পাদনের জন্য উপযুক্ত করে না

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

মোক আমরা এখানে যে বিষয়ে কথা বলছি তা হ'ল : প্রাক-প্রোগ্রামযুক্ত অবজেক্টগুলি প্রত্যাশাগুলি যা তারা যে কলগুলি প্রত্যাশা করা হবে তার একটি স্পেসিফিকেশন গঠন করে।

কুনিটিপ্যাটার্ন থেকে :

নকল : এসইউটি নির্ভর করে এমন একটি উপাদান দ্বারা সরবরাহ করা একই কার্যকারিতাটির খুব হালকা বাস্তবায়ন অর্জন করি বা তৈরি করি এবং এসইউটিকে বাস্তবের পরিবর্তে এটি ব্যবহারের নির্দেশ দেয়।

স্টাব : এই বাস্তবায়নটি এসইউটির মাধ্যমে মানগুলি (বা ব্যতিক্রমগুলি) যা অনুলিখিত কোডটি ব্যবহার করবে (এক্স পৃষ্ঠায় প্রোডাকশন বাগগুলি দেখুন) এর মাধ্যমে সাউটের কলগুলিতে সাড়া দেওয়ার জন্য কনফিগার করা হয়েছে। টেস্ট স্টাবটি ব্যবহারের জন্য একটি মূল ইঙ্গিতটি হ'ল এসইউটির অপ্রত্যক্ষ ইনপুটগুলি নিয়ন্ত্রণ করতে অক্ষমতার কারণে অনির্ধারিত কোড থাকে

মক অবজেক্ট যা SU (সিস্টেমের অধীনে টেস্ট সিস্টেম) নির্ভর করে এমন একটি বস্তু হিসাবে একই ইন্টারফেস প্রয়োগ করে। আমরা একটি মক অবজেক্টকে পর্যবেক্ষণের পয়েন্ট হিসাবে ব্যবহার করতে পারি যখন এসট-এর উপর চালিত পদ্ধতিগুলির পার্শ্ব প্রতিক্রিয়াগুলি পর্যালোচনা করতে অক্ষমতার কারণে একটি অনির্ধারিত প্রয়োজনীয়তা (পৃষ্ঠায় X প্রোডাকশন বাগগুলি দেখুন) এড়াতে আমাদের আচরণগত যাচাইকরণ করতে হবে।

ব্যক্তিগতভাবে

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


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

3
"আমি ব্যবহার করে সহজ করার চেষ্টা: মোক এবং স্টাব" এর জন্য +1। এটা বেশ ভাল ধারণা!
ব্র্যাড কাপিত

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

1
আমি এমএফের সংজ্ঞায় ফেক এবং মকের মধ্যে পার্থক্য দেখতে পাচ্ছি না।
আইডন্টকয়ারআউটআউটপুটপয়েন্টস

2
@ মুসুনাজি: এমএফ-এর সংজ্ঞায় কোনও নকলের কথোপকথনের বিষয়ে কোনও "প্রত্যাশা" নেই, অন্যথায় এর ইন্টারফেসটির বাস্তবায়ন রয়েছে। অন্যদিকে মোককে চ্যালেঞ্জ জানানো হবে (এই পদ্ধতিটি কি ডাকা হত?)
dbalakirev

204

স্টাব - এমন একটি বস্তু যা পদ্ধতি কলগুলির পূর্বনির্ধারিত উত্তর সরবরাহ করে।

মক - এমন একটি বস্তু যার উপর আপনি প্রত্যাশাগুলি সেট করেন।

জাল - সীমিত ক্ষমতা সহ একটি বস্তু (পরীক্ষার উদ্দেশ্যে) উদাহরণস্বরূপ একটি নকল ওয়েব পরিষেবা।

টেস্ট ডাবল হ'ল স্টাবস, মক এবং নকলের সাধারণ শব্দ। তবে অনানুষ্ঠানিকভাবে, আপনি প্রায়শই শুনতে পাবেন লোকেরা তাদের উপহাস বলে simply


4
এই প্রসঙ্গে "ডাবের উত্তর" কী কী আমাকে কেউ ব্যাখ্যা এবং সংজ্ঞা দিতে পারেন?
মাস্টারমাস্টিক

14
গণনা করা মানের চেয়ে একটি সুস্পষ্ট মান।
মাইক

অবশেষে! কিছু সংজ্ঞা আমি বুঝতে পারি! এই সংজ্ঞাগুলির ভিত্তিতে, তারপরে, গুগলতেস্ট (জেস্ট) / গুগলমক (জিএমক) মশকরা বস্তুগুলিকেও স্টাব হতে দেয়, কারণ আপনি এমন EXPECT_CALL()একটি উপহাস পদ্ধতিতে তৈরি করতে পারেন যা .WillOnce(Invoke(my_func_or_lambda_func))(অথবা সাথে .WillRepeatedly()) প্রকারটি ব্যবহার করে নির্দিষ্ট ইনপুটগুলির উপর ভিত্তি করে নির্দিষ্ট আউটপুটগুলিকে বাধ্য করে force সিনট্যাক্স একটি সংযুক্ত EXPECT_CALL()। ব্যবহারের কয়েকটি উদাহরণ Invoke()আমার দীর্ঘ উত্তরের নীচে এখানে অন্য প্রসঙ্গে দেখা যাবে: stackoverflow.com/a/60905880/4561887
গ্যাব্রিয়েল স্টেপলস

জিএমক ডকুমেন্টেশন Invoke()এখানে রয়েছে: github.com/google/googletest/blob/master/googlemock/docs/… । যাইহোক, উপসংহারটি হ'ল: গুগল মক (gmock) একজনকে সহজেই উভয় মক এবং স্টাব তৈরি করতে দেয় , যদিও বেশিরভাগ মক স্টাব নয় s
গ্যাব্রিয়েল স্ট্যাপলস

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

94

আমি অবাক হয়েছি যে এই প্রশ্নটি এত দিন ধরে রয়েছে এবং রায় ওশেরভের "দ্য আর্ট অফ ইউনিট টেস্টিং" এর উপর ভিত্তি করে কেউ এখনও কোনও উত্তর দেয়নি

"৩.১ স্ট্রাবস স্ট্রাবস" -তে একটি স্টাবকে এইভাবে সংজ্ঞায়িত করা হয়েছে:

সিস্টেমে বিদ্যমান নির্ভরতা (বা সহযোগী) এর জন্য স্টাব একটি নিয়ন্ত্রণযোগ্য প্রতিস্থাপন। স্টাব ব্যবহার করে আপনি সরাসরি নির্ভরতার সাথে ডিল না করে আপনার কোডটি পরীক্ষা করতে পারেন।

এবং স্টাবস এবং মকসের মধ্যে পার্থক্যটিকে এভাবে সংজ্ঞায়িত করে:

মোকস বনাম স্টাবগুলি সম্পর্কে মনে রাখার প্রধান বিষয় হ'ল মকগুলি হ'ল স্টাবের মতো, তবে আপনি মক অবজেক্টের বিরুদ্ধে দৃsert়ভাবে দাবি করেন, যেখানে আপনি কোনও স্টাবের বিরুদ্ধে দৃ .়তা প্রদর্শন করেন না।

ভুয়া শুধুমাত্র স্টাব এবং মক উভয়ের জন্য ব্যবহৃত নাম। উদাহরণস্বরূপ, যখন আপনি স্টাব এবং উপহাসের মধ্যে পার্থক্য সম্পর্কে চিন্তা করবেন না।

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

  • যখন আপনার পরীক্ষা পরীক্ষার অধীনে ক্লাসে মানগুলি পরীক্ষা করে, বা আসলে যে কোনও জায়গায় নকল হয় তবে জালটি স্টাব হিসাবে ব্যবহৃত হত। এটি কেবল পরীক্ষার অধীনে শ্রেণীর জন্য ব্যবহারের মান সরবরাহ করেছে, হয় সরাসরি কল করার মাধ্যমে ফিরে আসা মূল্যগুলির মাধ্যমে বা পরোক্ষভাবে এর উপর কল করার ফলে পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে (কোনও কোনও ক্ষেত্রে)।
  • যখন আপনার পরীক্ষাটি জালটির মানগুলি পরীক্ষা করে, এটি একটি উপহাস হিসাবে ব্যবহৃত হয়েছিল।

ফেকএক্স ক্লাসটি স্টাব হিসাবে ব্যবহৃত হয় এমন পরীক্ষার উদাহরণ:

const pleaseReturn5 = 5;
var fake = new FakeX(pleaseReturn5);
var cut = new ClassUnderTest(fake);

cut.SquareIt;

Assert.AreEqual(25, cut.SomeProperty);

fakeকারণ উদাহরণস্বরূপ অসম্পূর্ণ হিসেবে ব্যবহার করা হয় Assertব্যবহার করে নাfake এ সব।

পরীক্ষার দশম যেখানে পরীক্ষা দশমকে উপহাস হিসাবে ব্যবহৃত হয়:

const pleaseReturn5 = 5;
var fake = new FakeX(pleaseReturn5);
var cut = new ClassUnderTest(fake);

cut.SquareIt;

Assert.AreEqual(25, fake.SomeProperty);

এই ক্ষেত্রে Assertএকটি মান পরীক্ষা করে দেখুনfake একটি উপহাস বানিয়ে, দেখায়।

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

আমি ওশেরভের সাথে একমত

খাঁটি রক্ষণাবেক্ষণের দৃষ্টিকোণ থেকে, আমার পরীক্ষায় মক ব্যবহার করে না ব্যবহারের চেয়ে আরও বেশি সমস্যা তৈরি করে। এটি আমার অভিজ্ঞতা হয়েছে তবে আমি সবসময় নতুন কিছু শিখি।

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

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

এখানে সংজ্ঞায়িত হিসাবে আপনার উপহাসগুলি কেন এড়ানো উচিত তা মজাদার জন্য, "ফওলার মকবিদ ক্ল্যাসিক" এর জন্য গুগল। আপনি মতামত একটি আধিকারিক খুঁজে পাবেন।


30

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

এই জিনিসগুলি কীভাবে আলাদা তার দিকে মনোনিবেশ করার পরিবর্তে , আমি মনে করি কেন এগুলি স্বতন্ত্র ধারণা on প্রতিটি পৃথক উদ্দেশ্যে বিদ্যমান।

fakes

একটি জাল একটি বাস্তবায়ন যা "প্রাকৃতিকভাবে" আচরণ করে তবে এটি "আসল" নয়। এগুলি অস্পষ্ট ধারণা এবং তাই বিভিন্ন জিনিসগুলিকে কী জিনিস নকল করে তোলে তার আলাদা বোঝাপড়া থাকে।

জাল একটি উদাহরণ একটি ইন-মেমরি ডাটাবেস (যেমন স্টোরের সাথে স্ক্লাইট ব্যবহার করা :memory:)। আপনি এটি কখনই উত্পাদনের জন্য ব্যবহার করবেন না (যেহেতু ডেটা বজায় থাকে না) তবে এটি পরীক্ষার পরিবেশে ব্যবহার করার জন্য ডাটাবেস হিসাবে পুরোপুরি পর্যাপ্ত। এটি একটি "রিয়েল" ডাটাবেসের তুলনায় অনেক বেশি লাইটওয়েট।

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

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

জালির উদ্দেশ্য পরীক্ষার অধীনে সিস্টেমের আচরণকে প্রভাবিত করা নয় , বরং পরীক্ষার বাস্তবায়ন (অপ্রয়োজনীয় বা হেভিওয়েট নির্ভরতা অপসারণ করে) সহজ করা।

নিবন্ধসমূহ

একটি শহরের উপর অসম্পূর্ণ নিবন্ধ একটি বাস্তবায়ন যে আচরণ করবে "চরম নিষ্ঠুরভাবে" হয়। নির্দিষ্ট আউটপুটগুলির সাথে নির্দিষ্ট ইনপুটগুলিতে প্রতিক্রিয়া জানাতে পূর্বনির্ধারিত হয় (সাধারণত টেস্ট সেটআপ দ্বারা)।

স্টাবের উদ্দেশ্য হ'ল আপনার সিস্টেমটিকে একটি নির্দিষ্ট অবস্থায় পরীক্ষার অধীনে নিয়ে যাওয়া। উদাহরণস্বরূপ, যদি আপনি কিছু কোড যা বিশ্রাম এপিআই সাথে মিথস্ক্রিয়া, আপনি পারে একটি পরীক্ষামূলক লিখছেন যদি আউট শহরের উপর অসম্পূর্ণ নিবন্ধ বিশ্রাম এপিআই একটি API যে সবসময় একটি ক্যানড প্রতিক্রিয়া, বা একটি নির্দিষ্ট ত্রুটি সহ একটি API অনুরোধ যে সাড়া ফেরৎ সঙ্গে। এই পদ্ধতিতে আপনি কীভাবে পরীক্ষাগুলি লিখতে পারেন যা সিস্টেমগুলি এই রাজ্যে কীভাবে প্রতিক্রিয়া দেখায় তা জোর করে; উদাহরণস্বরূপ, যদি এআইপি 404 ত্রুটি ফেরত দেয় তবে আপনার ব্যবহারকারীরা যে প্রতিক্রিয়া পান তা পরীক্ষা করে।

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

ঠাট্টা

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

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

মোকগুলি মিথস্ক্রিয়া পরীক্ষার সাথে যুক্ত , যা একটি নির্দিষ্ট পরীক্ষার পদ্ধতি। যে সমস্ত লোকেরা সিস্টেমের মিথস্ক্রিয়ের চেয়ে সিস্টেমের অবস্থা পরীক্ষা করতে পছন্দ করে তারা যদি কিছু না হয় তবে কিছুটা উপচে পড়বে ocks

টেস্ট দ্বিগুণ

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


11

স্টাব এবং উপহাসের ব্যবহার চিত্রিত করার জন্য, আমি রায় ওশেরভের " দ্য আর্ট অফ ইউনিট টেস্টিং " এর উপর ভিত্তি করে একটি উদাহরণও অন্তর্ভুক্ত করতে চাই ।

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

আমরা লগএনালাইজারের ভিতরে পরীক্ষা করতে চাই সেই যুক্তিটি এখানে:

if(fileName.Length<8)
{
 try
  {
    service.LogError("Filename too short:" + fileName);
  }
 catch (Exception e)
  {
    email.SendEmail("a","subject",e.Message);
  }
}

আপনি কীভাবে পরীক্ষা করবেন যে ওয়েব সার্ভিস একটি ব্যতিক্রম ছুঁড়ে মারলে লগআনলাইজার ইমেল পরিষেবাটিকে সঠিকভাবে কল করে? আমরা যে প্রশ্নগুলির মুখোমুখি হয়েছি তা এখানে:

  • কীভাবে আমরা ওয়েব পরিষেবা প্রতিস্থাপন করতে পারি?

  • আমরা কীভাবে ওয়েব পরিষেবা থেকে একটি ব্যতিক্রম অনুকরণ করতে পারি যাতে আমরা ইমেল পরিষেবাটিতে কলটি পরীক্ষা করতে পারি?

  • আমরা কীভাবে জানব যে ইমেল পরিষেবাটি সঠিকভাবে বলা হয়েছিল বা আদৌ?

ওয়েব পরিষেবাটির জন্য একটি স্টাব ব্যবহার করে আমরা প্রথম দুটি প্রশ্নের মোকাবিলা করতে পারি । তৃতীয় সমস্যা সমাধানের জন্য, আমরা ইমেল পরিষেবাটির জন্য একটি মক অবজেক্টটি ব্যবহার করতে পারি ।

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

[TestFixture]
public class LogAnalyzer2Tests
{
[Test]
 public void Analyze_WebServiceThrows_SendsEmail()
 {
   StubService stubService = new StubService();
   stubService.ToThrow= new Exception("fake exception");
   MockEmailService mockEmail = new MockEmailService();

   LogAnalyzer2 log = new LogAnalyzer2();
   log.Service = stubService
   log.Email=mockEmail;
   string tooShortFileName="abc.ext";
   log.Analyze(tooShortFileName);

   Assert.AreEqual("a",mockEmail.To); //MOCKING USED
   Assert.AreEqual("fake exception",mockEmail.Body); //MOCKING USED
   Assert.AreEqual("subject",mockEmail.Subject);
 }
}

9

আপনি যে জিনিসটিতে এটি দৃsert়ভাবে বলে থাকেন, তাকে মক অবজেক্ট বলা হয় এবং যা কিছু পরীক্ষা চালাতে সাহায্য করেছিল, তা হ'ল স্টাব


1
অন্য উত্তরগুলির দুর্দান্ত বিবরণ রয়েছে এবং সত্যই ভাল। পার্থক্যটি তৈরি করা এইটিকে এটি এত স্পষ্ট এবং সহজ করে তোলে, এটি উত্সাহিত করা শক্ত নয়। GJ!
মারিও গার্সিয়া

6

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


6

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

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


2

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

public class MyUnitTest {

 @Test
 public void testConcatenate() {
  StubDependency stubDependency = new StubDependency();
  int result = stubDependency.toNumber("one", "two");
  assertEquals("onetwo", result);
 }
}

public class StubDependency() {
 public int toNumber(string param) {
  if (param == “one”) {
   return 1;
  }
  if (param == “two”) {
   return 2;
  }
 }
}

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

public class MockADependency {

 private int ShouldCallTwice;
 private boolean ShouldCallAtEnd;
 private boolean ShouldCallFirst;

 public int StringToInteger(String s) {
  if (s == "abc") {
   return 1;
  }
  if (s == "xyz") {
   return 2;
  }
  return 0;
 }

 public void ShouldCallFirst() {
  if ((ShouldCallTwice > 0) || ShouldCallAtEnd)
   throw new AssertionException("ShouldCallFirst not first thod called");
  ShouldCallFirst = true;
 }

 public int ShouldCallTwice(string s) {
  if (!ShouldCallFirst)
   throw new AssertionException("ShouldCallTwice called before ShouldCallFirst");
  if (ShouldCallAtEnd)
   throw new AssertionException("ShouldCallTwice called after ShouldCallAtEnd");
  if (ShouldCallTwice >= 2)
   throw new AssertionException("ShouldCallTwice called more than twice");
  ShouldCallTwice++;
  return StringToInteger(s);
 }

 public void ShouldCallAtEnd() {
  if (!ShouldCallFirst)
   throw new AssertionException("ShouldCallAtEnd called before ShouldCallFirst");
  if (ShouldCallTwice != 2) throw new AssertionException("ShouldCallTwice not called twice");
  ShouldCallAtEnd = true;
 }

}

2

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

আমি মনে করি এটি দুটি পদ্ধতির মধ্যে পার্থক্য করা গুরুত্বপূর্ণ: - আচরণের বৈধতা (আচরণের বিকল্পকে বোঝায়) - শেষ-রাষ্ট্রের বৈধতা (আচরণের অনুকরণকে বোঝায়)

ত্রুটির ক্ষেত্রে ইমেল প্রেরণ বিবেচনা করুন। যখন আচরণ বৈধতা করছেন - আপনি যে পদ্ধতি পরীক্ষা Sendএর IEmailSenderএকবার মৃত্যুদন্ড কার্যকর করা হয়। এবং আপনাকে এই পদ্ধতির রিটার্নের ফলাফল অনুকরণ করতে হবে, প্রেরিত বার্তার আইডি রিটার্ন করুন। সুতরাং আপনি বলেছেন: "আমি প্রত্যাশা করি যে এটি কল Sendহবে। এবং আমি কেবল কোনও কলের জন্য ডামি (বা এলোমেলো) আইডি ফিরিয়ে দেব" । এটি আচরণের বৈধতা: emailSender.Expect(es=>es.Send(anyThing)).Return((subject,body) => "dummyId")

রাষ্ট্রীয় যাচাইকরণ করার সময় আপনাকে TestEmailSenderসেই সরঞ্জামগুলি তৈরি করতে হবে IEmailSender। এবং Sendপদ্ধতিটি প্রয়োগ করুন - কিছু ডেটা স্ট্রাকচারে ইনপুট সংরক্ষণ করে যা ভবিষ্যতের কিছু রাষ্ট্রের যাচাইকরণের জন্য ব্যবহার করা হবে যেমন কিছু বস্তুর অ্যারে SentEmailsএবং তারপরে এটি পরীক্ষা করে আপনি পরীক্ষা করে SentEmailsযা প্রত্যাশিত ইমেল রয়েছে। এটি রাষ্ট্রীয় বৈধতা: Assert.AreEqual(1, emailSender.SentEmails.Count)

আমার পড়া থেকে আমি বুঝতে পারি যে আচরণের বৈধতা সাধারণত মকস বলে । আর রাজ্য বৈধতা সাধারণত বলা নিবন্ধসমূহ বা fakes


সত্যই ভাল বিশদ এবং খাস্তা।
shyam sundar singh tomar

0

fake objectইন্টারফেস (প্রোটোকল) একটি বাস্তব বাস্তবায়ন বা কোনো উত্তরাধিকার বা অন্যান্য পন্থা যা তৈরি করতে ব্যবহার করা যেতে পারে ব্যবহার প্রসারিত হয় হয় নির্ভরতা। সাধারণত এটি কিছু নির্ভরতা বিকল্পের সহজ সমাধান হিসাবে বিকাশকারী দ্বারা তৈরি করা হয়

stub objectএকটি খালি object (0, শূন্য এবং যুক্তিবিদ্যা ছাড়া পদ্ধতি) সাথে এবং অতিরিক্ত এবং পূর্বনির্ধারিত (বিকাশকারীর দ্বারা) রাষ্ট্রপ্রত্যাবর্তিত মানগুলি সংজ্ঞায়িত করার জন্যসাধারণত এটি কাঠামোর দ্বারা তৈরি করা হয়

mock objectএর সাথে খুব মিল, stub objectতবে কিছু ঘটেছে কিনা তা পরীক্ষা করার জন্য প্রোগ্রামের প্রয়োগের সময় অতিরিক্ত অবস্থা পরিবর্তন করা হয় (পদ্ধতিটি বলা হয়েছিল)।

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