মক অবজেক্টের উদ্দেশ্য কী?


167

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


12
আপনার হাতের সমস্যার প্রয়োজন নেই এমন নমনীয়তার সাথে তারা ব্যাপকভাবে অতিরিক্ত কাজ করার জন্য একটি সরঞ্জাম।
dsimcha

উত্তর:


360

যেহেতু আপনি বলছেন যে আপনি ইউনিট টেস্টিংয়ে নতুন এবং "সাধারণ মানুষের শর্তাবলীতে" মক অবজেক্টের জন্য জিজ্ঞাসা করেছেন, তাই আমি একজন সাধারণ ব্যক্তির উদাহরণ চেষ্টা করব।

অংশ পরিক্ষাকরণ

এই সিস্টেমের জন্য ইউনিট পরীক্ষার কল্পনা করুন:

cook <- waiter <- customer

এটি নিম্ন স্তরের উপাদানগুলির মতো পরীক্ষার কল্পনা করা সহজ cook:

cook <- test driver

পরীক্ষা চালক কেবল আলাদা আলাদা খাবারের অর্ডার করে এবং কুকটি যাচাই করে প্রতিটি অর্ডারের জন্য সঠিক থালা ফেরত দেয়।

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

cook <- waiter <- test driver

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

যেহেতু এটি একটি ওয়েটার পরীক্ষা, আদর্শভাবে, আমরা কেবল ওয়েটার পরীক্ষা করতে চাই, রান্না নয়। বিশেষত, আমরা নিশ্চিত করতে চাই যে ওয়েটার গ্রাহকের আদেশটি সঠিকভাবে রান্নায় পৌঁছে দেয় এবং কুকের খাবারটি গ্রাহকের কাছে সঠিকভাবে সরবরাহ করে।

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

    -----------------------
   |                       |
   v                       |
test cook <- waiter <- test driver

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

মক অবজেক্টস

এখন, পরীক্ষা কুক (টেস্ট ডাবল) বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে:

  • একটি জাল রান্না - হিমায়িত ডিনার এবং মাইক্রোওয়েভ ব্যবহার করে কেউ রান্না করার ভান করে,
  • স্টাব কুক - হট ডগ বিক্রেতার যা আপনি সর্বদা হট কুকুর সরবরাহ করেন আপনি যা আদেশ করেন তা নয় বা
  • একটি মক কুক - একটি স্টিং অপারেশনে কুক হিসাবে ভান করা স্ক্রিপ্টের পরে একটি আন্ডারকভার কপ।

ফেক বনাম স্টাবস বনাম মক বনাম ডামি সম্পর্কিত আরও সুনির্দিষ্টতার জন্য ফওলারের নিবন্ধটি দেখুন , তবে আপাতত, আসুন একটি মক কুকের দিকে মনোযোগ দিন।

    -----------------------
   |                       |
   v                       |
mock cook <- waiter <- test driver

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

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

একটি মোক-ভিত্তিক পরীক্ষার চারপাশের কথোপকথনটি এর মতো দেখতে পাওয়া যেতে পারে:

মক কুকের জন্য ড্রাইভারটি পরীক্ষা করুন : একটি হট ডগ অর্ডার আশা করুন এবং প্রতিক্রিয়াতে তাকে এই ডামি হট কুকুরটি দিন

টেস্ট ড্রাইভার (গ্রাহক হিসাবে অঙ্গবিন্যাস) এর ওয়েটার : আমি একটি হট ডগ চাই দয়া করে
ওয়েটার থেকে উপহাস রান্না : 1 হট ডগ খুশি
উপহাস রাঁধুনি করার ওয়েটার : অর্ডার আপ: 1 হট ডগ প্রস্তুত (ওয়েটার থেকে ডামি হট ডগ দেয়)
ওয়েটার থেকে টেস্ট ড্রাইভার : এখানে আপনার হট ডগ (ড্রাইভার পরীক্ষা করার জন্য ডামি হট কুকুর দেয়)

পরীক্ষা চালক : পরীক্ষায় সফল!

তবে যেহেতু আমাদের ওয়েটারটি নতুন, তাই এটিই ঘটতে পারে:

টেস্ট ড্রাইভার করারমক কুকের : একটি হট ডগ অর্ডার আশা করুন এবং প্রতিক্রিয়াতে তাকে এই ডামি হট কুকুরটি দিন

টেস্ট ড্রাইভার (গ্রাহক হিসাবে অঙ্গবিন্যাস) এর ওয়েটার : আমি একটি হট ডগ চাই দয়া করে
ওয়েটার থেকে রান্না উপহাস : 1 হ্যামবার্গার খুশি
উপহাস রাঁধুনি পরীক্ষা বন্ধ হয়ে যায়: আমি একটি হট ডগ কেমনে এ আদেশ করতে বলা হয়!

পরীক্ষক ড্রাইভার সমস্যাটি নোট করে: পরীক্ষায় ব্যর্থ! - ওয়েটার অর্ডার পরিবর্তন করেছে

অথবা

মক কুকের জন্য ড্রাইভারটি পরীক্ষা করুন : একটি হট ডগ অর্ডার আশা করুন এবং প্রতিক্রিয়াতে তাকে এই ডামি হট কুকুরটি দিন

টেস্ট ড্রাইভার (গ্রাহক হিসাবে অঙ্গবিন্যাস) এর ওয়েটার : আমি একটি হট ডগ চাই দয়া করে
ওয়েটার থেকে উপহাস রান্না : 1 হট ডগ খুশি
উপহাস রাঁধুনি করার ওয়েটার : অর্ডার আপ: 1 হট ডগ প্রস্তুত (ওয়েটার থেকে ডামি হট ডগ দেয়)
ওয়েটার থেকে টেস্ট ড্রাইভার : এখানে আপনার ফ্রেঞ্চ ফ্রাই (ড্রাইভার পরীক্ষা করার জন্য অন্য কোনও আদেশ থেকে ফ্রেঞ্চ ফ্রাই দেয়)

পরীক্ষামূলক চালক অপ্রত্যাশিত ফ্রেঞ্চ ফ্রাই নোট করে: ব্যর্থ! ওয়েটার ভুল থালা ফিরিয়ে দিয়েছে

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

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


12
এটি দুর্দান্ত ব্যাখ্যা, তবে আপনি কিছুটা অপেক্ষার জন্য ওয়েটার বাস্তবায়ন করছেন না? আপনার ক্ষেত্রে এটি সম্ভবত ঠিক আছে কারণ আপনি এটি সঠিক API ব্যবহার করছেন তা যাচাই করছেন, তবে যদি এটি করার বিভিন্ন উপায় থাকে এবং ওয়েটার এক বা অন্যটিকে বেছে নিতে পারে তবে কী হবে? আমি ভেবেছিলাম ইউনিট পরীক্ষার বিন্দুটি এপিআই পরীক্ষা করা, বাস্তবায়ন নয় implementation (এটি এমন একটি প্রশ্ন যা আমি সর্বদা নিজেকে জিজ্ঞাসা করি যখন আমি বিদ্রূপের বিষয়ে পড়ি))
ডেভিডটবার্নাল

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

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

1
এই উত্তরটি আমার মতে যথেষ্ট প্রযুক্তিগত নয়। আমি সত্যিকারের বস্তুগুলি যখন ব্যবহার করতে পারি তখন কেন আমাকে মক অবজেক্টটি ব্যবহার করা উচিত তা জানতে চাই।
নিক্লাস আর।

1
দুর্দান্ত ব্যাখ্যা !! ধন্যবাদ!! @ বার্টএফ
মুরালি

28

মক অবজেক্ট এমন একটি বস্তু যা সত্যিকারের বস্তুর পরিবর্তে। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে, মক অবজেক্টগুলি সিমুলেটেড অবজেক্টস যা নিয়ন্ত্রিত উপায়ে বাস্তব বস্তুর আচরণ অনুকরণ করে।

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

http://en.wikipedia.org/wiki/Mock_object

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

"মক" শব্দটি মাঝে মধ্যে ভুলভাবে "স্টাব" এর সাথে বিনিময়যোগ্য হিসাবে ব্যবহৃত হয়। দুটি শব্দের মধ্যে পার্থক্য এখানে বর্ণিত হয়েছে। মূলত, একটি মোক একটি স্টাব অবজেক্ট যা পরীক্ষার অধীনে অবজেক্ট / পদ্ধতির যথাযথ আচরণের জন্য প্রত্যাশাগুলি (যেমন "দৃ ie়তা") অন্তর্ভুক্ত করে।

উদাহরণ স্বরূপ:

class OrderInteractionTester...
  public void testOrderSendsMailIfUnfilled() {
    Order order = new Order(TALISKER, 51);
    Mock warehouse = mock(Warehouse.class);
    Mock mailer = mock(MailService.class);
    order.setMailer((MailService) mailer.proxy());

    mailer.expects(once()).method("send");
    warehouse.expects(once()).method("hasInventory")
      .withAnyArguments()
      .will(returnValue(false));

    order.fill((Warehouse) warehouse.proxy());
  }
}

লক্ষ্য করুন যে warehouseএবং mailerমক অবজেক্টগুলি প্রত্যাশিত ফলাফলের সাথে প্রোগ্রাম করা হয়েছে।


2
আপনি যে সংজ্ঞাটি দিয়েছেন তা "স্টাব অবজেক্ট" এর চেয়ে আলাদা নয় এবং এর মতো একটি মক অবজেক্টটি কী তা ব্যাখ্যা করে না।
ব্রেন্ট আরিয়াস

আরেকটি সংশোধন "" মক "শব্দটি কখনও কখনও ভুলভাবে " স্টাব "এর সাথে বিনিময়যোগ্য হিসাবে ব্যবহৃত হয়।
ব্রেন্ট আরিয়াস

@ মিস্ট: দুটি শব্দের ব্যবহার সর্বজনীন নয়; এটি লেখকদের মধ্যে পরিবর্তিত হয়। ফওলার তাই বলেছেন, এবং উইকিপিডিয়া নিবন্ধটি তাই বলেছে। যাইহোক, পরিবর্তনটি সম্পাদন করতে নির্দ্বিধায় এবং আপনার ডাউনটোটটি সরান। :)
রবার্ট হার্ভে

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

15

মক অবজেক্টগুলি সিমুলেটেড অবজেক্টস যা প্রকৃতগুলির আচরণের অনুকরণ করে। সাধারণত আপনি একটি মক অবজেক্ট লিখেন যদি:

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

12

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

সাধারণত আপনি ধরণের 'প্রোগ্রাম' বা 'রেকর্ড' প্রত্যাশা করবেন: পদ্ধতিটি আপনাকে কল করে যে আপনার ক্লাসটি অন্তর্নিহিত কোনও বস্তুতে করবে।

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

আসুন ভেবে দেখি পরিষেবার কী করা উচিত: এটি ডাটাবেস থেকে একটি উইজেট পাওয়া উচিত, এটি দিয়ে কিছু করা এবং এটি আবার সংরক্ষণ করুন।

সুতরাং সিউডো-ভাষায় সিউডো-মক লাইব্রেরি সহ আমাদের এমন কিছু হবে:

Widget sampleWidget = new Widget();
WidgetDao mock = createMock(WidgetDao.class);
WidgetService svc = new WidgetService(mock);

// record expected calls on the dao
expect(mock.getById(id)).andReturn(sampleWidget);   
expect(mock.save(sampleWidget);

// turn the dao in replay mode
replay(mock);

svc.updateWidgetPrice(id,newPrice);

verify(mock);    // verify the expected calls were made
assertEquals(newPrice,sampleWidget.getPrice());

এইভাবে আমরা সহজেই অন্যান্য ক্লাসের উপর নির্ভরশীল ক্লাসগুলির ড্রাইভ বিকাশের পরীক্ষা করতে পারি।


11

আমি মার্টিন ফাউলারের একটি দুর্দান্ত নিবন্ধটি সুপারিশ করছি যাতে হ'ল মকগুলি কী এবং কীভাবে তারা স্টাবগুলি থেকে পৃথক হয় expla


10
ঠিক শিক্ষানবিস বান্ধব নয়, তাই না?
রবার্ট হার্ভে

@ রবার্ট হার্ভে: সম্ভবত, আপনার উত্তরটি পরিষ্কার করার ক্ষেত্রে এটি সহায়ক ছিল তা দেখে ভাল লাগতে পারে :)
অ্যাডাম ব্যারটেক

মার্টিন ফোলার নিবন্ধগুলি আরএফসিগুলির পদ্ধতিতে লেখা হয়: শুকনো এবং শীতল।
রেভো

9

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

উদাহরণস্বরূপ, কোনও প্রোগ্রামের কাল্পনিক অংশ থেকে নীচের সিউডো কোডটি দেখুন যা কিছু মুদ্রণ কল করতে অন্য প্রোগ্রাম ব্যবহার করে:

If theUserIsFred then
    Call Printer(HelloFred)
Else
   Call Printer(YouAreNotFred)
End

আপনি যদি এটি পরীক্ষা করে দেখেন তবে আপনি মূলত সেই অংশটি পরীক্ষা করতে চান যা ব্যবহারকারী ফ্রেড কিনা তা দেখে। আপনি সত্যিই Printerজিনিসগুলির অংশটি পরীক্ষা করতে চান না । এটা অন্য পরীক্ষা হবে।

এই হল সেই জায়গা যেখানে নকল বস্তু। তারা কিছু অন্যান্য ধরনের হতে জাহির আসা। এই ক্ষেত্রে আপনি একটি মক ব্যবহার করবেন Printerযাতে এটি ঠিক একটি আসল প্রিন্টারের মতো কাজ করে তবে মুদ্রণের মতো অসুবিধে না করে।


এমন আরও বেশ কয়েকটি প্রকারের ভান্ট অবজেক্ট রয়েছে যা আপনি ব্যবহার করতে পারেন যা মকস নয়। মকসকে মকস করে তোলে মূল জিনিসটি সেগুলি আচরণ এবং প্রত্যাশার সাথে কনফিগার করা যায়।

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

মোকস মধ্যে আচরণ অর্থ হল উদাহরণস্বরূপ, আপনার এমন কিছু করা হয়েছিল:

If Call Printer(HelloFred) Returned SaidHello Then
    Do Something
End

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

এর চারপাশের একটি ভাল সংস্থান হ'ল মার্টিন ফওলারের পোস্ট মকস আরেন্ট স্টবস পোস্ট করেন না


7

মক এবং স্টাব বস্তুগুলি ইউনিট পরীক্ষার একটি গুরুত্বপূর্ণ অঙ্গ are প্রকৃতপক্ষে তারা একক দলের পরিবর্তে আপনি ইউনিট পরীক্ষা করছেন তা নিশ্চিত করার জন্য তারা অনেক দূর এগিয়ে যায় ।

সংক্ষেপে, আপনি স্টাটগুলি SUT এর (সিস্টেম আন্ডার টেস্ট) অন্যান্য বিষয় এবং উপহাসের উপর নির্ভরতা ভাঙ্গতে ব্যবহার করেন এবং এটি যাচাই করে যে SUT নির্ভরশীলতার উপর নির্দিষ্ট পদ্ধতি / বৈশিষ্ট্য বলে called এটি ইউনিট পরীক্ষার মৌলিক নীতিগুলিতে ফিরে যায় - পরীক্ষাগুলি সহজেই পাঠযোগ্য, দ্রুত এবং কনফিগারেশনের প্রয়োজন হয় না, যা সমস্ত বাস্তব শ্রেণীর ব্যবহার বোঝাতে পারে।

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

সি # এবং মূক ব্যবহার করে সাধারণ দৃশ্য:

public interface IInput {
  object Read();
}
public interface IOutput {
  void Write(object data);
}

class SUT {
  IInput input;
  IOutput output;

  public SUT (IInput input, IOutput output) {
    this.input = input;
    this.output = output;
  }

  void ReadAndWrite() { 
    var data = input.Read();
    output.Write(data);
  }
}

[TestMethod]
public void ReadAndWriteShouldWriteSameObjectAsRead() {
  //we want to verify that SUT writes to the output interface
  //input is a stub, since we don't record any expectations
  Mock<IInput> input = new Mock<IInput>();
  //output is a mock, because we want to verify some behavior on it.
  Mock<IOutput> output = new Mock<IOutput>();

  var data = new object();
  input.Setup(i=>i.Read()).Returns(data);

  var sut = new SUT(input.Object, output.Object);
  //calling verify on a mock object makes the object a mock, with respect to method being verified.
  output.Verify(o=>o.Write(data));
}

উপরের উদাহরণে আমি মোখকে স্টাব এবং বিদ্রূপ প্রদর্শনের জন্য ব্যবহার করেছি। মোক উভয়ের জন্য একই শ্রেণি ব্যবহার করে - Mock<T>যা এটি কিছুটা বিভ্রান্ত করে তোলে। নির্বিশেষে, রানটাইমে, পরীক্ষাটি output.Writeডাটা হিসাবে যেমন না ডাকা হয় তা ব্যর্থ হবে parameter, যেখানে কল input.Read()করতে ব্যর্থতা ব্যর্থ হবে না।


4

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

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

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


3

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


1

পিএইচপি এবং phpunit জন্য phpunit ডকুমেন্টেশন ভাল ব্যাখ্যা করা হয়েছে। এখানে দেখো phpunit ডকুমেন্টেশন দেখুন

সাধারণ কথায় কৌতুকপূর্ণ অবজেক্টটি আপনার আসলটির কেবলমাত্র ডামি অবজেক্ট এবং এটির ফেরতের মান ফিরিয়ে দেওয়া হয়, এই রিটার্ন মানটি পরীক্ষার শ্রেণিতে ব্যবহার করা যেতে পারে


0

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

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