প্রয়োজন বা পদ্ধতি দ্বারা বিভক্ত ইউনিট পরীক্ষা


17

আমার একটি পদ্ধতি রয়েছে যার জন্য আমি ইউনিট পরীক্ষা লিখতে চাই। আমি এটিকে মোটামুটি জেনেরিক রাখছি কারণ আমি পদ্ধতির বাস্তবায়ন সম্পর্কে আলোচনা করতে চাই না, কেবল এটির পরীক্ষা করে। পদ্ধতিটি হ'ল:

public void HandleItem(item a)
{         
     CreateNewItem();
     UpdateStatusOnPreviousItem();
     SetNextRunDate();
}

সুতরাং এই শ্রেণীর একটি পাবলিক পদ্ধতি রয়েছে যা তারপরে যুক্তি সম্পাদনের জন্য কিছু ব্যক্তিগত পদ্ধতি কল করে।

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

public void GivenItem_WhenRun_Thenxxxxx
{
     HandleItem(item);
     // Assert item has been created
     // Assert status has been set on the previous item
     // Assert run date has been set
}

তবে আমি ভেবেছিলাম আমি এটি তিনটি পৃথক পরীক্ষা হিসাবে লিখতে পারি:

public void GivenItem_WhenRun_ThenItemIsCreated()
{
    HandleItem(item);
}

public void GivenItem_WhenRun_ThenStatusIsUpdatedOnPreviousItem()
{
   HandleItem(item);
}

public void GivenItem_WhenRun_ThenRunDateIsSet()
{
     HandleItem(item);
}

সুতরাং এটি আমার কাছে এটি প্রয়োজনীয় বলে মনে হচ্ছে এটি প্রয়োজনীয়ভাবে তালিকাবদ্ধ করে, তবে তিনটিই সম্পর্কিত হয় এবং পরীক্ষিত পদ্ধতিতে ঠিক একই কাজ সম্পাদনের প্রয়োজন হয়, তাই একই কোডটি 3 বার চালাচ্ছি।

এটি গ্রহণ করার জন্য কি কোনও প্রস্তাবিত পদ্ধতির রয়েছে?

ধন্যবাদ

উত্তর:


30

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

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

  • তবে, যদি প্রথম পরীক্ষার ব্যর্থতা সবসময় বোঝায় অন্য দুটি পরীক্ষাগুলিও ব্যর্থ হয় তবে সম্ভবত প্রথম পদ্ধতির ব্যবহার করা ভাল (যেহেতু যদি আপনি ইতিমধ্যে আগেই জানেন তবে পরীক্ষা চালানোর পক্ষে এটি তেমন অর্থবহ নয়) Fail)।


2
+1, ভাল পয়েন্ট। এটি আমার কাছে ঘটেছিল না যে গড়ার সময়গুলিও একটি বাধা হতে পারে।
কিলিয়ান ফট

1
@ কিলিয়ানফথ: আপনি প্রায়শই সি ++ এ কাজ করছেন না :(
ম্যাথিউ এম।

1
@ ম্যাথিউইউএম .: ন্যায়বিচারের জন্য, প্রশ্নটিকে "সি #" ট্যাগ করা হয়েছে
ডক ব্রাউন

10

সংক্ষিপ্ত উত্তর: এটা অনেক বেশি গুরুত্বপূর্ণ যে আপনার পরীক্ষা চেয়ে সকল ক্রিয়াকলাপ আবরণ কিভাবে তারা এটা করতে।

দীর্ঘতর উত্তর: আপনি এখনও যদি এই বৃহত পরিমাণে সমতুল্য সমাধানগুলির মধ্যে চয়ন করতে চান তবে আপনি সর্বোত্তম কিসের জন্য সহায়ক মানদণ্ড ব্যবহার করতে পারেন। এই ক্ষেত্রে,

  • পঠনযোগ্যতা: যদি পদ্ধতিটি এমন অনেকগুলি কাজ করে যা ঘনিষ্ঠভাবে সম্পর্কিত না হয় তবে একটি সম্মিলিত পরীক্ষা বুঝতে অসুবিধা হতে পারে। তবে, পদ্ধতিটি নিজেও বুঝতে অসুবিধা হতে পারে, সুতরাং আপনার পরীক্ষার চেয়ে পদ্ধতিটি রিফ্যাক্টর করা উচিত!)
  • দক্ষতা: যদি পদ্ধতিটি কার্যকর করতে দীর্ঘ সময় লাগে তবে সময় বাঁচানোর জন্য তিনটি চেক একত্রিত করার এটি দুর্বল কারণ হতে পারে
  • দক্ষতা 2: যদি আপনার কাঠামোর সেটআপ কোডটি চালাতে দীর্ঘ সময় লাগে তবে এটি একাধিক পরীক্ষার পদ্ধতি এড়ানোর দুর্বল কারণও হতে পারে। (তবে, যদি এটি সত্যিই সমস্যা হয় তবে সম্ভবত আপনার পরীক্ষার সেট আপ ঠিক করতে হবে বা পরিবর্তন করা উচিত - আপনি যদি বিদ্যুৎ-চালনা চালাতে না পারেন তবে রিগ্রেশন টেস্টগুলি তাদের মান অনেকাংশে হারাবে))

3

একাধিক সংস্থান সহ একটি পদ্ধতি কল ব্যবহার করুন। কারণটা এখানে:

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

প্রশ্ন: যদি একটি ক্রিয়েটনিউইমটি ব্যর্থ হয় তবে অন্য দুটি পদ্ধতি সফল হয়, এর অর্থ হ্যান্ডলআইটেমটি সফলভাবে শেষ হয়েছে? আমি অনুমান করছি না।

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

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

আপনি অন্য 3 টি পদ্ধতি জনসাধারণের জন্য এবং সেগুলি স্বাধীনভাবে পরীক্ষার বিষয়ে বিবেচনা করতে চাইতে পারেন। এমনকি এগুলি অন্য শ্রেণিতেও তোলা ext


0

২ য় পন্থা ব্যবহার করুন। আপনার 1 ম পদ্ধতির সাথে, যদি পরীক্ষা ব্যর্থ হয় তবে আপনি এখনই কেন তা তাড়াতাড়ি জানতে পারবেন না, কারণ এটি ব্যর্থ হওয়া 3 টি ফাংশনের মধ্যে একটি হতে পারে। দ্বিতীয় পদ্ধতির মাধ্যমে আপনি এখনই জানবেন যে সমস্যাটি কোথায় ঘটেছে। আপনি নিজের টেস্ট সেটআপ ফাংশনের ভিতরে নকল কোড রাখতে পারেন।


-1

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


-2

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

এর অর্থ এই নয় যে আপনার একক পরীক্ষায় আরও কোড থাকবে, তবে আপনার যদি এমন অনেক শর্ত-শর্ত থাকে যা সমস্যা, তবে আপনি সম্ভবত নিজের পরীক্ষার পদ্ধতিগুলি যে HandleItemকোনও উপায়ে অভ্যন্তর পৃথক পদ্ধতিগুলি পরীক্ষা করতে চান ref

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