কিভাবে "ভাল" ইউনিট পরীক্ষা লিখতে?


61

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

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


8
যে কোনও ভাল ইউনিট পরীক্ষায় কেবল একটি জিনিস পরীক্ষা করা উচিত - যদি এটি ব্যর্থ হয় তবে আপনাকে কী ভুল হয়েছে তা সঠিকভাবে জানা উচিত।
গ্যাবলিন

2
যখন প্রচুর পরিমাণে ডেটা থাকে তখন ভাল জিনিস হ'ল জেনেরিক পরীক্ষাগুলি লিখুন যা ডেটা ফাইলগুলিকে ইনপুট হিসাবে নিতে পারে। ডেটা ফাইলগুলিতে সাধারণত ইনপুট এবং প্রত্যাশিত ফলাফল উভয়ই থাকা উচিত। Xunit পরীক্ষা ফ্রেমওয়ার্কের সাহায্যে আপনি ফ্লাইতে পরীক্ষার কেস তৈরি করতে পারেন - প্রতিটি ডেটা নমুনার জন্য একটি।
froderik

2
@ গ্যাবলিন "যদি এটি ব্যর্থ হয় তবে ঠিক কী ভুল হয়েছে তা আপনার জানা উচিত" পরামর্শ দেয় যে একাধিক সম্ভাব্য ব্যর্থতার কারণগুলির সাথে পরীক্ষাগুলি ঠিক আছে, যতক্ষণ আপনি পরীক্ষার ফলাফল থেকে কারণ নির্ধারণ করতে পারবেন ...?
ব্যবহারকারী 253751

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

উত্তর:


52

ইউনিট পরীক্ষার বিষয়ে আর্ট অফ ইউনিট টেস্টিংয়ের নিম্নলিখিত কথা রয়েছে:

একটি ইউনিট পরীক্ষার নিম্নলিখিত বৈশিষ্ট্য থাকতে হবে:

  • এটি স্বয়ংক্রিয় এবং পুনরাবৃত্তিযোগ্য হওয়া উচিত।
  • এটি কার্যকর করা সহজ হওয়া উচিত।
  • একবার এটি লেখা হয়ে গেলে এটি ভবিষ্যতে ব্যবহারের জন্য থাকা উচিত।
  • যে কেউ এটি চালাতে সক্ষম হওয়া উচিত।
  • এটি একটি বোতামের ধাক্কায় চলতে হবে।
  • এটি দ্রুত চালানো উচিত।

এবং তারপরে এটি যুক্ত করে এটি সম্পূর্ণ স্বয়ংক্রিয়, বিশ্বাসযোগ্য, পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হওয়া উচিত।

আপনি যদি ইতিমধ্যে না থাকেন তবে আমি দৃ strongly়তার সাথে এই বইটি পড়ার সুপারিশ করব।

আমার মতে, এগুলি খুব গুরুত্বপূর্ণ, তবে শেষ তিনটি (বিশ্বাসযোগ্য, পাঠযোগ্য এবং রক্ষণাবেক্ষণযোগ্য) বিশেষত, যদি আপনার পরীক্ষাগুলিতে এই তিনটি বৈশিষ্ট্য থাকে তবে আপনার কোডগুলি সাধারণত তাদেরও থাকে।


1
ইউনিট পরীক্ষায় লক্ষ্যযুক্ত একটি বিস্তৃত তালিকার জন্য +1 (একীকরণ বা কার্যকরী পরীক্ষার নয়)
গ্যারি রোয়ে

1
লিঙ্কের জন্য +1। আকর্ষণীয় উপাদান সেখানে পাওয়া যাবে।
জোরিস

1
"দ্রুত চালান" এর বড় প্রভাব রয়েছে। ডাটাবেস, ফাইল সিস্টেম, ওয়েব সার্ভিস ইত্যাদির মতো বাহ্যিক সংস্থান থেকে দূরে ইউনিট পরীক্ষাগুলি বিচ্ছিন্নভাবে চালানো উচিত তার কারণ এটি ফলস্বরূপ মক / স্টাবের দিকে নিয়ে যায়।
মাইকেল ইস্টার 18

1
যখন এটি বলে It should run at the push of a button, এর মানে কি এই যে কোনও ইউনিট পরীক্ষার জন্য হয় ধারক (অ্যাপ সার্ভার) চলমান (ইউনিটটি পরীক্ষা করার জন্য) বা কোনও সংস্থান সংযোগের (যেমন ডিবি, বাহ্যিক ওয়েব পরিষেবাদি ইত্যাদি) প্রয়োজন হবে না? কোন আবেদনের কোন অংশের ইউনিট পরীক্ষা করা উচিত এবং কোনটি করা উচিত নয় তা নিয়ে আমি ঠিক বিভ্রান্ত হয়ে পড়েছি। আমাকে বলা হয়েছে যে ইউনিট পরীক্ষাগুলিতে ডিবি সংযোগ এবং চলমান পাত্রে এবং তার পরিবর্তে সম্ভবত মকআপ ব্যবহার করা উচিত নয়।
উভচর

42

একটি ভাল ইউনিট পরীক্ষা এটি পরীক্ষা করে ফাংশনটি আয়না করে না।

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

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


21
+1 আপনি এই ক্ষেত্রে যা করবেন তা হ'ল হার্ডকোডযুক্ত যুক্তি দিয়ে পরীক্ষা করা এবং আপনার পরিচিত উত্তরের বিরুদ্ধে পরীক্ষা করা।
মাইকেল কে

আমি আগে এই গন্ধ দেখেছি।
পল কসাই

গড় ফিরতে ফাংশনটির জন্য আপনি কি ভাল ইউনিট পরীক্ষার উদাহরণ দিতে পারেন?
VLAS

2
@ ভিএলএএস পরীক্ষার পূর্বনির্ধারিত মানগুলি, যেমন গড় (1, 3) == 2 নিশ্চিত করুন, আরও গুরুত্বপূর্ণভাবে প্রান্তের কেসগুলি যেমন, INT_MAX, জিরো, নেতিবাচক মান ইত্যাদি পরীক্ষা করে দেখুন যদি কোনও ফাংশনে কোনও বাগ খুঁজে পাওয়া যায় এবং ঠিক করা থাকে তবে অন্যটি যুক্ত করুন এই বাগটি পুনরায় আর প্রবর্তিত হবে না তা নিশ্চিত করার জন্য পরীক্ষা করুন।
মোজুবা

মজাদার. আপনি কীভাবে এই পরীক্ষার ইনপুটগুলির সঠিক উত্তর পাওয়ার প্রস্তাব দিচ্ছেন এবং পরীক্ষার সাথে সংযুক্ত কোডের মতো একই ভুলটি করবেন না?
টিমো

10

ভাল ইউনিট পরীক্ষাগুলি মূলত চলমানযোগ্য ফর্মের স্পেসিফিকেশন:

  1. কোডগুলি ব্যবহারের সাথে সম্পর্কিত আচরণের বর্ণনা দিন
  2. প্রযুক্তিগত কোণার কেসগুলি কভার করুন (নাল পাস হয়ে গেলে কী ঘটে) - যদি কোনও কর্নার কেসের জন্য একটি পরীক্ষা উপস্থিত না হয় তবে আচরণটি সংজ্ঞায়িত।
  3. পরীক্ষিত কোডটি স্পেসিফিকেশন থেকে দূরে সরে গেলে ব্রেক করুন break

আপনি প্রাথমিকভাবে প্রথমে এপিআই লিখতে এবং তারপরে প্রকৃত বাস্তবায়ন হিসাবে টেস্ট-চালিত-বিকাশ লাইব্রেরির রুটিনের জন্য খুব উপযুক্ত বলে মনে করেছি।


7

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

আপনার ক্ষেত্রে - আমি অনুমান করছি - 'বৈশিষ্ট্য' হ'ল ফিট ফাংশনটি একটি নির্দিষ্ট ত্রুটি সহনশীলতার মধ্যে ইনপুট ডেটা মডেল করে। যেহেতু আপনি আসলে কী করছেন আমার কোনও ধারণা নেই, তাই আমি কিছু তৈরি করছি; আশা করি এটি বেদনাযুক্ত।

উদাহরণ গল্প:

একজন [এক্স-উইং পাইলট] হিসাবে আমি [0.0001% এর বেশি ফিট ত্রুটি] চাই না যাতে [টার্গেটিং কম্পিউটারটি একটি বাক্স উপত্যকায় দিয়ে পূর্ণ গতিতে চলার সময় ডেথ স্টারের এক্সস্ট এক্সপোর্ট বন্দরে আঘাত করতে পারে]

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

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

//Scenario 1 - can you hit the side of a barn?
Given:
    all 7 channels with no dropouts for the full half-second window,
When:
    speed is zero
    and target velocity is zero
    and all other values are constant,
Then:
    the error coefficient must be zero

//Scenario 2 - can you hit a turtle?
Given:
    all 7 channels with no dropouts for the full half-second window,
When:
    speed is zero
    and target velocity is less than c
    and all other values are constant,
Then:
    the error coefficient must be less than 0.0000000001/ns

...

//Scenario 42 - death blossom
Given:
    all 7 channels with 30% dropout and a 0.05 second sampling window
When:
    speed is zero
    and position is within enemy cluster
    and all targets are stationary
Then:
    the error coefficient must be less than 0.000001/ns for each target

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


5

কর্নারের কেসগুলির জন্য পরীক্ষাগুলি তৈরি করুন, যেমন সর্বনিম্ন সংখ্যার ইনপুট (সম্ভাব্য 1 বা 0) এবং কয়েকটি স্ট্যান্ডার্ড কেস সমন্বিত একটি টেস্ট সেট like এই ইউনিট পরীক্ষাগুলি সম্পূর্ণরূপে গ্রহণযোগ্যতার পরীক্ষার জন্য প্রতিস্থাপন নয়, সেগুলিও হওয়া উচিত নয়।


5

আমি প্রচুর ক্ষেত্রে দেখেছি যেখানে লোকেরা খুব কমই প্রবেশ করা কোডের জন্য প্রচুর পরিশ্রম লেখার পরীক্ষায় বিনিয়োগ করে এবং প্রায়শই প্রবেশ করা কোডের জন্য পরীক্ষা না লিখে থাকে।

কোনও পরীক্ষা লিখতে বসার আগে আপনি পর্যাপ্ত কভারেজের পরিকল্পনা করেছেন কিনা তা নিশ্চিত করার জন্য আপনার কোনও প্রকারের কল গ্রাফের দিকে নজর দেওয়া উচিত।

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


কিন্তু পরবর্তী তারিখে কী যখন লাইব্রেরিতে একটি বাগ ফিক্স সহ একটি নতুন সংস্করণ থাকে?

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

যদি আপনি আপনার লাইব্রেরি উপর নির্ভর করে, অন্তত আপনি কি করতে পারেন পরীক্ষা দেখায় যে আপনি কি আশা বলেন লিখতে হয় গ্রন্থাগার আসলে কি ,

... এবং যদি এটি পরিবর্তিত হয়, যা গ্রন্থাগার গ্রাস করে সেগুলিতে পরীক্ষা করে ... tl; dr; আমার তৃতীয় পক্ষের কোডের অভ্যন্তরীন পরীক্ষা করার দরকার নেই। উত্তর স্পষ্টতার জন্য আপডেট হয়েছে, যদিও।
টিম পোস্ট

4

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


3

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

সাফল্যের জন্য আমার সাধারণত এক বা কয়েকটি পরীক্ষা থাকে এবং তারপরে পাবলিক পদ্ধতিতে ব্যর্থতার জন্য পরীক্ষাগুলির হাতছানি।

আমি মক-আপগুলি প্রচুর ব্যবহার করি। একটি ভাল মক-ফ্রেমওয়ার্ক সম্ভবত পাওয়ারমকের মতো বেশ সহায়ক। যদিও আমি এখনও কোনও ব্যবহার করছি না।

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

আপনার পরীক্ষার কোডটিও পরিষ্কার রাখুন।

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


2

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

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