ইন্টিগ্রেশন পরীক্ষাগুলি কি সমস্ত ইউনিট পরীক্ষার পুনরাবৃত্তি করতে বোঝায়?


36

ধরা যাক আমার একটি ফাংশন রয়েছে (রুবিতে লেখা, তবে প্রত্যেকের দ্বারা বোঝা উচিত):

def am_I_old_enough?(name = 'filip')
   person = Person::API.new(name)
   if person.male?
      return person.age > 21
   else
      return person.age > 18
   end
end

ইউনিট পরীক্ষায় আমি সমস্ত পরিস্থিতি কভার করার জন্য চারটি পরীক্ষা তৈরি করব। প্রত্যেকে Person::APIস্ট্যাবড পদ্ধতি male?এবং সাথে মশকরা বস্তু ব্যবহার করবে age

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

যদি হ্যাঁ, তবে ইউনিট পরীক্ষাগুলি লেখার বিন্দুটি কী, যদি আমি কেবল ইন্টিগ্রেশন টেস্টগুলি লিখতে পারি যা আমাকে আরও আত্মবিশ্বাস দেয় (যেহেতু আমি বাস্তব বস্তুগুলিতে কাজ করি, স্টাব বা বিদ্রূপ নয়)?


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

9
মাত্র চারটি পরীক্ষা? আপনার পরীক্ষা করা উচিত ছয়টি বাউন্ডারি বয়সের: 17, 18, 19, 20, 21, 22 ...;)
ডেভিড আরনো

22
ফিলিপবার্টুজি, আমি ধরে নিলাম পদ্ধতিটি পরীক্ষা করছে কিনা উদাহরণস্বরূপ একজন পুরুষের বয়স ২১ বছরের বেশি কিনা? যেমনটি বর্তমানে লিখিত আছে, এটি এটি করে না, এটি কেবলমাত্র 22+ হলেই সত্য। ইংরেজিতে "ওভার 21" এর অর্থ "21+"। সুতরাং আপনার কোডে একটি বাগ আছে। এই জাতীয় বাগগুলি সীমানা মানগুলি পরীক্ষা করে, যেমন একটি পুরুষের জন্য 20, 21, 22, এই ক্ষেত্রে কোনও মহিলার জন্য 17,18,19 রয়েছে captured সুতরাং কমপক্ষে ছয়টি পরীক্ষা করা দরকার।
ডেভিড আরনো

6
0 এবং -1 এর ক্ষেত্রে উল্লেখ না করা। একজনের বয়স 1 বছর বয়সী হওয়ার অর্থ কী? আপনার এপিআই যদি অযৌক্তিক কিছু ফেরত দেয় তবে আপনার কোডটি কী করা উচিত?
রাবারডাক

9
আপনি যদি কোনও ব্যক্তি পরামিতি হিসাবে বস্তুটি পাস করেন তবে এটি পরীক্ষা করা অনেক সহজ হবে।
জেফো

উত্তর:


72

না, ইন্টিগ্রেশন পরীক্ষাগুলি কেবল ইউনিট পরীক্ষার কভারেজটি সদৃশ করা উচিত নয়। তারা কিছু কভারেজ সদৃশ করতে পারে , কিন্তু এটি পয়েন্ট নয়।

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

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

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

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


6
"আমরা পরীক্ষার বিকল্প পরিস্থিতিতে ডুবে না গিয়ে সিস্টেমটি যা করা উচিত তা করছে বলে আমরা একটি দৃ confident় আত্মবিশ্বাসের মূল্যায়ন পেতে পারি।" ধন্যবাদ. আমি ভালবাসি যখন কেউ স্যানিটি দিয়ে স্বয়ংক্রিয় পরীক্ষার দিকে যায়।
jpmc26

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

The customer doesn't care about a particular utility function you wrote, they care that their web app is properly secured against access by minors-> এটা খুব চতুর মানসিকতা, ধন্যবাদ! সমস্যাটি যখন আপনি নিজের জন্য প্রকল্প করেন do প্রোগ্রামার হওয়া এবং একই মুহুর্তে প্রোডাক্ট ম্যানেজার হওয়ার মধ্যে আপনার মানসিকতাকে বিভক্ত করা শক্ত
ফিলিপ বার্তুজি

14

সংক্ষিপ্ত উত্তর হলো 'না". আরও আকর্ষণীয় অংশ হ'ল কেন / কীভাবে এই পরিস্থিতি তৈরি হতে পারে।

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

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

সর্বাধিক সুস্পষ্ট কারণ হ'ল আপনার ফাংশন দুটি পৃথক কার্য সম্পাদন করছে:

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

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

আমরা যদি বিকল্পটি কল্পনা করি তবে আমাদের নিজস্ব গণনা থাকতে পারে:

def is_old_enough?(person)
   if person.male?
      return person.age > 21
   else 
      return person.age > 18
   end
end

যেহেতু এটি খাঁটি গণনা, আমাদের এটিতে সংহতকরণ পরীক্ষা করার দরকার নেই।

আমরা আলাদাভাবে লুকিং টাস্কটি লেখার জন্যও প্রলুব্ধ হতে পারি:

def person_from_name(name = 'filip')
   return Person::API.new(name)
end

যাইহোক, এই ক্ষেত্রে কার্যকারিতা এত কাছাকাছি Person::API.new যে আমি বলব যে আপনি এটির পরিবর্তে ব্যবহার করা উচিত (যদি ডিফল্ট নামটি প্রয়োজন হয় তবে এটি আরও ভাল কোনও শ্রেণীর বৈশিষ্ট্যের মতো সংরক্ষণ করা যেতে পারে?)।

Person::API.new(বা person_from_name) এর জন্য ইন্টিগ্রেশন টেস্টগুলি লেখার সময় আপনার প্রত্যাশাগুলি ফিরে পাওয়া কিনা তা বিবেচনা করা উচিত Person; বয়সের ভিত্তিক সমস্ত গণনা অন্য কোথাও যত্ন নেওয়া হয়, যাতে আপনার সংহতকরণ পরীক্ষাগুলি এটিকে উপেক্ষা করতে পারে।


11

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

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

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

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


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