ইউনিট পরীক্ষায়, আমি কেন দু'বার একটি সংগ্রহস্থল তৈরি করব?


10

অন্য দিন আমি ইউনিট টেস্টিং সম্পর্কে সামান্য পড়ছিলাম এবং আমি কয়েকটি উদাহরণ দেখলাম যেখানে লোকেরা একটি সংগ্রহস্থল ইন্টারফেস IExampleRepositoryতৈরি করে (যেমন ) এবং তারপরে public class ExampleRepository : IExampleRepositoryইউনিট পরীক্ষার জন্য ব্যবহার করার জন্য প্রকৃত সংগ্রহশালা ( ) এবং একটি সংগ্রহস্থল তৈরি করে FakeExampleRepository : IExampleRepository

তবে IExampleRepositoryতারা ExampleRepositoryবিভিন্ন লিঙ্ক প্রশ্নের সাথে একই পদ্ধতি প্রয়োগ করেছিল ।

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

উত্তর:


8

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

এটি বলেছিল যে আপনার 'সত্যিকারের' সংগ্রহস্থল * দিয়েও পরীক্ষা করা দরকার, তবে এটি সাধারণত ইন্টিগ্রেশন / সিস্টেম টেস্টে করা হবে

* পরীক্ষার জন্য রেপো সেটআপ করার মতো স্পষ্টতই বাস্তব, আশা করা যায় না যেমন উত্পাদন ডিবি।


সুতরাং ইউনিট পরীক্ষায় আমি নিজেই পদ্ধতিটি পরীক্ষা করে দেখব না যে এটি সঠিক মানগুলি (একটি ভুয়া / উপহাসিত ডেটা সেটের উপর ভিত্তি করে) প্রদান করে?
জাও

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

1
ঠিক আছে, তাই যদি আমি সঠিকভাবে বুঝতে পারি তবে ইউনিটগুলি পরীক্ষার সময় আমার মূল সংগ্রহস্থলটি ব্যবহার করা উচিত। আমি যখন কন্ট্রোলারদের জন্য ইউনিট পরীক্ষা লিখছি (এএসপি নেট নেট এমভিসির ক্ষেত্রে)
জাও

4
@ থোম্যাক্স প্রসঙ্গে নির্ভর করে: আপনি যদি কোনও সফ্টওয়্যার উপাদান যা আপনার নয় তা পরীক্ষা করে নিচ্ছেন তবে মক ব্যবহার করা ভাল। সমর্থনযোগ্যতা হ'ল আপনি ভান্ডারটিকে ইউনিট-টেস্টিং করছেন না বরং অন্য কিছু করছেন। ExampleRepository
Andres F.

5
@ থোম্যাক্স অ্যান্ড্রেসএফ.এর মন্তব্যকে প্রসারিত করতে: আপনি যদি ইউনিট পরীক্ষা করছেন ExampleRepositoryতবে আসল জিনিসটি ব্যবহার করুন। আপনি যদি ইউনিট পরীক্ষা করছেন RepositoryController, তবে এটি কেবলFakeExampleRepository এমন একটি ব্যবহার করা উচিত যা পূর্বনির্ধারিত মানগুলি দেয়। এই ভাবে, করার জন্য একটি বাগ শিহরণ যদি ExampleRepository, শুধুমাত্র যে ইউনিট পরীক্ষা ব্যর্থ হবে - RepositoryControllerএর পরীক্ষা সফল করতে তাই আপনি জানেন সেখানে একটি বাগ আছে না চলতে থাকবে। যদি নিয়ামক প্রকৃত সংগ্রহশালা ব্যবহার করেন তবে তারা উভয়ই ব্যর্থ
হতেন

5

আমি জে কে থেকে দুটি উত্তরের সাথে একমত এবং জান হুডেক - তারা কিছু সত্যই ভাল তথ্য দেয়। তবে আমি ভেবেছিলাম আমি কিছুটা যোগ করব।

আপনার প্রথম প্রশ্ন ("এখানে উদ্দেশ্যটি ঠিক কী?") গুরুত্বপূর্ণ। আপনি যে ক্ষেত্রে বর্ণনা করছেন, আসল উদ্দেশ্যটি হল সেই ক্লাসগুলি পরীক্ষা করা যা IExampleRepositoryইন্টারফেসটি ব্যবহার করছে , সংগ্রহস্থল প্রয়োগগুলি পরীক্ষা করে না। অনুমতিগুলি তৈরি করা FakeExampleRepositoryআপনাকে প্রকৃত সংগ্রহশালা শ্রেণীর বিশদ সম্পর্কে চিন্তা না করে those ক্লায়েন্ট ক্লাসগুলির পরীক্ষা করতে দেয়।

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

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


the real objective is to test the classes that are utilizing the IExampleRepository interfaceএটি কঠোরভাবে সত্য নয়। উদ্দেশ্যটি হ'ল আইেক্সেম্পলরেপোজিটরির স্বাধীনভাবে এটি পরীক্ষা করা । যদিও একটি ভাল বিচ্ছিন্ন কাঠামো সুপারিশ করার জন্য +1।
স্টুপার ইউজার

1
আমি একমত নই এটি স্বতন্ত্র নয় IExampleRepositoryকারণ পরীক্ষার অধীন শ্রেণিটি সেই ইন্টারফেসের সাথে মিলিত হয়। তবে এটি ইন্টারফেসের যে কোনও বাস্তবায়ন থেকে স্বতন্ত্র । আমি স্বীকার করব যে আমার ব্যাখ্যা সম্ভবত কিছুটা আরও সূক্ষ্ম ব্যবহার করতে পারে। :)
অ্যালান

5

ঠিক এখানে উদ্দেশ্য কি?

আলাদা করা.

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

জাল ক্লাস তৈরি করে পরীক্ষার অধীনে একমাত্র উত্পাদন কোড code

আপনি যদি সঠিকভাবে একটি নকল সংগ্রহস্থল তৈরি করেন এবং পরীক্ষা ব্যর্থ হয় তবে আপনি জানেন যে সমস্যাটি কোড-আন্ডার-টেস্টের সাথে। এটি আপনাকে বিনামূল্যে নির্ণয়ের সুবিধা দেয়।

(যেমন বিচ্ছিন্নতা অবকাঠামো কটাক্ষপাত আছে MOQ যেমন @Allan দ্বারা প্রস্তাবিত) সেটআপ পরীক্ষা শর্ত দ্রুত এই fakes তৈরী করা এবং তাদের বিরুদ্ধে জাহির করা ব্যবহার করতে পারবেন না।


Fakes, ঠাট্টা এবং নিবন্ধসমূহ আরও বিবরণ: stackoverflow.com/questions/346372/...
StuperUser

4

আপনি ইউনিট পরীক্ষায় মক উদাহরণ প্রদান করতে পারেন এমন তিনটি কারণ রয়েছে:

  1. আপনি পরীক্ষার সুযোগ সীমাবদ্ধ করতে চান, যাতে পরীক্ষাটি ডিপেন্ডির বাগগুলিতে প্রভাবিত না হয়, সম্ভবত এটি এখনও শেষ হয়নি বা স্থিতিশীল নয় বা আপনি অন্য কারও বাগগুলি আপনার পরীক্ষাগুলিকে প্রভাবিত করতে চান না।
  2. নির্ভরশীল সেট আপ করা জটিল। উদাহরণস্বরূপ ডেটা অ্যাক্সেস স্তর প্রায়শই উপহাস করা হয়, কারণ আসলটির জন্য একটি পরীক্ষা ডাটাবেস স্থাপন করা প্রয়োজন requires আপনার এখনও সত্যিকারের ডেটা অ্যাক্সেস স্তরটি পরীক্ষা করা দরকার, তবে অন্যান্য জিনিসগুলি ডিবাগ করার সময় আপনি ব্যয়বহুল সেটআপটিকে সীমাবদ্ধ করতে পারেন।
  3. নির্ভরশীল শ্রেণি বিভিন্ন ধরণের ত্রুটি সম্পর্কে সঠিকভাবে প্রতিক্রিয়া দেখায় তা পরীক্ষা করতে আপনি একটি মক সংস্করণ সরবরাহ করেন যা সমস্ত ধরণের ভুল উত্তর প্রদান করে। কারণ অনেক ব্যর্থতা মোডগুলি পুনরুত্পাদন করা বরং কঠিন, তবে এখনও পরীক্ষা করা উচিত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.