আমি টেস্টিংয়ে মজাদার বনাম স্টাবিং সম্পর্কিত বিভিন্ন নিবন্ধ পড়েছি, যার মধ্যে মার্টিন ফওলারের মকস আরেনট স্টাবস নেই , তবে তবুও পার্থক্যটি বুঝতে পারছি না।
আমি টেস্টিংয়ে মজাদার বনাম স্টাবিং সম্পর্কিত বিভিন্ন নিবন্ধ পড়েছি, যার মধ্যে মার্টিন ফওলারের মকস আরেনট স্টাবস নেই , তবে তবুও পার্থক্যটি বুঝতে পারছি না।
উত্তর:
অসম্পূর্ণ
আমি বিশ্বাস করি সবচেয়ে বড় পার্থক্য হ'ল আপনি ইতিমধ্যে পূর্বনির্ধারিত আচরণ দিয়ে লিখেছেন এমন স্টাব। সুতরাং আপনার কাছে এমন একটি শ্রেণি থাকবে যা নির্ভরতা প্রয়োগ করে (সম্ভবত বিমূর্ত শ্রেণি বা ইন্টারফেস) আপনি পরীক্ষার উদ্দেশ্যে ফেক করছেন এবং পদ্ধতিগুলি কেবল সেট প্রতিক্রিয়া দিয়ে স্টাব করে দেওয়া হবে। তারা অভিনব কিছু করবে না এবং আপনি ইতিমধ্যে আপনার পরীক্ষার বাইরে এর জন্য স্ট্যাবড কোডটি লিখে রেখেছিলেন।
উপহাস
মক হ'ল এমন একটি জিনিস যা আপনার পরীক্ষার অংশ হিসাবে আপনার প্রত্যাশা নিয়ে সেটআপ করতে হয়। একটি মক একটি পূর্বনির্ধারিত উপায়ে সেটআপ করা হয় না যাতে আপনার কোড থাকে যা এটি আপনার পরীক্ষায় করে। কোনও উপায়ে মকস রানটাইমে নির্ধারিত হয় যেহেতু কোডগুলি প্রত্যাশাগুলি সেট করে যে তারা কিছু করার আগেই চালিত হবে।
মোক এবং স্টাবগুলির মধ্যে পার্থক্য
মোক নিয়ে লেখা টেস্টগুলি সাধারণত initialize -> set expectations -> exercise -> verify
পরীক্ষার একটি ধরণ অনুসরণ করে । প্রাক লিখিত স্টাব একটি অনুসরণ করবে initialize -> exercise -> verify
।
মকস এবং স্টাবসের মধ্যে সাদৃশ্য
উভয়ের উদ্দেশ্য হ'ল একটি শ্রেণি বা ক্রিয়াকলাপের সমস্ত নির্ভরতা পরীক্ষা করা বাদ দেওয়া যাতে আপনার পরীক্ষাগুলি আরও প্রমাণিত করার চেষ্টা করে যা আরও বেশি কেন্দ্রীভূত এবং সহজ হয়।
বস্তুর বেশ কয়েকটি সংজ্ঞা রয়েছে, এটি বাস্তব নয়। সাধারণ শব্দটি পরীক্ষার দ্বিগুণ । এই শব্দটি অন্তর্ভুক্ত: ডামি , জাল , স্টাব , মক ।
মার্টিন ফোলারের নিবন্ধ অনুসারে :
- ডামি অবজেক্টগুলি চারপাশে পাস হলেও বাস্তবে কখনও ব্যবহৃত হয় না। সাধারণত এগুলি কেবলমাত্র প্যারামিটারের তালিকা পূরণ করতে ব্যবহৃত হয়।
- নকল বস্তুগুলিতে আসলে কার্যকরী বাস্তবায়ন থাকে তবে সাধারণত কিছু শর্টকাট নেয় যা এগুলি উত্পাদনের জন্য উপযুক্ত করে না (মেমরিের ডাটাবেসে একটি ভাল উদাহরণ)।
- স্টাবগুলি পরীক্ষার সময় করা কলগুলিতে ক্যানড উত্তর সরবরাহ করে, সাধারণত পরীক্ষার জন্য কী কী প্রোগ্রাম করা হয় তার বাইরে কিছুতেই সাড়া দেয় না। স্টাবগুলি কল সম্পর্কিত তথ্যও রেকর্ড করতে পারে, যেমন একটি ইমেল গেটওয়ে স্টাব যা এটি 'প্রেরিত' বার্তাগুলি মনে রাখে বা কেবল এটি কতগুলি বার্তা 'প্রেরণ' করেছিল তা মনে রাখে।
- মোক আমরা এখানে যে বিষয়ে কথা বলছি তা হ'ল : প্রাক-প্রোগ্রামযুক্ত অবজেক্টগুলি প্রত্যাশাগুলি যা তারা যে কলগুলি প্রত্যাশা করা হবে তার একটি স্পেসিফিকেশন গঠন করে।
মোকস বনাম স্টাবস = আচরণগত পরীক্ষা বনাম স্টেট টেস্টিং
টেস্টের নীতি অনুসারে প্রতি পরীক্ষায় কেবল একটি জিনিস , একটি পরীক্ষায় বেশ কয়েকটি স্টাব থাকতে পারে তবে সাধারণত একটি মক থাকে।
স্টাবগুলি সহ জীবনকাল পরীক্ষা করুন:
উপহাসের সাথে জীবনকাল পরীক্ষা করুন:
উভয় মোক এবং স্টাব পরীক্ষা এই প্রশ্নের উত্তর দেয়: ফলাফল কী?
মোক নিয়ে পরীক্ষাও আগ্রহী: ফলাফল কীভাবে অর্জিত হয়েছে?
স্টাব একটি সাধারণ জাল বস্তু। এটি কেবল নিশ্চিত করে যে পরীক্ষাটি সহজেই চলছে runs
মক হ'ল স্মার্ট স্টাব ub আপনি নিজের পরীক্ষাটি যাচাই করেছেন।
এখানে বাস্তব জগতের নমুনা সহ প্রতিটি একের বিবরণ।
ডামি - সন্তুষ্ট করার জন্য কেবল বোগাস মান API
।
উদাহরণ : আপনি যদি কোনও শ্রেণীর এমন কোনও পদ্ধতি পরীক্ষা করছেন যা কোনও কনস্ট্রাক্টরে অনেক বাধ্যতামূলক পরামিতিগুলির প্রয়োজন যা আপনার পরীক্ষার কোনও প্রভাব রাখে না , তবে আপনি কোনও শ্রেণীর নতুন উদাহরণ তৈরি করার উদ্দেশ্যে ডামি অবজেক্ট তৈরি করতে পারেন।
ভুয়া - এমন কোনও শ্রেণীর একটি পরীক্ষামূলক বাস্তবায়ন তৈরি করুন যা কিছু বাহ্যিক অবকাঠামোর উপর নির্ভরশীলতা থাকতে পারে। (এটি ভাল অনুশীলন যে আপনার ইউনিট পরীক্ষাটি বাহ্যিক অবকাঠামোতে আসলে ইন্টারঅ্যাক্ট করে না ))
উদাহরণ : একটি ডাটাবেস অ্যাক্সেসের জন্য জাল বাস্তবায়ন তৈরি করুন,
in-memory
সংগ্রহের সাথে এটি প্রতিস্থাপন করুন ।
স্টাব - হার্ড-কোডেড মানগুলি ফিরিয়ে আনার জন্য ওভাররাইড পদ্ধতিগুলিও হিসাবে উল্লেখ করা হয় state-based
।
উদাহরণ : আপনার পরীক্ষার শ্রেণিটি
Calculate()
সম্পূর্ণ হতে 5 মিনিট সময় নেয় এমন একটি পদ্ধতির উপর নির্ভর করে । 5 মিনিটের জন্য অপেক্ষা না করে আপনি এর বাস্তব বাস্তবায়নটি স্টাবের সাথে প্রতিস্থাপন করতে পারেন যা হার্ড-কোডেড মানগুলি দেয়; সময় মাত্র একটি ছোট ভগ্নাংশ গ্রহণ।
নকল - খুব অনুরূপ Stub
কিন্তু interaction-based
বরং রাজ্য ভিত্তিক নয়। এর অর্থ আপনি Mock
কিছু মূল্য ফেরত প্রত্যাশা করবেন না , তবে ধরে নিন যে পদ্ধতি কলগুলির নির্দিষ্ট ক্রম হয়েছে।
উদাহরণ: আপনি একজন ব্যবহারকারী নিবন্ধকরণ ক্লাস পরীক্ষা করছেন। কল করার পরে
Save
, এটি কল করা উচিতSendConfirmationEmail
।
Stubs
এবং Mocks
প্রকৃতপক্ষে উপ-ধরণের Mock
, উভয়ই পরীক্ষা বাস্তবায়নের সাথে বাস্তব বাস্তবায়ন করে, তবে বিভিন্ন, নির্দিষ্ট কারণে।
ইন codeschool.com অবশ্যই, পাগল টেস্টিং বোকচন্দর জন্য তারা পদ এই সংজ্ঞা দিতে:
অসম্পূর্ণ
কোড সহ এমন একটি পদ্ধতি প্রতিস্থাপনের জন্য যা একটি নির্দিষ্ট ফলাফল দেয়।
উপহাস
পদ্ধতিটি বলা হয় এমন একটি দৃ as়তার সাথে একটি স্টাব।
সুতরাং শান কোপেনহেভার তাঁর উত্তরে বর্ণিত হিসাবে, পার্থক্যটি হ'ল বিদ্রূপগুলি প্রত্যাশাগুলি নির্ধারণ করে (যেমন তারা কীভাবে ডাকা হয় বা কীভাবে সে সম্পর্কে দৃser় বক্তব্য দেয়)।
স্টাবগুলি আপনার পরীক্ষাগুলিতে ব্যর্থ হয় না, মক পারেন।
আমি মনে করি এই প্রশ্নটির সহজ ও সুস্পষ্ট উত্তর রয় ওশেরোভ তাঁর দ্য আর্ট অফ ইউনিট টেস্টিংয়ের বইটিতে দিয়েছেন (পৃষ্ঠা 85)
স্টাবের সাথে আমরা কীভাবে কাজ করছি তা বলার সহজতম উপায় হ'ল লক্ষ্য করা যায় যে স্টাব কখনই পরীক্ষায় ব্যর্থ হয় না। পরীক্ষাগুলির ব্যবহারগুলি দৃ The়ভাবে সর্বদা পরীক্ষার অধীনে শ্রেণীর বিরুদ্ধে থাকে।
অন্যদিকে, পরীক্ষাটি ব্যর্থ হয়েছে কিনা তা যাচাই করতে একটি মক অবজেক্ট ব্যবহার করবে। [...]
আবার, মক অবজেক্ট হ'ল পরীক্ষাটি ব্যর্থ হয়েছে কি না তা আমরা দেখতে ব্যবহার করি use
এর অর্থ আপনি যদি জালটির বিরুদ্ধে জোর দিয়ে থাকেন তবে এর অর্থ আপনি জালটিকে একটি উপহাস হিসাবে ব্যবহার করছেন, যদি আপনি জালটি কেবল পরীক্ষা না করে পরীক্ষা চালানোর জন্য ব্যবহার করে থাকেন তবে আপনি জালটিকে স্টাব হিসাবে ব্যবহার করছেন।
উপরের সমস্ত ব্যাখ্যা পড়া, আমাকে ঘনীভূত করার চেষ্টা করা যাক:
একটি মক হ'ল আচরণের পরীক্ষা করে থাকে, তা নিশ্চিত করে নির্দিষ্ট পদ্ধতিগুলি বলা হয়। একটি স্টাব একটি নির্দিষ্ট বস্তুর পরীক্ষামূলক সংস্করণ (প্রতি সে) is
আপনি একটি অ্যাপল উপায় কি বোঝাতে চান?
আপনি যদি এটি ডিবাগিংয়ের সাথে তুলনা করেন:
স্টাব এটি নিশ্চিত করার মতো যে কোনও পদ্ধতি সঠিক মান দেয়
মক আসলে পদ্ধতিটিতে পা রাখার মতো এবং সঠিক মান ফেরানোর আগে ভিতরে থাকা সমস্ত কিছু সঠিক কিনা তা নিশ্চিত করার মতো।
মানসিক মডেল ব্যবহার করে আমাকে সমস্ত ব্যাখ্যা এবং নিবন্ধের চেয়ে এটি বুঝতে "সত্যই ডুবে যায়নি"।
ভাবুন আপনার বাচ্চাটির টেবিলে কাচের প্লেট রয়েছে এবং সে এটি খেলতে শুরু করে। এখন, আপনি ভয় পাচ্ছেন যে এটি ভেঙে যাবে। সুতরাং, আপনি তার পরিবর্তে তাকে একটি প্লাস্টিকের প্লেট দিন। এটি একটি মোক (একই আচরণ, একই ইন্টারফেস, "নরম" বাস্তবায়ন) হবে।
এখন, বলুন আপনার কাছে প্লাস্টিকের প্রতিস্থাপন নেই, তাই আপনি ব্যাখ্যা করুন "আপনি যদি এটির সাথে খেলা চালিয়ে যান তবে তা ভেঙে যাবে!"। এটি একটি স্টাব , আপনি আগে থেকেই একটি পূর্বনির্ধারিত অবস্থা সরবরাহ করেছিলেন।
একটি ডামি সেই কাঁটাচামচ হবে যা তিনি এমনকি ব্যবহার করেন নি ... এবং একটি স্পাই এমনই কিছু হতে পারে যা আপনি ইতিমধ্যে ব্যবহার করেছেন এমন একই ব্যাখ্যা সরবরাহ করার মতো।
আমি মনে করি তাদের মধ্যে সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি তাদের উদ্দেশ্য।
আমাকে এটি কেন স্টাব বনাম, কেন বিদ্রূপে ব্যাখ্যা করার চেষ্টা করা উচিত
ধরুন আমি আমার ম্যাক টুইটার ক্লায়েন্টের পাবলিক টাইমলাইন কন্ট্রোলারের জন্য পরীক্ষার কোড লিখছি
পরীক্ষার নমুনা কোডটি এখানে
twitter_api.stub(:public_timeline).and_return(public_timeline_array)
client_ui.should_receive(:insert_timeline_above).with(public_timeline_array)
controller.refresh_public_timeline
মক লিখে, আপনি প্রত্যাশা পূরণ হয়েছে যাচাই করে বস্তু সহযোগিতার সম্পর্ক আবিষ্কার করেন, যখন স্টাব কেবলমাত্র বস্তুর আচরণ অনুকরণ করে।
যদি আপনি উপহাস সম্পর্কে আরও জানার চেষ্টা করছেন তবে আমি এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি: http://jmock.org/oopsla2004.pdf
খুব স্পষ্ট এবং ব্যবহারিক হতে:
স্টাব: এমন একটি শ্রেণি বা অবজেক্ট যা নকল হওয়ার জন্য শ্রেণি / অবজেক্টের পদ্ধতিগুলি প্রয়োগ করে এবং আপনি যা চান সর্বদা ফিরে আসে।
জাভাস্ক্রিপ্ট উদাহরণ:
var Stub = {
method_a: function(param_a, param_b){
return 'This is an static result';
}
}
মক: স্টাবের একই, তবে এটি এমন কিছু যুক্তি যুক্ত করে যে কোনও পদ্ধতি যখন বলা হয় তখন "যাচাই করে" তাই আপনি নিশ্চিত হতে পারেন যে কিছু বাস্তবায়ন সেই পদ্ধতিটিকে কল করছে।
@ এমলেভান যেমন বলেছেন তেমন একটি উদাহরণ হিসাবে কল্পনা করুন যে আপনি একজন ব্যবহারকারী নিবন্ধকরণ ক্লাস পরীক্ষা করছেন। সেভ কল করার পরে, এটি সেন্ডকনফেরেশন ইমেইল কল করা উচিত।
একটি খুব বোকা কোড উদাহরণ:
var Mock = {
calls: {
method_a: 0
}
method_a: function(param_a, param_b){
this.method_a++;
console.log('Mock.method_a its been called!');
}
}
এই স্লাইডটি মূল পার্থক্যগুলি খুব ভাল ব্যাখ্যা করে।
* সিএসই 403 লেকচার 16, ওয়াশিংটন বিশ্ববিদ্যালয় থেকে (স্লাইড "মার্টি স্টেপ" তৈরি করেছেন)
আমি রায় ওশেরোভ [ভিডিও লিঙ্ক] দ্বারা দেওয়া ব্যাখ্যাটি পছন্দ করি ।
তৈরি প্রতিটি শ্রেণি বা বস্তু একটি জাল। আপনি যদি এর বিরুদ্ধে কলগুলি যাচাই করেন তবে এটি মক। অন্যথায় এটি একগুঁয়ে।
টেস্ট দ্বিগুণ দেখুন:
স্টাব : স্টাব এমন একটি বস্তু যা পূর্বনির্ধারিত ডেটা ধারণ করে এবং পরীক্ষার সময় কলগুলির উত্তর দেওয়ার জন্য এটি ব্যবহার করে। যেমন : এমন একটি অবজেক্ট যা পদ্ধতির কলের প্রতিক্রিয়া জানাতে ডেটাবেস থেকে কিছু ডেটা গ্রহণ করতে হবে।
মকস : মকস এমন বস্তু যা নিখরচায় কলগুলি রেজিস্টার করে। পরীক্ষার প্রতিবেদনে, আমরা মকসে যাচাই করতে পারি যে সমস্ত প্রত্যাশিত ক্রিয়া সম্পাদিত হয়েছিল। যেমন : একটি কার্যকারিতা যা ইমেল প্রেরণ পরিষেবাকে কল করে। আরও জন্য এই পরীক্ষা করুন ।
একটি জাল একটি জেনেরিক শব্দ যা কোনও স্টাব বা উপহাস বস্তু (হস্তাক্ষর বা অন্যথায়) বর্ণনা করতে ব্যবহার করা যেতে পারে, কারণ এগুলি উভয়ই আসল বস্তুর মতো দেখায়।
নকল হ'ল স্টক বা মোক এটি বর্তমান পরীক্ষায় কীভাবে ব্যবহৃত হবে তার উপর নির্ভর করে। যদি এটি কোনও ইন্টারঅ্যাকশন পরীক্ষা করার জন্য ব্যবহৃত হয় (বিরুদ্ধে জোর দেওয়া), এটি একটি মক অবজেক্ট। অন্যথায়, এটি একগুঁয়ে।
জালগুলি পরীক্ষাটি মসৃণভাবে চলমান তা নিশ্চিত করে। এর অর্থ হ'ল আপনার ভবিষ্যতের পরীক্ষার পাঠক বুঝতে পারবেন যে জাল বস্তুর আচরণ কী হবে, তার উত্স কোডটি পড়ার প্রয়োজন ছাড়াই (বাহ্যিক সংস্থার উপর নির্ভর করার প্রয়োজন ছাড়াই)।
পরীক্ষা সহজেই চালানো মানে কী?
নীচের কোডে ফরেক্স নমুনা:
public void Analyze(string filename)
{
if(filename.Length<8)
{
try
{
errorService.LogError("long file entered named:" + filename);
}
catch (Exception e)
{
mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
}
}
}
আপনি মেইল সার্ভিস.সেন্ডমেল পরীক্ষা করতে চান () পদ্ধতিটি , আপনাকে পরীক্ষা পদ্ধতিতে একটি ব্যতিক্রম অনুকরণ করতে হবে, সুতরাং ফলাফলটি অনুকরণ করার জন্য আপনাকে কেবল একটি ফেইক স্টাব ত্রুটি-পরিষেবা ক্লাস তৈরি করতে হবে, তারপরে আপনার পরীক্ষার কোডটি পরীক্ষা করতে সক্ষম হবে মেইল সার্ভিস.সেন্ডমেল () পদ্ধতি। আপনি দেখতে পাচ্ছেন যে কোনও ফলাফল বহিরাগত নির্ভরতা ত্রুটি-পরিষেবা ক্লাসের ফলাফলের অনুকরণ করতে হবে need
জে মকের বিকাশকারীগণ কর্তৃক কাগজ মক রোলস, অবজেক্টস নয় , থেকে ডানদিকে:
স্টাবগুলি হ'ল উত্পাদনের কোডের ডামি বাস্তবায়ন যা ক্যানড ফলাফলগুলি দেয় return মক অবজেক্টস স্টাবস হিসাবে কাজ করে তবে তার প্রতিবেশীদের সাথে লক্ষ্য বস্তুর মিথস্ক্রিয়াকে বোঝার জন্য অন্তর্ভুক্তও অন্তর্ভুক্ত করে।
সুতরাং, প্রধান পার্থক্যগুলি হ'ল:
সংক্ষেপে, ফোলারের নিবন্ধ শিরোনাম থেকে বিভ্রান্তি ছড়িয়ে দেওয়ার চেষ্টা করার সময় : বিদ্রূপগুলি হ'ল স্টাব, তবে তারা কেবল স্টাবই নয় ।
আমি আর্ট অফ ইউনিট টেস্টিং পড়ছিলাম , এবং নিম্নলিখিত সংজ্ঞায় হোঁচট খেয়েছি:
একটি নকল একটি জেনেরিক শব্দ যা কোনও স্টাব বা উপহাস বস্তু (হস্তাক্ষর বা অন্যথায়) বর্ণনা করতে ব্যবহার করা যেতে পারে, কারণ এগুলি উভয়ই আসল বস্তুর মতো দেখায়। নকল হ'ল স্টক বা মোক এটি বর্তমান পরীক্ষায় কীভাবে ব্যবহৃত হবে তার উপর নির্ভর করে। যদি এটি কোনও ইন্টারঅ্যাকশন পরীক্ষা করার জন্য ব্যবহৃত হয় (বিরুদ্ধে জোর দেওয়া), এটি একটি মক অবজেক্ট । অন্যথায়, এটি একগুঁয়ে ।
আমি আনকলোবি দ্য লিটল মকারের এই আকর্ষণীয় নিবন্ধটি জুড়ে এসেছি । এটি সমস্ত পরিভাষা খুব সহজে বোঝা যায় এমন পদ্ধতিতে ব্যাখ্যা করে, তাই এটি প্রাথমিকদের জন্য দরকারী। মার্টিন ফওলার্স নিবন্ধটি আমার মতো নতুনদের জন্য কঠোরভাবে পড়া।
স্টাব পরীক্ষা চালাতে আমাদের সহায়তা করে। কিভাবে? এটি মান দেয় যা পরীক্ষা চালাতে সহায়তা করে। এই মানগুলি নিজেই বাস্তব নয় এবং আমরা পরীক্ষা চালানোর জন্য এই মানগুলি তৈরি করেছি। উদাহরণস্বরূপ আমরা একটি হ্যাশম্যাপ তৈরি করি যা আমাদের ডাটাবেস টেবিলের মানগুলির সাথে সমান মান দেয়। সুতরাং ডাটাবেসের সাথে সরাসরি কথোপকথনের পরিবর্তে আমরা হাশম্যাপের সাথে ইন্টারঅ্যাক্ট করি।
মোক এটি একটি নকল বস্তু যা পরীক্ষা চালায়। আমরা দৃ put় করা যেখানে।
সি # এবং মক ফ্রেমওয়ার্ক ব্যবহার করে মক বনাম স্টাবগুলির উদাহরণ নীচে দেখুন। মোকের স্টাবের জন্য একটি বিশেষ কীওয়ার্ড নেই তবে আপনি স্টাবগুলি তৈরি করতে মক অবজেক্টটি ব্যবহার করতে পারেন।
namespace UnitTestProject2
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
[TestClass]
public class UnitTest1
{
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method calls Repository GetName method "once" when Id is greater than Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Once);
}
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method doesn't call Repository GetName method when Id is Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(0);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Never);
}
/// <summary>
/// Test using Stub to Verify that GetNameWithPrefix method returns Name with a Prefix
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
{
// Arrange
var stubEntityRepository = new Mock<IEntityRepository>();
stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
.Returns("Stub");
const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
var entity = new EntityClass(stubEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
}
}
public class EntityClass
{
private IEntityRepository _entityRepository;
public EntityClass(IEntityRepository entityRepository)
{
this._entityRepository = entityRepository;
}
public string Name { get; set; }
public string GetNameWithPrefix(int id)
{
string name = string.Empty;
if (id > 0)
{
name = this._entityRepository.GetName(id);
}
return "Mr. " + name;
}
}
public interface IEntityRepository
{
string GetName(int id);
}
public class EntityRepository:IEntityRepository
{
public string GetName(int id)
{
// Code to connect to DB and get name based on Id
return "NameFromDb";
}
}
}
স্টাব এবং মক টেস্টিং ভিউ:
স্টাবটি ব্যবহারকারীর দ্বারা স্থির উপায়ে অর্থাত বাস্তবায়ন কোড লেখার ক্ষেত্রে ডামি বাস্তবায়ন হয় । সুতরাং এটি পরিষেবা সংজ্ঞা এবং গতিশীল অবস্থা পরিচালনা করতে পারে না, সাধারণত এটি মজাদার ফ্রেমওয়ার্ক ব্যবহার না করেই জুনিট ফ্রেমওয়ার্কে করা হয়।
মক হ'ল ডামি বাস্তবায়ন তবে এর প্রয়োগটি মকিতোর মতো মক্কৃত ফ্রেমওয়ার্ক ব্যবহার করে গতিশীল উপায়ে সম্পন্ন হয়েছে । সুতরাং আমরা গতিশীল উপায় হিসাবে শর্ত এবং পরিষেবা সংজ্ঞা হ্যান্ডেল করতে পারি অর্থাৎ রানটাইম সময় কোড থেকে মোকে তৈরি করা যেতে পারে। তাই মক ব্যবহার করে আমরা গতিশীলভাবে স্টবগুলি প্রয়োগ করতে পারি।
প্লাস দরকারী উত্তর, উপকারের চেয়ে মকস ব্যবহারের অন্যতম শক্তিশালী পয়েন্ট
যদি সহযোগী [যা প্রধান কোড এটা উপর নির্ভর করে] আমাদের নিয়ন্ত্রণে নয় (যেমন একটি তৃতীয় পক্ষের লাইব্রেরি থেকে),
এই ক্ষেত্রে, শহরের উপর অসম্পূর্ণ নিবন্ধ আরো কঠিন উপহাস বদলে লিখতে হয় ।
আমি আমার উত্তরে অজগর উদাহরণগুলি ব্যবহার করেছি পার্থক্যগুলি বর্ণনা করার জন্য।
স্টাব - স্টব্বিং এমন একটি সফ্টওয়্যার বিকাশ কৌশল যা বিকাশের জীবনচক্রের প্রথম দিকে শ্রেণিগুলির পদ্ধতি প্রয়োগ করতে ব্যবহৃত হয়। এগুলি সাধারণত পরিচিত ইন্টারফেসের প্রয়োগের জন্য স্থানধারক হিসাবে ব্যবহৃত হয়, যেখানে ইন্টারফেসটি চূড়ান্ত বা পরিচিত তবে বাস্তবায়ন এখনও জানা বা চূড়ান্ত হয়নি। আপনি স্টাবগুলি দিয়ে শুরু করেন, যার সহজ অর্থ হ'ল আপনি কেবল কোনও ফাংশনটির সংজ্ঞা লিখে রাখেন এবং পরবর্তীটির জন্য আসল কোডটি রেখে যান। সুবিধাটি হ'ল আপনি পদ্ধতিগুলি ভুলে যাবেন না এবং কোডটিতে দেখে আপনি নিজের নকশাটি সম্পর্কে ভাবতে অবিরত রাখতে পারেন। আপনি আপনার স্টাবকে স্থির প্রতিক্রিয়া ফিরিয়ে আনতে পারেন যাতে প্রতিক্রিয়াটি আপনার কোডের অন্যান্য অংশগুলি অবিলম্বে ব্যবহার করতে পারে। স্টাব অবজেক্টস একটি বৈধ প্রতিক্রিয়া সরবরাহ করে, তবে আপনি যে ইনপুটটি পাস করবেন তা স্থির নয়, আপনি সর্বদা একই প্রতিক্রিয়া পাবেন:
class Foo(object):
def bar1(self):
pass
def bar2(self):
#or ...
raise NotImplementedError
def bar3(self):
#or return dummy data
return "Dummy Data"
উপহাস অবজেক্টগুলি মক টেস্টের ক্ষেত্রে ব্যবহার করা হয় তারা যাচাই করে যে methods অবজেক্টগুলিতে নির্দিষ্ট পদ্ধতি আহ্বান করা হয়েছে। মক অবজেক্টগুলি সিমুলেটেড অবজেক্টস যা নিয়ন্ত্রিত উপায়ে বাস্তব বস্তুর আচরণ অনুকরণ করে। আপনি অন্য কিছু বস্তুর আচরণ পরীক্ষা করার জন্য সাধারণত একটি মক অবজেক্ট তৈরি করেন। মকস আমাদের এমন সংস্থানগুলি অনুকরণ করতে দেয় যা ইউনিট পরীক্ষার জন্য অনুপলব্ধ বা অত্যধিক অস্বাস্থ্যকর।
mymodule.py:
import os
import os.path
def rm(filename):
if os.path.isfile(filename):
os.remove(filename)
test.py:
from mymodule import rm
import mock
import unittest
class RmTestCase(unittest.TestCase):
@mock.patch('mymodule.os')
def test_rm(self, mock_os):
rm("any path")
# test that rm called os.remove with the right parameters
mock_os.remove.assert_called_with("any path")
if __name__ == '__main__':
unittest.main()
এটি একটি খুব প্রাথমিক উদাহরণ যা কেবল আরএম চালায় এবং এটি যে পরামিতিটির সাথে ডাকা হয়েছিল তা জোর দিয়েছিল। আপনি এখানে যেমন দেখানো হয়েছে ঠিক তেমন ফাংশন না করে বস্তুগুলির সাথে মক ব্যবহার করতে পারেন এবং আপনি কোনও মানও ফিরিয়ে দিতে পারেন যাতে পরীক্ষার জন্য কোনও মক অবজেক্টটি স্টাব প্রতিস্থাপনের জন্য ব্যবহার করা যায়।
ইউনিটেস্ট.মকের আরও উল্লেখ, পাইথন ২.x মকের নোটটি ইউনিটেস্টে অন্তর্ভুক্ত নয় তবে এটি ডাউনলোডযোগ্য মডিউল যা পিপের মাধ্যমে ডাউনলোড করতে পারবেন (পিপ ইনস্টল মক)।
আমি রায় ওশেরোভের "আর্ট অফ ইউনিট টেস্টিং" পড়েছি এবং আমি মনে করি পাইথন এবং পাইথনের উদাহরণ ব্যবহার করে অনুরূপ কোনও বই লেখা থাকলে এটি দুর্দান্ত হত। এরকম বই যদি কেউ জানে তবে শেয়ার করুন। চিয়ার্স :)
স্টাব পরীক্ষার উদ্দেশ্যে নির্মিত একটি জাল বস্তু। মক হ'ল একটি স্টাব যা প্রত্যাশিত কল কার্যকরভাবে ঘটেছে কিনা তা রেকর্ড করে।
স্টাব একটি ফাঁকা ফাংশন যা পরীক্ষার সময় হাতছাড়া হওয়া ব্যতিক্রম এড়াতে ব্যবহৃত হয়:
function foo(){}
মোক একটি কৃত্রিম ফাংশন যা পরীক্ষার সময় ওএস, পরিবেশ বা হার্ডওয়্যার নির্ভরতা এড়াতে ব্যবহৃত হয়:
function foo(bar){ window = this; return window.toString(bar); }
দাবী এবং রাষ্ট্রের শর্তাবলী:
তথ্যসূত্র
সেখানে অনেকগুলি বৈধ উত্তর রয়েছে তবে আমি এই ফর্মটি মামার ববকে উল্লেখ করা ভাল মনে করি: https://8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html
উদাহরণ সহ সেরা ব্যাখ্যা!
মক হ'ল প্রযুক্তিগত এবং কার্যক্ষম উভয় বস্তু।
মক প্রযুক্তিগত । এটি প্রকৃতপক্ষে একটি উপহাস লাইব্রেরি দ্বারা তৈরি করা হয়েছে (ইজিমক, জেমকিত এবং আরও সম্প্রতি মকিতো এগুলির জন্য পরিচিত) বাইট কোড জেনারেশনের জন্য ধন্যবাদ ।
মক বাস্তবায়ন এমনভাবে তৈরি করা হয় যেখানে কোনও পদ্ধতি চালিত হওয়ার সময় আমরা কোনও নির্দিষ্ট মান ফিরিয়ে আনার জন্য এটি তৈরি করতে পারি তবে কিছু অন্যান্য বিষয় যেমন যেমন একটি নির্দিষ্ট প্যারামিটার (কঠোর চেক) বা প্যারামিটারের সাথে যাচ্ছিল তা যাচাই করা যাচাই করা; কোন কঠোর চেক)।
একটি উপহাস ইনস্ট্যান্ট করা:
@Mock Foo fooMock
একটি আচরণ রেকর্ডিং:
when(fooMock.hello()).thenReturn("hello you!");
একটি অনুরোধ যাচাই করা:
verify(fooMock).hello()
এগুলি ফু শ্রেণি / আচরণকে তাত্ক্ষণিকভাবে / ওভাররাইড করার প্রাকৃতিক উপায় নয়। এজন্য আমি একটি প্রযুক্তিগত দিক উল্লেখ করি।
তবে মোক এটি কার্যকরী কারণ এটি আমাদের ক্লাসের একটি উদাহরণ যা এসইউটি থেকে বিচ্ছিন্ন করতে হবে। এবং এটিতে রেকর্ড করা আচরণ সহ, আমরা স্টাবের মতো এটি স্টুতে একইভাবে ব্যবহার করতে পারি।
স্টাবটি কেবল একটি ক্রিয়ামূলক অবজেক্ট: এটি ক্লাসের একটি উদাহরণ যা আমাদের এসইউটি থেকে বিচ্ছিন্ন করতে হবে এবং এগুলিই। এর অর্থ হ'ল উভয় স্টাব ক্লাস এবং আমাদের ইউনিট পরীক্ষার সময় সমস্ত আচরণের ফিক্সচারগুলি স্পষ্টভাবে সংজ্ঞায়িত করতে হয়।
উদাহরণস্বরূপ স্টাবের hello()
জন্য Foo
ক্লাসটি সাবক্লাস করা প্রয়োজন (অথবা এটির ইন্টারফেসটি এটি প্রয়োগ করে) এবং ওভাররাইড করতে হবে hello()
:
public class HelloStub extends Hello{
public String hello {
return "hello you!";
}
}
অন্য পরীক্ষার দৃশ্যে যদি অন্য মান ফেরতের প্রয়োজন হয়, আমাদের সম্ভবত রিটার্ন সেট করার একটি সাধারণ উপায় নির্ধারণ করতে হবে:
public class HelloStub extends Hello{
public HelloStub(String helloReturn){
this.helloReturn = helloReturn;
}
public String hello {
return helloReturn;
}
}
অন্যান্য পরিস্থিতি: যদি আমার কোনও পার্শ্ব প্রতিক্রিয়া পদ্ধতি ছিল (কোনও প্রত্যাবর্তন নেই) এবং আমি পরীক্ষা করেছিলাম যে এই পদ্ধতিটি চালু ছিল, তবে পদ্ধতিটি কতবার আহ্বান করা হয়েছিল তা গণনা করার জন্য আমার সম্ভবত স্টাব ক্লাসে একটি বুলিয়ান বা একটি কাউন্টার যুক্ত করা উচিত ছিল।
উপসংহার
আপনার ইউনিট পরীক্ষার জন্য লেখার জন্য স্টাবের প্রায়শই অনেক বেশি ওভারহেড / কোড প্রয়োজন। কোন উপহাস বাক্সের বাইরে রেকর্ডিং / যাচাইকরণ বৈশিষ্ট্যগুলি সরবরাহ করার জন্য ধন্যবাদকে বাধা দেয়।
এ কারণেই আজকাল স্টাবের পদ্ধতির ব্যবহার খুব কমই দুর্দান্ত মক লাইব্রেরির আবির্ভাবের সাথে ব্যবহার করা হয়।
মার্টিন ফোলার সম্পর্কে আর্টিকেল: আমি মক ব্যবহার করার সময় কোনও "মকবিদ" প্রোগ্রামার বলে মনে করি না এবং আমি স্টাবগুলি এড়িয়ে চলি।
তবে আমি মক ব্যবহার করি যখন এটি সত্যই প্রয়োজন হয় (বিরক্তিকর নির্ভরশীলতা) এবং আমি টেস্ট স্লাইসিং এবং মিনি-ইন্টিগ্রেশন পরীক্ষার পক্ষপাতী যখন আমি নির্ভরশীলতার সাথে কোনও শ্রেণি পরীক্ষা করি যা উপহাসই ওভারহেড হবে।