ইউনিট পরীক্ষায় সাম্যের জন্য আমি কীভাবে দ্বিগুণ মানকে সঠিকভাবে তুলনা করতে পারি?


20

আমি সম্প্রতি একটি টাইম সিরিজ মডিউল ডিজাইন করেছি যেখানে আমার সময় সিরিজটি মূলত একটি SortedDictionnary<DateTime, double>

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

একটি সাধারণ অপারেশন হল সময় সিরিজের পয়েন্টগুলির মধ্যে পারফরম্যান্স গণনা করা।

সুতরাং আমি যা করি তা হল time 1.0, 2.0, 4.0 with (কিছু তারিখে) দিয়ে একটি সময় সিরিজ তৈরি করা এবং আমি আশা করি ফলাফলটি {100%, 100%} হবে}

জিনিসটি হ'ল, যদি আমি ম্যানুয়ালি {1.0, 1.0 values ​​মানগুলি সহ একটি টাইম সিরিজ তৈরি করি এবং আমি সমতার জন্য পরীক্ষা করি (প্রতিটি পয়েন্টের সাথে তুলনা করে), পরীক্ষাটি পাস হবে না, কারণ সত্যিকারের বাইনারি উপস্থাপনার সাথে কাজ করার সময় সর্বদা ভুল হবে না নম্বর।

সুতরাং, আমি নিম্নলিখিত ফাংশন তৈরি করার সিদ্ধান্ত নিয়েছে:

private static bool isCloseEnough(double expected, double actual, double tolerance=0.002)
{
    return squaredDifference(expected, actual) < Math.Pow(tolerance,2);
}

এই জাতীয় মামলা মোকাবেলার আর কি সাধারণ উপায় আছে?

উত্তর:


10

এই সমস্যাটি মোকাবেলার জন্য আমি আরও দুটি উপায় সম্পর্কে ভাবতে পারি:

আপনি ব্যবহার করতে পারেন Is.InRange:

Assert.That(result, Is.InRange(expected-tolerance, expected+tolerance));

আপনি ব্যবহার করতে পারেন Math.Round:

Assert.That(Math.Round(result, sigDigits), Is.EqualTo(expected));

আমি মনে করি যে উত্সর্গীকৃত ফাংশনটির চেয়ে উভয় উপায়ই বেশি উদ্বেগজনক, কারণ পাঠক আপনার সংখ্যার সাথে প্রত্যাশিত মানের তুলনা হওয়ার আগে তা ঠিক দেখতে পাচ্ছেন।


2
কেবলমাত্র একটি নোট যে এই উত্তরটি NUnit সুনির্দিষ্ট এবং "কনস্ট্রাইং-ভিত্তিক" দৃ show় মডেলটি প্রদর্শন করে c ক্লাসিক দৃ model় প্রতিবেদনের মডেলটি দেখতে পাবেন: Assert.AreEqual (প্রত্যাশিত, প্রকৃত, সহনশীলতা);
রিচার্ডএম

1
@ রিচার্ডএম: উত্তর হিসাবে পোস্ট করুন এবং আমি এটি গ্রহণ করব তা নির্বাচন করব।
এসআরকেএক্স

@ ডাসব্লিংকনলাইটের উত্তরটি সঠিক, কেবল কিছু বিশদ যুক্ত করুন (যেহেতু এটি পরিষ্কার হতে পারে না - ক্লাসিক দৃser় প্রতিবেদনের মডেলটিও নুনিট)। অন্যান্য পরীক্ষার ফ্রেমওয়ার্কগুলি (এমএসটিস্ট নয়) সম্ভবত ভাসমান পয়েন্টের মানগুলি মোকাবেলা করার জন্য তাদের নিজস্ব দৃsert় মডেল রয়েছে।
রিচার্ডএম

1
Assert.That(result, Is.InRange(expected-tolerance, expected+tolerance));ব্যর্থ হবে যদি tolerance/abs(expected) < 1E-16
কোয়ান্ট_দেব

@ কোয়ান্ট_দেব আপনি একেবারে ঠিক বলেছেন। যেহেতু ওপি শতাংশের হিসাবে রিটার্ন গণনা করার বিষয়ে কথা বলে, আমি ধরে নিয়েছিলাম যে abs(expected)এটি একক থেকে দ্বিগুণ হবে। আমি 1E-9 এর আশেপাশে সহনশীলতাও ধরে নিয়েছি। এই অনুমানের অধীনে এই স্বীকার করা সরল পদ্ধতিটি আপনাকে যুক্তিসঙ্গতভাবে ভালভাবে পরিবেশন করতে পারে (আমি Is.InRangeআমার পরীক্ষাগুলিতে ব্যবহার করি)।
dasblinkenlight


3

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

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