আইএফ স্টেটমেন্টে ইউনিট একাধিক শর্ত পরীক্ষা করে


26

আমার কাছে কোডের একটি অংশ রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

function bool PassesBusinessRules()
{
    bool meetsBusinessRules = false;

    if (PassesBusinessRule1 
         && PassesBusinessRule2
         && PassesBusinessRule3)
    {
         meetsBusinessRules= true;
    }

    return meetsBusinessRules;
}

আমি বিশ্বাস করি যে এই নির্দিষ্ট ফাংশনের জন্য চারটি ইউনিট পরীক্ষা করা উচিত। তিনটি যদি স্টেটমেন্টের প্রতিটি শর্ত পরীক্ষা করে এটি নিশ্চিত করে যে এটি মিথ্যা ফিরে এসেছে। এবং আরও একটি পরীক্ষা যা নিশ্চিত করে যে ফাংশনটি সত্য ফিরে আসে।

প্রশ্ন: এর পরিবর্তে আসলে দশটি ইউনিট পরীক্ষা করা উচিত? নয়টি যা প্রতিটি সম্ভাব্য ব্যর্থতার পাথ চেক করে। অর্থাৎ,

  • মিথ্যা মিথ্যা মিথ্যা
  • মিথ্যা মিথ্যা সত্য
  • মিথ্যা সত্য মিথ্যা

এবং প্রতিটি সম্ভাব্য সংমিশ্রণের জন্য তাই।

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


সংকলকটি && অপারেটরের জন্য লোভী মূল্যায়ন ব্যবহার করে?
suszterpatt

12
আপনি যদি 10 ইউনিট পরীক্ষা লিখে থাকেন তবে আপনি আপনার পদ্ধতিগুলি নয় বরং && অপারেটর পরীক্ষা করছেন।
Mert Akcakaya

2
আপনি যদি সমস্ত সম্ভাব্য সংমিশ্রণ পরীক্ষা করেন তবে কেবল আটটি পরীক্ষা হবে না? তিনটি বুলিয়ান প্যারামিটারগুলি চালু বা বন্ধ হয়।
ক্রিস হার্পার

3
@ মুর্ট: কেবলমাত্র যদি আপনি গ্যারান্টি দিতে পারেন যে &&& সর্বদা থাকবে।
মিসকো

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

উত্তর:


29

সাধারণত, এই ধরণের কভারেজের নাম রয়েছে।

প্রথমত, প্রিডিকেট কভারেজ রয়েছে : আপনি এমন একটি টেস্ট কেস রাখতে চান যা যদি বিবৃতিটিকে সত্য করে তোলে এবং একটি এটি মিথ্যা করে তোলে। এই কভারেজটি পূরণ করা সম্ভবত কোনও ভাল টেস্ট স্যুটের প্রাথমিক প্রয়োজন।

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

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

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

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


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

সাহসী পদগুলির মধ্যে আপনি কতটা নিশ্চিত? আপনার উত্তরটি "সম্মিলিত শর্ত কভারেজ" এর একমাত্র উপস্থিতি বলে মনে হচ্ছে এবং কিছু সংস্থান বলে যে "প্রাকটিকেট কভারেজ" এবং "শর্তাধীন কভারেজ" একই জিনিস।
স্টিজন

8

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

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

আপনার ব্যক্তিগতভাবে 4 টি টেস্টের রূপরেখাটি আমি ব্যক্তিগতভাবে খুশি করব, তা হ'ল:

  • সত্য মিথ্যা মিথ্যা
  • মিথ্যা সত্য মিথ্যা
  • মিথ্যা মিথ্যা সত্য
  • সত্য সত্য সত্য

আরও একটি হতে পারে:

  • সত্য সত্য মিথ্যা

এর রিটার্ন মান পাওয়ার একমাত্র উপায় trueহ'ল সমস্ত 3 ব্যবসায়িক বিধি পূরণ করা। তবে শেষ পর্যন্ত, যদি আপনার সতীর্থরা মিশ্রিত পথগুলি coveredেকে রাখার জন্য জোর দেয়, তবে যুক্তিটি আরও দীর্ঘায়িত করার চেয়ে এই অতিরিক্ত পরীক্ষা যুক্ত করা সস্তা হতে পারে :-)


3

আপনি যদি নিরাপদ থাকতে চান তবে তিনটি পরিবর্তনশীল সত্য টেবিল ( http://teach.valdosta.edu/plmoch/MATH4161/Spring%202004/and_or_if_files/image006.gif ) দ্বারা প্রতিনিধিত্ব করা শর্তাদি ব্যবহার করে আপনার আটটি ইউনিট পরীক্ষার প্রয়োজন হবে need

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


2
ইউনিট টেস্টিং হয় সাদা বক্স টেস্টিং।
প্যাটার তারেক

শৃঙ্খলা রক্ষার বিষয়টি বিবেচনা করা উচিত নয়, && সংবেদনশীল, বা কমপক্ষে হওয়া উচিত
জাকারি কে

2

হ্যাঁ, একটি আদর্শ বিশ্বে পুরো সমন্বয় হওয়া উচিত।

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


1
ইউনিট টেস্টিং হয় সাদা বক্স টেস্টিং। এবং আমরা একটি আদর্শ বিশ্বে বাস করি না।
প্যাটার তারেক

@ PéterTörök - আমরা নিশ্চিত হতে একটি আদর্শ বিশ্বের মধ্যে বসবাস করেন না, কিন্তু stackexchange অন্যান্য বিন্দু আপনার সাথে একমত নন। বিশেষত টিডিডির জন্য, পরীক্ষাগুলি স্পেসিফিকেশনগুলিতে লেখা হয়, বাস্তবায়ন নয়। সমস্ত ইনপুট (সদস্য ভেরিয়েবল সহ) এবং সমস্ত আউটপুট (পার্শ্ব প্রতিক্রিয়া সহ) অন্তর্ভুক্ত করার জন্য আমি ব্যক্তিগতভাবে 'স্পেসিফিকেশন' নিই।
টেলাস্টিন

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

1

রাষ্ট্র খারাপ। নিম্নলিখিত ফাংশনটির জন্য ইউনিট পরীক্ষার প্রয়োজন নেই কারণ এর কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং এটি কী করে এবং কী করে না তা এটি ভালভাবেই বোঝা যায়। কেন এটি পরীক্ষা? আপনি কি নিজের মস্তিস্ককে বিশ্বাস করেন না ??? স্ট্যাটিক ফাংশন দুর্দান্ত!

static function bool Foo(bool a, bool b, bool c)
{
    return a && b && c;
}

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

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

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

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

1

আমি জানি এই প্রশ্নটি বেশ পুরানো। তবে আমি সমস্যার আরেকটি দৃষ্টিভঙ্গি দিতে চাই।

প্রথমত, আপনার ইউনিট পরীক্ষার দুটি উদ্দেশ্য থাকতে হবে:

  1. আপনার এবং আপনার দলের সঙ্গীদের জন্য ডকুমেন্টেশন তৈরি করুন, যাতে নির্দিষ্ট সময়ের পরে আপনি ইউনিট পরীক্ষাটি পড়তে পারেন what's the class' intentionএবং নিশ্চিত হন যে আপনি বুঝতে পেরেছেন এবংhow the class is doing its work
  2. বিকাশকালে, ইউনিট পরীক্ষাটি নিশ্চিত করে যে আমরা যে কোডটি লিখছি তা কাজটি করছে যা এটি আমাদের মনে উদ্দেশ্য ছিল।

সুতরাং, সমস্যার পুনঃনির্ধারণের জন্য, আমরা একটি পরীক্ষা করতে চাই complex if statement, প্রদত্ত উদাহরণের জন্য, 2 ^ 3 সম্ভাবনা রয়েছে, এটি একটি গুরুত্বপূর্ণ পরিমাণ পরীক্ষা যা আমরা লিখতে পারি।

  • আপনি এই সত্যটির সাথে খাপ খাইয়ে নিতে পারেন এবং 8 টি পরীক্ষা লিখে বা প্যারামাইট্রাইজড পরীক্ষাগুলি ব্যবহার করতে পারেন
  • আপনি অন্যান্য উত্তরগুলিও অনুসরণ করতে পারেন এবং মনে রাখতে পারেন যে পরীক্ষাগুলি উদ্দেশ্য সহ স্পষ্ট হওয়া উচিত, এইভাবে আমরা খুব বেশি বিশদ নিয়ে গণ্ডগোল করব না যা অদূর ভবিষ্যতে বুঝতে আরও কঠিন হতে পারে what is doing the code

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

জটিলগুলির জন্য যদি বিবৃতিগুলি উদাহরণস্বরূপ, আপনি চেইন দায়বদ্ধতার প্যাটার্নের বিষয়ে চিন্তা করতে পারেন , প্রতিটি হ্যান্ডলারকে এইভাবে প্রয়োগ করে:

If some simple business rule apply, derive to the next handler

জটিল নিয়মের পরিবর্তে বিভিন্ন কিছু সাধারণ নিয়ম পরীক্ষা করা কত সহজ হবে?

আশা করি এটা সাহায্য করবে,


0

এটি সেই ক্ষেত্রে একটির মধ্যে যেখানে কুইকচেক ( http://en.wikedia.org/wiki/QuickCheck ) এর মতো কিছু আপনার বন্ধু হবে। হাতে সমস্ত এন কেস লেখার পরিবর্তে কম্পিউটারে সম্ভাব্য পরীক্ষার সমস্তগুলি (বা কমপক্ষে একটি বৃহত সংখ্যক) উত্পন্ন করে তা প্রমাণ করে যে সবগুলি একটি বুদ্ধিমান ফলাফল দেয় return

আমরা এখানে একটি জীবিকার জন্য কম্পিউটার প্রোগ্রাম করি, কেন আপনার পরীক্ষার কেসগুলি তৈরি করার জন্য কম্পিউটার প্রোগ্রাম করবেন না?


0

আপনি শর্তগুলি গার্ডের শর্তগুলিতে রিফ্যাক্টর করতে পারেন:

if (! PassesBusinessRule1) {
    return false;
}

if (! PassesBusinessRule2) {
    return false;
}

if (! PassesBusinessRule3) {
    return false;
}

আমি মনে করি না যে এটি মামলার সংখ্যা হ্রাস করে, তবে আমার অভিজ্ঞতা হ'ল এগুলি ছিন্ন করা আরও সহজ।

(দ্রষ্টব্য যে আমি একটি বড় "প্রস্থানের প্রস্থান" ভক্ত, তবে আমি গার্ড শর্তগুলির জন্য ব্যতিক্রম করি But তবে কোডটি গঠনের অন্যান্য উপায় রয়েছে যাতে আপনার আলাদা রিটার্ন না হয়))

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