পরীক্ষা: নিরস্তক বা অ-নিরস্তক?


16

হয় হয় ভাল হয়

  • নির্ধারিত পরীক্ষা স্যুট, ফলাফল একই পরীক্ষাগুলিতে সফল হয়
  • নন-ডিস্ট্রিমেন্টিক টেস্ট স্যুট, যা সম্ভবত আরও বেশি কেসগুলি আবরণ করে

?

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

  • আপনি পরীক্ষামূলক ডাটাবেস থেকে কোন সারি (গুলি) ইনপুট হিসাবে নির্বাচিত হয়েছেন (উদাহরণস্বরূপ 10 তম এবং 412 তম সারি)
  • আপনি ডাটাবেস থেকে সিউডোরোম্বে ডেটা বাছাই করতে একটি এলোমেলো সংখ্যা জেনারেটর ব্যবহার করেন (একটি এলোমেলো সংখ্যা জেনারেটর দ্বারা নির্বাচিত দুটি সারি)

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

একে অপরকে বেছে নেওয়ার কারণগুলি কী কী?


5
সেই পরীক্ষাটি কখনও কখনও ব্যর্থ হয়। martinfowler.com/articles/nonDeterminism.html

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


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

1
(অবশেষে এমন একটি মেশিনের আশেপাশে গিয়েছিলাম যেখানে আমি টুইটারটি সঠিকভাবে সন্ধান করতে পারি - " সেই টেস্টটি কেবল কখনও কখনও ব্যর্থ হয় " টুইটারে # ফাইভর্ডটেকহরেন্স থেকে - এটি যথাযথভাবে ক্রেডিট করতে চেয়েছিল)

উত্তর:


30

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

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

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


আপনার উত্তরের জন্য ধন্যবাদ. আমি আমার প্রশ্নে করা মন্তব্য সম্পর্কে আপনার মতামত কি?
ডিসিকিং

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

আবার ধন্যবাদ. আমার উত্তরটি আপডেট করেছে যাতে এটি কেবল এমভিসি অ্যাপ্লিকেশনগুলিতে প্রযোজ্য বলে মনে হয় না।
ডিসিকিং

1
কিছু ইউআই প্রসঙ্গে (উদাহরণস্বরূপ, গেমগুলি নিয়ামক ইনপুট গ্রহণ করে) টেস্ট প্রোগ্রামগুলি করে যা এলোমেলো কী এন্ট্রি জেনারেট করে স্ট্রেস টেস্টিংয়ের জন্য কার্যকর হতে পারে। তারা ত্রুটিগুলি উদঘাটন করতে পারে যা ইচ্ছাকৃত ইনপুট দিয়ে খুঁজে পাওয়া শক্ত।
রোবট

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

4

নির্দোষ ও অ-সংজ্ঞাবাদী উভয়েরই একটা জায়গা আছে

আমি তাদের নিম্নরূপে ভাগ করব:

ইউনিট পরীক্ষা।

এগুলি প্রতিবার সঠিক একই ডেটার সাথে নিয়মিত, পুনরাবৃত্তিযোগ্য পরীক্ষা করা উচিত। ইউনিট পরীক্ষাগুলি নির্দিষ্ট, বিচ্ছিন্ন কোড বিভাগগুলির সাথে থাকে এবং সেগুলি একটি নির্মাতিক ফ্যাশনে পরীক্ষা করা উচিত।

কার্যকরী এবং ইনপুট চাপ পরীক্ষা।

এগুলি নিম্নলিখিত সতর্কতামূলকগুলির সাথে অ-নিরস্তাত্মক পদ্ধতির ব্যবহার করতে পারে:

  • এই সত্যটি পরিষ্কারভাবে বর্ণিত এবং ডেকে আনা হয়
  • নির্বাচিত এলোমেলো মানগুলি লগ হয় এবং ম্যানুয়ালি পুনরায় চেষ্টা করা যেতে পারে

3

উভয়।

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

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

  • একটি খালি তালিকা
  • মাত্র একটি উপাদান সহ একটি তালিকা
  • একই উপাদানগুলির সমস্ত সহ একটি তালিকা
  • একাধিক অনন্য উপাদান সহ একটি তালিকা
  • একাধিক উপাদান সহ একটি তালিকা, যার কয়েকটি সদৃশ
  • একটি তালিকা সঙ্গে NaN, INT_MINএবংINT_MAX
  • ইতিমধ্যে আংশিকভাবে বাছাই করা একটি তালিকা
  • 10,000,000 উপাদান সহ একটি তালিকা

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

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

  • আপনার কোডটিতে বাগগুলি খুঁজে পেতে ননডেটেরিমনস্টিক পরীক্ষাগুলি ব্যবহার করুন
  • আপনার কোডে ফিক্সগুলি যাচাই করতে ডিটারমিনিস্টিক পরীক্ষাগুলি ব্যবহার করুন

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


-1

আপনি সত্যিকার অর্থে ডিটারমিনিস্টিক বনাম নন-ডিটারমিনিস্টিক চান না।

আপনি যা চাইতে পারেন তা হ'ল "সর্বদা একই" বনাম "" সবসময় একই না "।

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

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


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