মক ও স্টাবের মধ্যে পার্থক্য কী?


961

আমি টেস্টিংয়ে মজাদার বনাম স্টাবিং সম্পর্কিত বিভিন্ন নিবন্ধ পড়েছি, যার মধ্যে মার্টিন ফওলারের মকস আরেনট স্টাবস নেই , তবে তবুও পার্থক্যটি বুঝতে পারছি না।



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

10
"মক, জাল এবং স্টাবগুলির মধ্যে শ্রেণিবিন্যাস সাহিত্যে পুরোপুরি বেমানান" " অনেক উদ্ধৃতি দিয়ে। এখনও আমার প্রিয় উইকিপিডিয়া উদ্ধৃতিগুলির মধ্যে একটি - যদি এরকম কিছু থাকে তবে :) en.wikedia.org/wiki/Mock_object
জেডি।

11
মার্টিন ফোলারের নিবন্ধটি প্রাথমিকভাবে বুঝতে খুব কঠিন।
lmiguelvargasf

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

উত্তর:


745

অসম্পূর্ণ

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

উপহাস

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

মোক এবং স্টাবগুলির মধ্যে পার্থক্য

মোক নিয়ে লেখা টেস্টগুলি সাধারণত initialize -> set expectations -> exercise -> verifyপরীক্ষার একটি ধরণ অনুসরণ করে । প্রাক লিখিত স্টাব একটি অনুসরণ করবে initialize -> exercise -> verify

মকস এবং স্টাবসের মধ্যে সাদৃশ্য

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


875

ভূমিকা

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

উল্লেখ

মার্টিন ফোলারের নিবন্ধ অনুসারে :

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

শৈলী

মোকস বনাম স্টাবস = আচরণগত পরীক্ষা বনাম স্টেট টেস্টিং

নীতি

টেস্টের নীতি অনুসারে প্রতি পরীক্ষায় কেবল একটি জিনিস , একটি পরীক্ষায় বেশ কয়েকটি স্টাব থাকতে পারে তবে সাধারণত একটি মক থাকে।

জীবনচক্র

স্টাবগুলি সহ জীবনকাল পরীক্ষা করুন:

  1. সেটআপ - পরীক্ষা করা হচ্ছে এমন বস্তু এবং এর স্টাবস সহযোগী প্রস্তুত করুন।
  2. অনুশীলন - কার্যকারিতা পরীক্ষা করুন।
  3. রাষ্ট্র যাচাই করুন - অবজেক্টের অবস্থা যাচাই করতে সংস্থান ব্যবহার করুন।
  4. টিয়ারডাউন - সংস্থানগুলি পরিষ্কার করুন।

উপহাসের সাথে জীবনকাল পরীক্ষা করুন:

  1. সেটআপ ডেটা - পরীক্ষা করা হচ্ছে এমন বস্তু প্রস্তুত করুন।
  2. সেটআপ প্রত্যাশাগুলি - প্রাথমিক অবজেক্টের সাহায্যে মকতে প্রত্যাশা প্রস্তুত করুন।
  3. অনুশীলন - কার্যকারিতা পরীক্ষা করুন।
  4. প্রত্যাশাগুলি যাচাই করুন - যাচাই করে নিন যে সঠিক পদ্ধতিগুলি উপহাসে ডাকা হয়েছে।
  5. রাষ্ট্র যাচাই করুন - অবজেক্টের অবস্থা যাচাই করতে সংস্থান ব্যবহার করুন।
  6. টিয়ারডাউন - সংস্থানগুলি পরিষ্কার করুন।

সারসংক্ষেপ

উভয় মোক এবং স্টাব পরীক্ষা এই প্রশ্নের উত্তর দেয়: ফলাফল কী?

মোক নিয়ে পরীক্ষাও আগ্রহী: ফলাফল কীভাবে অর্জিত হয়েছে?


অপেক্ষা করুন, উপহাসগুলিও ক্যানড উত্তরগুলি ফেরত দেবে? অন্যথায় কারণ তারা প্রশ্নের উত্তর দেয় কেন?
আতুরস্যামস 7:57

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

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

364

স্টাব একটি সাধারণ জাল বস্তু। এটি কেবল নিশ্চিত করে যে পরীক্ষাটি সহজেই চলছে runs
মক হ'ল স্মার্ট স্টাব ub আপনি নিজের পরীক্ষাটি যাচাই করেছেন।


33
আমি মনে করি এটি উত্তরের সবচেয়ে সাবলীল এবং স্পট। টেকওয়ে: একটি উপহাস আইএস-এ স্টাব। stackoverflow.com/a/17810004/2288628 এই উত্তরের দীর্ঘ সংস্করণ।
পাওয়ার্ডবাইরাইস

8
আমি মনে করি না যে একটি মোক একটি stub। মকসগুলি দৃsert়তার জন্য ব্যবহৃত হয় এবং কখনই ডেটা ফেরত দেওয়া উচিত নয়, স্টাবগুলি ডেটা ফেরত দেওয়ার জন্য ব্যবহৃত হয় এবং কখনও জোর দেওয়া উচিত নয়।
dave1010

2
@ ডেভ 1010 মক্স অবশ্যই স্পষ্টভাবে ডেটা ফেরত দিতে পারে বা ব্যতিক্রম ছুঁড়ে ফেলতে পারে। তাদের মধ্যে যে প্যারামগুলি প্রবেশ করা হয়েছে তার প্রতিক্রিয়াতে তাদের এটি করা উচিত।
ট্রেনটন

2
@ টরেন্টন যদি কোনও ডেটা পাস করে বা পাস করা ডেটার উপর ভিত্তি করে নিক্ষেপ করে তবে এটি একটি জাল , মক না। স্টাবগুলি পরীক্ষা করে যে আপনার SUT কীভাবে বার্তাগুলি গ্রহণ করতে পরিচালনা করে , আপনার SUT কীভাবে বার্তা প্রেরণ করে তা পরীক্ষা করে তোলে m 2 টি মিশ্রিত করা খারাপ ওও ডিজাইনের দিকে পরিচালিত হতে পারে।
dave1010

8
আমি মনে করি এটি দুর্দান্ত - একটি স্টাব প্রশ্নের উত্তর দেয়। একটি উপহাসও প্রশ্নের উত্তরগুলি ফেরত দেয় (ইস-স্টাব) তবে এটিও যাচাই করে যে প্রশ্ন জিজ্ঞাসা করা হয়েছিল !!
লিফ

238

এখানে বাস্তব জগতের নমুনা সহ প্রতিটি একের বিবরণ।

  • ডামি - সন্তুষ্ট করার জন্য কেবল বোগাস মান API

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

  • ভুয়া - এমন কোনও শ্রেণীর একটি পরীক্ষামূলক বাস্তবায়ন তৈরি করুন যা কিছু বাহ্যিক অবকাঠামোর উপর নির্ভরশীলতা থাকতে পারে। (এটি ভাল অনুশীলন যে আপনার ইউনিট পরীক্ষাটি বাহ্যিক অবকাঠামোতে আসলে ইন্টারঅ্যাক্ট করে না ))

    উদাহরণ : একটি ডাটাবেস অ্যাক্সেসের জন্য জাল বাস্তবায়ন তৈরি করুন, in-memoryসংগ্রহের সাথে এটি প্রতিস্থাপন করুন ।

  • স্টাব - হার্ড-কোডেড মানগুলি ফিরিয়ে আনার জন্য ওভাররাইড পদ্ধতিগুলিও হিসাবে উল্লেখ করা হয় state-based

    উদাহরণ : আপনার পরীক্ষার শ্রেণিটি Calculate()সম্পূর্ণ হতে 5 মিনিট সময় নেয় এমন একটি পদ্ধতির উপর নির্ভর করে । 5 মিনিটের জন্য অপেক্ষা না করে আপনি এর বাস্তব বাস্তবায়নটি স্টাবের সাথে প্রতিস্থাপন করতে পারেন যা হার্ড-কোডেড মানগুলি দেয়; সময় মাত্র একটি ছোট ভগ্নাংশ গ্রহণ।

  • নকল - খুব অনুরূপ Stubকিন্তু interaction-basedবরং রাজ্য ভিত্তিক নয়। এর অর্থ আপনি Mockকিছু মূল্য ফেরত প্রত্যাশা করবেন না , তবে ধরে নিন যে পদ্ধতি কলগুলির নির্দিষ্ট ক্রম হয়েছে।

    উদাহরণ: আপনি একজন ব্যবহারকারী নিবন্ধকরণ ক্লাস পরীক্ষা করছেন। কল করার পরে Save, এটি কল করা উচিত SendConfirmationEmail

Stubsএবং Mocksপ্রকৃতপক্ষে উপ-ধরণের Mock, উভয়ই পরীক্ষা বাস্তবায়নের সাথে বাস্তব বাস্তবায়ন করে, তবে বিভিন্ন, নির্দিষ্ট কারণে।


175

ইন codeschool.com অবশ্যই, পাগল টেস্টিং বোকচন্দর জন্য তারা পদ এই সংজ্ঞা দিতে:

অসম্পূর্ণ

কোড সহ এমন একটি পদ্ধতি প্রতিস্থাপনের জন্য যা একটি নির্দিষ্ট ফলাফল দেয়।

উপহাস

পদ্ধতিটি বলা হয় এমন একটি দৃ as়তার সাথে একটি স্টাব।

সুতরাং শান কোপেনহেভার তাঁর উত্তরে বর্ণিত হিসাবে, পার্থক্যটি হ'ল বিদ্রূপগুলি প্রত্যাশাগুলি নির্ধারণ করে (যেমন তারা কীভাবে ডাকা হয় বা কীভাবে সে সম্পর্কে দৃser় বক্তব্য দেয়)।


ডিলন পোস্টের পরিপূরক করতে, এটি সম্পর্কে ভাবুন, আপনার কাছে "মেকাকেক" নামে একটি ক্লাস রয়েছে যারা বেশ কয়েকটি লাইব্রেরি গ্রহণ করেন: দুধ, ডিম, চিনি, ওভেন।
aarkerio

139

স্টাবগুলি আপনার পরীক্ষাগুলিতে ব্যর্থ হয় না, মক পারেন।


2
এবং আমি মনে করি এটি ভাল, আপনি জানেন যে রিফ্যাক্টরিংয়ের পরে পরীক্ষাগুলির একই আচরণ হয়।
23:25 'রড্রিকিং

1
@ রড্রিকিং আমারও একই অনুভূতি আছে। মোক হিসাবে, উত্পাদন কোডের যে কোনও পরিবর্তন সহ - আপনার পরীক্ষার কোডের সাথে সম্পর্কিত পরিবর্তন রয়েছে। কোনটা বেদনা! স্টাবসের সাথে, মনে হয় আপনি আচরণের পরীক্ষা চালিয়ে যাচ্ছেন যাতে পরীক্ষার কোডের সাথে কোনও মাইক্রো পরিবর্তন করা দরকার না।
tucq88

35

আমি মনে করি এই প্রশ্নটির সহজ ও সুস্পষ্ট উত্তর রয় ওশেরোভ তাঁর দ্য আর্ট অফ ইউনিট টেস্টিংয়ের বইটিতে দিয়েছেন (পৃষ্ঠা 85)

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

অন্যদিকে, পরীক্ষাটি ব্যর্থ হয়েছে কিনা তা যাচাই করতে একটি মক অবজেক্ট ব্যবহার করবে। [...]

আবার, মক অবজেক্ট হ'ল পরীক্ষাটি ব্যর্থ হয়েছে কি না তা আমরা দেখতে ব্যবহার করি use

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


2
আমি আশা করি আপনার উত্তরটি শীর্ষে যেতে পারে। এখানে আর Osherove এই ব্যাখ্যা এর youtu.be/fAb_OnooCsQ?t=1006
মাইকেল একোকা

31

উপরের সমস্ত ব্যাখ্যা পড়া, আমাকে ঘনীভূত করার চেষ্টা করা যাক:

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

4
ভাল উত্তর. আপনার সংজ্ঞা অনুসারে মক স্পাইয়ের সাথে বেশ অনুরূপ শোনাচ্ছে। আপনি আরও কয়েকটি পরীক্ষার দ্বিগুণ অন্তর্ভুক্ত করার জন্য নিজের উত্তরটি আপডেট করলে ভাল লাগবে।
রোয়ান গন্টিয়ার

আমি এই উত্তরটি লেখার সময় স্পাইয়ের কথা শুনিনি।
ও'রুনি

23

একটি মক হ'ল আচরণের পরীক্ষা করে থাকে, তা নিশ্চিত করে নির্দিষ্ট পদ্ধতিগুলি বলা হয়। একটি স্টাব একটি নির্দিষ্ট বস্তুর পরীক্ষামূলক সংস্করণ (প্রতি সে) is

আপনি একটি অ্যাপল উপায় কি বোঝাতে চান?


19
"আপেল উপায় বলতে কী বোঝ?" হেলভেটিকা
কুবি

7
মাইক্রোসফ্ট এর বিপরীতে অ্যাপল উপায়ে বিপরীতে :)
কখনই_হাদ_এ_নাম

2
এই পরিস্থিতি কোনরকম সাহায্য করে?
নেবুলাফক্স

21

আপনি যদি এটি ডিবাগিংয়ের সাথে তুলনা করেন:

স্টাব এটি নিশ্চিত করার মতো যে কোনও পদ্ধতি সঠিক মান দেয়

মক আসলে পদ্ধতিটিতে পা রাখার মতো এবং সঠিক মান ফেরানোর আগে ভিতরে থাকা সমস্ত কিছু সঠিক কিনা তা নিশ্চিত করার মতো।


20

মানসিক মডেল ব্যবহার করে আমাকে সমস্ত ব্যাখ্যা এবং নিবন্ধের চেয়ে এটি বুঝতে "সত্যই ডুবে যায়নি"।

ভাবুন আপনার বাচ্চাটির টেবিলে কাচের প্লেট রয়েছে এবং সে এটি খেলতে শুরু করে। এখন, আপনি ভয় পাচ্ছেন যে এটি ভেঙে যাবে। সুতরাং, আপনি তার পরিবর্তে তাকে একটি প্লাস্টিকের প্লেট দিন। এটি একটি মোক (একই আচরণ, একই ইন্টারফেস, "নরম" বাস্তবায়ন) হবে।

এখন, বলুন আপনার কাছে প্লাস্টিকের প্রতিস্থাপন নেই, তাই আপনি ব্যাখ্যা করুন "আপনি যদি এটির সাথে খেলা চালিয়ে যান তবে তা ভেঙে যাবে!"। এটি একটি স্টাব , আপনি আগে থেকেই একটি পূর্বনির্ধারিত অবস্থা সরবরাহ করেছিলেন।

একটি ডামি সেই কাঁটাচামচ হবে যা তিনি এমনকি ব্যবহার করেন নি ... এবং একটি স্পাই এমনই কিছু হতে পারে যা আপনি ইতিমধ্যে ব্যবহার করেছেন এমন একই ব্যাখ্যা সরবরাহ করার মতো।


19

আমি মনে করি তাদের মধ্যে সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি তাদের উদ্দেশ্য।

আমাকে এটি কেন স্টাব বনাম, কেন বিদ্রূপে ব্যাখ্যা করার চেষ্টা করা উচিত

ধরুন আমি আমার ম্যাক টুইটার ক্লায়েন্টের পাবলিক টাইমলাইন কন্ট্রোলারের জন্য পরীক্ষার কোড লিখছি

পরীক্ষার নমুনা কোডটি এখানে

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


1
আমি মনে করি আপনার সঠিক ধারণা আছে তবে ডিলন কার্নস এটিকে আরও স্পষ্টভাবে ব্যাখ্যা করেছেন।
ও'রুনি

19

খুব স্পষ্ট এবং ব্যবহারিক হতে:

স্টাব: এমন একটি শ্রেণি বা অবজেক্ট যা নকল হওয়ার জন্য শ্রেণি / অবজেক্টের পদ্ধতিগুলি প্রয়োগ করে এবং আপনি যা চান সর্বদা ফিরে আসে।

জাভাস্ক্রিপ্ট উদাহরণ:

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!');
   }
}

16

এই স্লাইডটি মূল পার্থক্যগুলি খুব ভাল ব্যাখ্যা করে।

এখানে চিত্র বর্ণনা লিখুন

* সিএসই 403 লেকচার 16, ওয়াশিংটন বিশ্ববিদ্যালয় থেকে (স্লাইড "মার্টি স্টেপ" তৈরি করেছেন)


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

12

আমি রায় ওশেরোভ [ভিডিও লিঙ্ক] দ্বারা দেওয়া ব্যাখ্যাটি পছন্দ করি ।

তৈরি প্রতিটি শ্রেণি বা বস্তু একটি জাল। আপনি যদি এর বিরুদ্ধে কলগুলি যাচাই করেন তবে এটি মক। অন্যথায় এটি একগুঁয়ে।


12
  • স্টাবস বনাম মোকস
    • নিবন্ধসমূহ
      1. পদ্ধতি কলগুলির জন্য নির্দিষ্ট উত্তর সরবরাহ করুন
        • উদাহরণস্বরূপ: myStubbedService.getValues ​​() সবেমাত্র পরীক্ষার অধীনে কোডের জন্য প্রয়োজনীয় একটি স্ট্রিং ফিরিয়ে দেয়
      2. এটি বিচ্ছিন্ন করার জন্য পরীক্ষার অধীনে কোড দ্বারা ব্যবহৃত
      3. পরীক্ষায় ব্যর্থ হতে পারে না
        • উদাহরণস্বরূপ: myStubbedService.getValues ​​() সবেমাত্র মানটি দেয় returns
      4. প্রায়শই বিমূর্ত পদ্ধতি প্রয়োগ করে
    • ঠাট্টা
      1. স্টাবগুলির "সুপারসেট"; নির্দিষ্ট পদ্ধতি বলা হয় যে দৃsert়ভাবে বলতে পারেন
        • উদাহরণস্বরূপ: যাচাই করুন যে মাইমকড সার্ভিস.সেটভ্যালুগুলি () কেবল একবার ডাকা হয়েছিল
      2. পরীক্ষার অধীনে কোড আচরণ আচরণ করতে ব্যবহৃত
      3. পরীক্ষায় ব্যর্থ হতে পারে
        • উদাহরণস্বরূপ: যাচাই করুন যে মাইমকড সার্ভিস.সেটভ্যালু () একবার কল হয়েছিল; যাচাইকরণ ব্যর্থ হয়, কারণ আমার পরীক্ষিত কোড দ্বারা মাইমকড সার্ভিস.সেটভ্যালু () কল করা হয়নি
      4. প্রায়ই ইন্টারফেস উপহাস

10

টেস্ট দ্বিগুণ দেখুন:

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

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


1
আমার মতে সেরা উত্তর
এরো স্টেফানো

9

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

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

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

পরীক্ষা সহজেই চালানো মানে কী?
নীচের কোডে ফরেক্স নমুনা:

 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


8

জে মকের বিকাশকারীগণ কর্তৃক কাগজ মক রোলস, অবজেক্টস নয় , থেকে ডানদিকে:

স্টাবগুলি হ'ল উত্পাদনের কোডের ডামি বাস্তবায়ন যা ক্যানড ফলাফলগুলি দেয় return মক অবজেক্টস স্টাবস হিসাবে কাজ করে তবে তার প্রতিবেশীদের সাথে লক্ষ্য বস্তুর মিথস্ক্রিয়াকে বোঝার জন্য অন্তর্ভুক্তও অন্তর্ভুক্ত করে।

সুতরাং, প্রধান পার্থক্যগুলি হ'ল:

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

সংক্ষেপে, ফোলারের নিবন্ধ শিরোনাম থেকে বিভ্রান্তি ছড়িয়ে দেওয়ার চেষ্টা করার সময় : বিদ্রূপগুলি হ'ল স্টাব, তবে তারা কেবল স্টাবই নয়


1
আমি মনে করি আপনি ঠিক বলেছেন, তবে এই কারণেই ফোলার নিবন্ধটি বিভ্রান্ত করছে, নিবন্ধটির শিরোনাম "মকস অ্যারেন্ট স্টাবস" নয় ... তবে তারা কি ?! ¯_ (ツ) _ / ¯
স্টোনডাউজ

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

@ স্টোনডাউজ, একটি মোক একটি স্টাব নয়, অনেকটা আয়তক্ষেত্রের মতো বর্গক্ষেত্র নয়। :)
seanriordan08

7

আমি আর্ট অফ ইউনিট টেস্টিং পড়ছিলাম , এবং নিম্নলিখিত সংজ্ঞায় হোঁচট খেয়েছি:

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


5

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


4

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

মোক এটি একটি নকল বস্তু যা পরীক্ষা চালায়। আমরা দৃ put় করা যেখানে।


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

4

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

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";
        }
    }
}

4

স্টাব এবং মক টেস্টিং ভিউ:

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

  • মক হ'ল ডামি বাস্তবায়ন তবে এর প্রয়োগটি মকিতোর মতো মক্কৃত ফ্রেমওয়ার্ক ব্যবহার করে গতিশীল উপায়ে সম্পন্ন হয়েছে । সুতরাং আমরা গতিশীল উপায় হিসাবে শর্ত এবং পরিষেবা সংজ্ঞা হ্যান্ডেল করতে পারি অর্থাৎ রানটাইম সময় কোড থেকে মোকে তৈরি করা যেতে পারে। তাই মক ব্যবহার করে আমরা গতিশীলভাবে স্টবগুলি প্রয়োগ করতে পারি।


3

প্লাস দরকারী উত্তর, উপকারের চেয়ে মকস ব্যবহারের অন্যতম শক্তিশালী পয়েন্ট

যদি সহযোগী [যা প্রধান কোড এটা উপর নির্ভর করে] আমাদের নিয়ন্ত্রণে নয় (যেমন একটি তৃতীয় পক্ষের লাইব্রেরি থেকে),
এই ক্ষেত্রে, শহরের উপর অসম্পূর্ণ নিবন্ধ আরো কঠিন উপহাস বদলে লিখতে হয়


2

আমি আমার উত্তরে অজগর উদাহরণগুলি ব্যবহার করেছি পার্থক্যগুলি বর্ণনা করার জন্য।

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

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 মকের নোটটি ইউনিটেস্টে অন্তর্ভুক্ত নয় তবে এটি ডাউনলোডযোগ্য মডিউল যা পিপের মাধ্যমে ডাউনলোড করতে পারবেন (পিপ ইনস্টল মক)।

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


2

স্টাব পরীক্ষার উদ্দেশ্যে নির্মিত একটি জাল বস্তু। মক হ'ল একটি স্টাব যা প্রত্যাশিত কল কার্যকরভাবে ঘটেছে কিনা তা রেকর্ড করে।


2

স্টাব একটি ফাঁকা ফাংশন যা পরীক্ষার সময় হাতছাড়া হওয়া ব্যতিক্রম এড়াতে ব্যবহৃত হয়:

function foo(){}

মোক একটি কৃত্রিম ফাংশন যা পরীক্ষার সময় ওএস, পরিবেশ বা হার্ডওয়্যার নির্ভরতা এড়াতে ব্যবহৃত হয়:

function foo(bar){ window = this; return window.toString(bar); }

দাবী এবং রাষ্ট্রের শর্তাবলী:

  • কোনও ঘটনা বা রাষ্ট্র পরিবর্তনের আগে মকস জোর দেওয়া হয়
  • স্টাবগুলি দৃserted়ভাবে বলা হয় না, তারা সম্পর্কিত না থাকা ইউনিটগুলি থেকে কোড চালানো কোড এড়াতে কোনও ইভেন্টের আগে রাষ্ট্র সরবরাহ করে
  • স্পাইস স্টাবগুলির মতো সেটআপ হয়, তারপরে কোনও ইভেন্ট বা রাষ্ট্র পরিবর্তনের পরে জোর দেওয়া হয়
  • জাল জোর দেওয়া হয় না, তারা রাষ্ট্র এড়ানোর জন্য হার্ডকডযুক্ত নির্ভরতা সহ একটি ইভেন্টের পরে চালায়

তথ্যসূত্র


2
শব্দকোষে গুপ্তচর যুক্ত করার জন্য +1। এছাড়াও, আমি মনে করি আপনার অর্থ
হ'ল


2

মক হ'ল প্রযুক্তিগত এবং কার্যক্ষম উভয় বস্তু।

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

একটি উপহাস ইনস্ট্যান্ট করা:

@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; 
  }
}

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


উপসংহার

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


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

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