আমার বর্তমান প্রকল্পটি, সংক্ষেপে, "সীমাবদ্ধ-এলোমেলো ঘটনা" তৈরিতে জড়িত। আমি মূলত পরিদর্শনগুলির একটি সময়সূচি তৈরি করছি। এর মধ্যে কয়েকটি কঠোর সময়সূচী বাধার উপর ভিত্তি করে; আপনি শুক্রবার সকাল দশটায় সপ্তাহে একবার পরিদর্শন করেন। অন্যান্য পরিদর্শনগুলি "এলোমেলো"; এখানে "বেসরকারী কনফিগার করার প্রয়োজনীয়তা যেমন" প্রতি সপ্তাহে 3 বার অবশ্যই দেখা উচিত "," 9 AM-9PM এর সময়কালের মধ্যে পরিদর্শন অবশ্যই হওয়া উচিত "এবং" একই 8-ঘন্টা সময়ের মধ্যে দুটি তদন্ত করা উচিত নয় ", তবে নির্দিষ্ট পরিদর্শনগুলির জন্য নির্ধারিত কিছু প্রতিবন্ধকতার মধ্যে, ফলাফলের তারিখ এবং সময় অনুমানযোগ্য হওয়া উচিত নয়।
ইউনিট টেস্ট এবং টিডিডি, আইএমওর এই সিস্টেমে অনেক মূল্য রয়েছে কারণ এগুলি ক্রমবর্ধমানভাবে এটি তৈরিতে ব্যবহার করা যেতে পারে যদিও এর প্রয়োজনীয়তার সম্পূর্ণ সেটটি অসম্পূর্ণ রয়েছে এবং নিশ্চিত করে নিন যে আমি যে কাজগুলি করি তার জন্য এটি "ওভার ইঞ্জিনিয়ারিং" নই আমার এখন প্রয়োজন জানি না। কঠোর শিডিয়ুলগুলি টিডিডি-তে-পিষ্টক ছিল। যাইহোক, আমি যখন সিস্টেমের এলোমেলো অংশের জন্য পরীক্ষা লিখি তখন আমি যা পরীক্ষা করে যাচ্ছি তা সংজ্ঞায়িত করা আমার পক্ষে কঠিন হয়ে পড়েছে। আমি দৃsert়ভাবে বলতে পারি যে তফসিলকারী দ্বারা উত্পাদিত সমস্ত সময় অবশ্যই সীমাবদ্ধতার মধ্যে পড়তে পারে তবে আমি এমন একটি অ্যালগরিদম বাস্তবায়ন করতে পারি যা সত্যিকারের সময়গুলিকে খুব "এলোমেলো" না করে এ জাতীয় পরীক্ষায় পাস করে। বাস্তবে যা ঘটেছিল ঠিক সেটাই; আমি একটি সমস্যা পেয়েছি যেখানে সময়গুলি ঠিক পূর্বাভাসযোগ্য না হলেও, অনুমতিযোগ্য তারিখ / সময়সীমার একটি ছোট উপসরে পড়ে যায়। অ্যালগরিদমটি এখনও আমার মনে হয়েছিল যে আমি যুক্তিসঙ্গতভাবে করতে পারি এবং আমি এমন একটি স্বয়ংক্রিয় পরীক্ষা ডিজাইন করতে পারি না যা সেই পরিস্থিতিতে ব্যর্থ হয়, তবে "আরও এলোমেলো" ফলাফল দেওয়ার পরে পাস করে। আমি বেশ কয়েকবার তাদের পুনরাবৃত্তি করার জন্য কিছু বিদ্যমান পরীক্ষাগুলি পুনর্গঠন করে সমস্যাটি সমাধান করাতে পেরেছিলাম এবং দৃশ্যমানভাবে পরীক্ষা করে দেখছি যে উত্পন্ন সময়গুলি সম্পূর্ণ অনুমোদনযোগ্য সীমার মধ্যে পড়েছিল।
টেস্ট ডিজাইনের জন্য কারও কাছে এমন কোনও টিপস রয়েছে যা অ-নিরস্তাত্মক আচরণের আশা করা উচিত?
পরামর্শের জন্য সকলকে ধন্যবাদ। মূল মতামতটি মনে হয় যে ডেট্রিনিস্টিক, পুনরাবৃত্তযোগ্য, দৃsert়স্বরে ফলাফল পাওয়ার জন্য আমার একটি ডিস্ট্রিমেন্টিক পরীক্ষা প্রয়োজন । ইন্দ্রিয় তোলে।
আমি "স্যান্ডবক্স" পরীক্ষার একটি সেট তৈরি করেছি যাতে সীমাবদ্ধ প্রক্রিয়াটির জন্য প্রার্থী অ্যালগরিদম থাকে (যে প্রক্রিয়াটি দ্বারা কোনও বাইট অ্যারে যে কোনও দীর্ঘ হতে পারে একটি মিনিট এবং সর্বোচ্চের মধ্যে দীর্ঘ হয়ে যায়)। আমি তখন কোডটি একটি ফর লুপের মাধ্যমে চালিত করি যা অ্যালগোরিদমকে বিভিন্ন পরিচিত বাইট অ্যারে দেয় (1 থেকে 10,000,000 কেবল শুরু করার জন্য মানগুলি) এবং প্রতিটি অ্যালগরিদমকে 1009 এবং 7919 এর মধ্যে একটি মানকে সীমাবদ্ধ করে রাখে (আমি নিশ্চিত করতে প্রধান সংখ্যা ব্যবহার করছি অ্যালগরিদম ইনপুট এবং আউটপুট ব্যাপ্তির মধ্যে কিছু সেরেন্ডিপিটাস জিসিএফ দ্বারা পাস করবে না)। ফলাফলের সীমাবদ্ধ মানগুলি গণনা করা হয় এবং একটি হিস্টোগ্রাম উত্পাদিত হয়। "পাস" করার জন্য, সমস্ত ইনপুটগুলি হিস্টোগ্রামের মধ্যে প্রতিবিম্বিত হতে হবে (আমরা কোনওটি "হারাতে পারি নি" তা নিশ্চিত করার জন্য স্যানিটি) এবং হিস্টোগ্রামের কোনও দুটি বালতির মধ্যে পার্থক্য 2 এর চেয়ে বেশি হতে পারে না (এটি সত্যই হওয়া উচিত <= 1 , তবে থাকুন) বিজয়ী অ্যালগরিদম, যদি কোনও হয় তবে কেটে এনে সরাসরি উত্পাদন কোডে আটকানো যায় এবং স্থায়ী পরীক্ষার জন্য রিগ্রেশনের জন্য রাখা হয়।
কোডটি এখানে:
private void TestConstraintAlgorithm(int min, int max, Func<byte[], long, long, long> constraintAlgorithm)
{
var histogram = new int[max-min+1];
for (int i = 1; i <= 10000000; i++)
{
//This is the stand-in for the PRNG; produces a known byte array
var buffer = BitConverter.GetBytes((long)i);
long result = constraintAlgorithm(buffer, min, max);
histogram[result - min]++;
}
var minCount = -1;
var maxCount = -1;
var total = 0;
for (int i = 0; i < histogram.Length; i++)
{
Console.WriteLine("{0}: {1}".FormatWith(i + min, histogram[i]));
if (minCount == -1 || minCount > histogram[i])
minCount = histogram[i];
if (maxCount == -1 || maxCount < histogram[i])
maxCount = histogram[i];
total += histogram[i];
}
Assert.AreEqual(10000000, total);
Assert.LessOrEqual(maxCount - minCount, 2);
}
[Test, Explicit("sandbox, does not test production code")]
public void TestRandomizerDistributionMSBRejection()
{
TestConstraintAlgorithm(1009, 7919, ConstrainByMSBRejection);
}
private long ConstrainByMSBRejection(byte[] buffer, long min, long max)
{
//Strip the sign bit (if any) off the most significant byte, before converting to long
buffer[buffer.Length-1] &= 0x7f;
var orig = BitConverter.ToInt64(buffer, 0);
var result = orig;
//Apply a bitmask to the value, removing the MSB on each loop until it falls in the range.
var mask = long.MaxValue;
while (result > max - min)
{
mask >>= 1;
result &= mask;
}
result += min;
return result;
}
[Test, Explicit("sandbox, does not test production code")]
public void TestRandomizerDistributionLSBRejection()
{
TestConstraintAlgorithm(1009, 7919, ConstrainByLSBRejection);
}
private long ConstrainByLSBRejection(byte[] buffer, long min, long max)
{
//Strip the sign bit (if any) off the most significant byte, before converting to long
buffer[buffer.Length - 1] &= 0x7f;
var orig = BitConverter.ToInt64(buffer, 0);
var result = orig;
//Bit-shift the number 1 place to the right until it falls within the range
while (result > max - min)
result >>= 1;
result += min;
return result;
}
[Test, Explicit("sandbox, does not test production code")]
public void TestRandomizerDistributionModulus()
{
TestConstraintAlgorithm(1009, 7919, ConstrainByModulo);
}
private long ConstrainByModulo(byte[] buffer, long min, long max)
{
buffer[buffer.Length - 1] &= 0x7f;
var result = BitConverter.ToInt64(buffer, 0);
//Modulo divide the value by the range to produce a value that falls within it.
result %= max - min + 1;
result += min;
return result;
}
... এবং ফলাফল এখানে:
খুব সহজেই ব্যাখ্যাযোগ্য কারণে এলএসবি প্রত্যাখ্যান (পরিসীমাটির মধ্যে না আসা পর্যন্ত সংখ্যাটি বিট-শিফটিং) অত্যন্ত মারাত্মক ছিল; যখন আপনি কোনও সংখ্যাটিকে সর্বাধিকের চেয়ে কম না হওয়া পর্যন্ত বিভক্ত করেন, আপনি যত তাড়াতাড়ি হবে ততই প্রস্থান করবেন এবং যে কোনও অ-তুচ্ছ পরিসরের জন্য, ফলাফলগুলি উপরের তৃতীয়টির দিকে পক্ষপাত করবে (হিস্টগ্রামের বিশদ ফলাফলে দেখা গেছে) )। ঠিক এই আচরণটি আমি শেষ তারিখগুলি থেকে দেখেছি; সমস্ত সময় দুপুরে ছিল, খুব নির্দিষ্ট দিনগুলিতে।
এমএসবি প্রত্যাখ্যান (এটি সীমাবদ্ধ না হওয়া অবধি একযোগে এক নম্বর সর্বাধিক গুরুত্বপূর্ণ বিট অপসারণ করা) ভাল তবে আবার, কারণ আপনি প্রতিটি বিট দিয়ে খুব বড় সংখ্যক কেটে ফেলছেন, এটি সমানভাবে বিতরণ করা হয়নি; আপনি উপরের এবং নিম্ন প্রান্তে সংখ্যা পাওয়ার সম্ভাবনা কম, তাই আপনি মধ্য তৃতীয় দিকে পক্ষপাত পাবেন। এর ফলে কেউ বেল-ইশ বক্ররে র্যান্ডম ডেটা "সাধারণকরণ" করতে চাইলে উপকৃত হতে পারে তবে দু'বার বা তারও বেশি ছোট এলোমেলো সংখ্যার (পাশা নিক্ষেপের অনুরূপ) যোগফল আপনাকে আরও প্রাকৃতিক বক্ররেখা দেবে। আমার উদ্দেশ্যে, এটি ব্যর্থ হয়।
এই পরীক্ষায় উত্তীর্ণ একটাই ছিল মডুলো বিভাগ দ্বারা সীমাবদ্ধতা, যা তিনটির মধ্যে দ্রুততম হিসাবেও পরিণত হয়েছিল। Modulo, এর সংজ্ঞা অনুসারে, উপলব্ধ ইনপুটগুলি প্রদানের পরে যতটা সম্ভব বিতরণ তৈরি করবে।