এক্ষেত্রে পরীক্ষার প্রতি বোকা ধারাবাহিকতার জন্য একটি দৃ one়তার সাথে মেনে চলা কি?


10

আমার একটি ক্লাস রয়েছে যা আমি পরীক্ষা করছি। শ্রেণীর একটি কার্য রয়েছে:apply(List<IRule> rules, List<ITarget> targets);

একটি পরীক্ষায় আমি নিশ্চিত করতে চাই যে প্রতিটি লক্ষ্য একটি নিয়মে চলে গেছে, একটি লা:

rule1.AssertWasCalled(fnord => fnord.Test(target1));
rule1.AssertWasCalled(fnord => fnord.Test(target2));
rule1.AssertWasCalled(fnord => fnord.Test(target3));

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


আমি দেখতে পাচ্ছি!
রস প্যাটারসন

উত্তর:


15

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

তিনবার এবং তিনটি পৃথক পদ্ধতিতে ডেটা সেট আপ করা ব্যর্থতাযুক্ত এবং কয়েকটি দাবী করার বিকল্পের চেয়ে কম পাঠযোগ্য।

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


3
প্রকৃতপক্ষে: ইউনিট টেস্টে নিয়মটি আরও একটি যৌক্তিক দাবি। আপনি তাদেরকে একটি উচ্চ স্তরের মধ্যে গ্রুপবদ্ধ করতে পারেন যে আপনি বিভিন্ন পরীক্ষায় পুনরায় ব্যবহার করতে পারেন।
লরেন্ট বোর্গাল্ট-রায়

5

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

আপনার ক্ষেত্রে, আমি মনে করি সম্ভবত তিনবার চাপ দেওয়া ঠিক আছে। আপনি যদি আপনার কোডটি আরও পঠনযোগ্য করে তুলতে চান তবে আপনি এই তিনটি জোর নামের একটি পদ্ধতিতে বের করতে পারেন assertWasCalledOnTargets(...)


3

আপনার নির্দিষ্ট উদাহরণের জন্য, আপনি যদি এমন কিছু করেন তবে আপনি "এক" দৃsert় বিবৃতি দিয়ে পালিয়ে যেতে পারেন:

foreach target in targets
{
     rule1.AssertWasCalled(fnord => fnord.Test(target))
}

এক পরীক্ষায় একাধিক দাবি থাকার বিষয়ে দোষী বোধ না করার জন্য আমি এটিই করি।


আমি এটি আগেও করেছি। কোনও খারাপ পথ নয়। এটি পড়তে সহজ, এবং এটি কী করছে তার প্রকৃতি আপনি বুঝতে পারবেন।
কোকোওয়্যার

1

আমিও এইটার সাথে লড়াই করেছি।

প্রকৃতিবাদী (আমার মধ্যে) পরীক্ষা প্রতি এক জাহির উপর জোরাজুরি তাই আমি * জানতে পারবেন ঠিক * যেখানে জিনিষ আপ blew।

এবং তারপরে আমি নিজেকে অনেকগুলি একইরকম, অনর্থক পরীক্ষার সেটআপ কোডটি কাটা / আটকানো দেখতে পাই। এর তৃতীয় বা চতুর্থ স্তরটির পরে, আপনি বলতে শুরু করবেন "ওয়ে! যথেষ্ট!"

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


1
আপনি পরীক্ষা করা উচিত Assume। আমি আজ এটি সম্পর্কে মাত্র শিখেছি।
ওয়েইন ওয়ার্নার

1

যদি সেটআপ কোডের জন্য সেটআপ কোডটি সেটআপ কোডের target1থেকে আলাদা হয় তবে target2এই ধরণের কর্নার-কাটিং শেষ পর্যন্ত অত্যধিক দীর্ঘ পরীক্ষার সূচনা কোডকে নেতৃত্ব দেয়। পরিবর্তে এটি হয় একটি গোলমাল বা রিফ্যাক্টর এবং পুনরায় ব্যবহৃত হচ্ছে ends যদি আপনার পরীক্ষাগুলি সেগুলি রিফ্যাক্টরিংয়ের ন্যায়সঙ্গত করার পক্ষে যথেষ্ট জটিল হয় তবে আপনার পরীক্ষা সম্ভবত একাধিক জিনিসের পরীক্ষা করছে।

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

যদি target1এবং target2একই ইন্টারফেসের বিভিন্ন বাস্তবায়ন হয়, আপনি পরিবর্তে ইন্টারফেসে একটি ইউনিট পরীক্ষা যুক্ত করা উচিত (এবং আপনার পরীক্ষার কাঠামোটিকে সেই ইন্টারফেসের প্রতিটি প্রয়োগের জন্য একটি পরীক্ষা উত্পন্ন করার অনুমতি দেওয়া হবে)।

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