অন্তর্নিহিত এলোমেলো / অ-নিরোধক অ্যালগরিদমের ইউনিট-টেস্টিং


41

আমার বর্তমান প্রকল্পটি, সংক্ষেপে, "সীমাবদ্ধ-এলোমেলো ঘটনা" তৈরিতে জড়িত। আমি মূলত পরিদর্শনগুলির একটি সময়সূচি তৈরি করছি। এর মধ্যে কয়েকটি কঠোর সময়সূচী বাধার উপর ভিত্তি করে; আপনি শুক্রবার সকাল দশটায় সপ্তাহে একবার পরিদর্শন করেন। অন্যান্য পরিদর্শনগুলি "এলোমেলো"; এখানে "বেসরকারী কনফিগার করার প্রয়োজনীয়তা যেমন" প্রতি সপ্তাহে 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, এর সংজ্ঞা অনুসারে, উপলব্ধ ইনপুটগুলি প্রদানের পরে যতটা সম্ভব বিতরণ তৈরি করবে।


2
সুতরাং, শেষ পর্যন্ত, আপনি এমন একটি প্রোগ্রাম চান যা একটি এলোমেলো সংখ্যার জেনারেটরের আউটপুট দেখায় এবং সিদ্ধান্ত নেয় এটি এলোমেলো কিনা? "5,4,10,31,120,390,2,3,4" হিসাবে এলোমেলো হলেও "49,39,1,10,103,12,4,189" ছিল না?
PSr

না, তবে প্রকৃত PRNG এবং শেষ ফলাফলের মধ্যে পক্ষপাতিত্ব পরিচয় দেওয়া এড়ানো ভাল হবে।
কিথস

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

আপনার সমন্বয়গুলির জন্যও পরীক্ষা করা উচিত। প্রতি ঘন্টা প্রায় সমান প্রত্যাশিত পরিদর্শন করা মামলার বিরুদ্ধে রক্ষা করবে না, যেখানে বলুন, মঙ্গলবার সকাল ১১ টা এএম পরিদর্শন সর্বদা বৃহস্পতিবার দুপুর ২ টা এবং শুক্রবার সকাল ১০ টা পরে হয়।
ডেভিড থর্নলি

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

উত্তর:


17

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

যদি এটিই আপনি সন্ধান করছেন তবে এটিকে পরীক্ষার ক্ষেত্রের মধ্যে নির্জনবাদী করার জন্য র্যান্ডমাইজারকে উপহাস করুন

আমার কাছে জিআইডি জেনারেটর এবং ডেটটাইম.নাও সহ সকল ধরণের অ-নিরস্তাত্মক বা অবিশ্বাস্য (পরীক্ষা লেখার সময়) ডেটার জন্য সাধারণত মক অবজেক্ট থাকে।

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

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

এই সমস্ত বলেছেন, আপনার অবশ্যই মনে রাখতে হবে যে এটি একটি সিউডো র্যান্ডম নম্বর জেনারেটর কারণ হিসাবে বলা হয়। এমনকি সেই স্তরে কিছু পক্ষপাতও থাকতে পারে ।


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

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

1
এটি একটি পরীক্ষা যা মাঝে মাঝে এবং অপ্রত্যাশিতভাবে ভেঙে যায়। আপনি এটা চান না। আমি মনে করি আপনি আমার বক্তব্য ভুল বুঝেছেন, সত্যি বলতে। আপনি র্যান্ডমাইজারকে কল করছেন তার ভিতরে কোথাও কোথাও কোডের একটি লাইন থাকা উচিত যা একটি এলোমেলো সংখ্যা উত্পন্ন করে, না? সেই লাইনটিই আমি একটি র‌্যান্ডমাইজার হিসাবে উল্লেখ করছি এবং আপনি যা র্যান্ডমাইজার বলছেন তার বাকীটি ("এলোমেলো" ডেটার উপর ভিত্তি করে তারিখের বিতরণ) আপনি যা পরীক্ষা করতে চান তা। নাকি আমি কিছু মিস করছি?
পিডিআর

র্যান্ডম সিকোয়েন্সগুলির যথাযথ পরিসংখ্যানীয় মেট্রিক্স (পারস্পরিক সম্পর্ক, ব্লক-সম্পর্কিত, গড়, স্ট্যান্ডার্ড বিচ্যুতি ইত্যাদি) কেবলমাত্র যদি আপনি সত্যিই ছোট নমুনাগুলি করেন তবেই আপনার প্রত্যাশার পরিসর পূরণ করতে ব্যর্থ হবে। আপনার স্যাম্পলিং সেটগুলি বাড়ান এবং / অথবা আপনার অনুমোদিত ত্রুটি বারগুলি বাড়িয়ে দিন
লুসার

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

23

এটি একটি নির্বোধ উত্তরের মতো শোনাচ্ছে, তবে আমি এটি এখানে ফেলে দেব কারণ এটি আগেই এটি এটি দেখেছি:

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

এটি অকার্যকর শোনায়, তবে এটিই সামরিক বাহিনী এটি করে (তা হয় বা তারা একটি 'র্যান্ডম টেবিল' ব্যবহার করে যা সত্যই এলোমেলো নয়)


ঠিক: আপনি যদি একটি অ্যালগরিদমের কোনও উপাদান পরীক্ষা করতে না পারেন, তবে এটি বিমূর্ত করুন এবং এটি উপহাস করুন
স্টিভ গ্রেট্রেক্স

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

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

এটি যে নির্বোধ নয় - গুগল তাদের কাগজ অনুসারে স্প্যানার পরীক্ষায় ব্যর্থতার ইনজেকশন পুনরুত্পাদন করতে একই পদ্ধতি ব্যবহার করে :)
অক্ষত মহাজন

6

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

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

উইকিপিডিয়া নিবন্ধ http://en.wikedia.org/wiki/Randomness_tests এবং এর ফলোআপ লিঙ্কগুলিতে আরও তথ্য রয়েছে।


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

4

আপনার জন্য আমার দুটি উত্তর আছে।

=== প্রথম উত্তর ===

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

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

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

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


=== দ্বিতীয় উত্তর ===

বাহ ... কি দুর্দান্ত সমস্যা!

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

  1. আপনি নিষ্ঠুর শক্তি প্রয়োগ করতে পারেন। ইনপুট হিসাবে আসল আরএনজি সহ কেবলমাত্র পুরো একগুচ্ছ আলগরিদমটি চালান। আউটপুট ফলাফলগুলি অভিন্ন বিতরণ করা হয়েছে কিনা তা পরীক্ষা করে দেখুন। যদি নির্দিষ্ট থ্রেশহোল্ডের চেয়ে বেশি বিতরণ পুরোপুরি অভিন্ন হয়ে থাকে এবং আপনার সমস্যার মুখোমুখি হওয়ার বিষয়টি নিশ্চিত করতে আপনার পরীক্ষাটি ব্যর্থ হতে হবে এবং থ্রেশহোল্ডটি খুব কম সেট করা যাবে না। এর অর্থ হল যে একটি মিথ্যা পজিটিভের সম্ভাবনা (এলোমেলো সুযোগ দ্বারা একটি পরীক্ষায় ব্যর্থতা) খুব কম (মাঝারি আকারের কোড বেসের জন্য <1%; এমনকি এর চেয়েও কম) এর জন্য আপনার প্রচুর সংখ্যক রান প্রয়োজন হবে that একটি বড় কোড বেস)।

  2. আপনার অ্যালগরিদমকে একটি ফাংশন হিসাবে বিবেচনা করুন যা সমস্ত আরএনজি আউটপুটকে একটি ইনপুট হিসাবে যুক্ত করে, তারপরে আউটপুট হিসাবে পরিদর্শন সময় উত্পন্ন করে। আপনি যদি জানেন যে এই ফাংশনটি টুকরোয় ধারাবাহিক, তবে আপনার সম্পত্তি পরীক্ষা করার একটি উপায় রয়েছে। আরকেডকে একটি মকেবল আরএনজি দিয়ে প্রতিস্থাপন করুন এবং অ্যালগরিদমটি বহুবার চালান, অভিন্নভাবে বিতরণ করা আরএনজি আউটপুট উত্পাদন করে। সুতরাং যদি আপনার কোডের জন্য ২ টি আরএনজি কল প্রয়োজন হয়, প্রতিটি রেঞ্জের [০.০.১], আপনি পরীক্ষাটি অ্যালগরিদমটি ১০০ বার চালাতে পারেন, মানগুলি ([०.০,০.০), (০.০,০.১), (০.০, ০.২), ... (০.০,০.৯), (0.1,0.0), (0.1,0.1), ... (0.9,0.9)]। তারপরে আপনি পরীক্ষা করতে পারেন যে 100 রানের আউটপুট অনুমোদিত পরিসরের মধ্যে (প্রায়) অভিন্নভাবে বিতরণ করা হয়েছিল কিনা।

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


3

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

আপনি চান না যে আপনার ইউনিট পরীক্ষাগুলি উপেক্ষা করা হবে যেমন র্যান্ডম.নেক্সটইন্ট (1000) 0 বা 999 ফেরত যাওয়ার পরে অফ-বাই-ও বাগগুলি ঘটছে।


3

আপনি সেভিসিকোভা এট আলটি একবার দেখে নিতে পারেন: "স্টোকাস্টিক সিস্টেমগুলির অটোমেটেড টেস্টিং: একটি পরিসংখ্যানগতভাবে গ্রাউন্ডেড অ্যাপ্রোচ" ( পিডিএফ )।

আরবানসিম সিমুলেশন প্ল্যাটফর্মের জন্য বিভিন্ন পরীক্ষার ক্ষেত্রে পদ্ধতিটি প্রয়োগ করা হয় ।


ওখানে খুব ভাল জিনিস।
কিথস

2

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

আমার পদ্ধতির হবে:

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

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

রূপান্তর / সীমাবদ্ধ অ্যালগরিদমের প্রকৃতি হিসাবে:

প্রদত্ত: সিউডো-এলোমেলো মান পি উত্পন্ন করার পদ্ধতি যেখানে 0 <= পি <= এম

প্রয়োজন: আউটপুট y (সম্ভবত বিচ্ছিন্ন) পরিসীমা 0 <= y <= N <= এম

অ্যালগরিদম:

  1. গণনা করুন r = floor(M / N), অর্থাৎ, সম্পূর্ণ আউটপুট রেঞ্জের সংখ্যা যা ইনপুট সীমার মধ্যে মাপসই হয়।
  2. পি এর জন্য সর্বাধিক গ্রহণযোগ্য মান গণনা করুন :p_max = r * N
  3. মান উৎপন্ন পি কম একটি মান পর্যন্ত বা এর সমান p_maxপাওয়া যায়
  4. ক্যালকুলেট y = p / r
  5. যদি y গ্রহণযোগ্য হয় তবে তা ফিরিয়ে দিন, অন্যথায় পদক্ষেপ 3 দিয়ে পুনরাবৃত্তি করুন

মূলটি হ'ল অ-সমানভাবে ভাঁজ করার চেয়ে অগ্রহণযোগ্য মানগুলি বাতিল করা।

সিউডো কোডে:

# assume prng generates non-negative values
def randomInRange(min, max, prng):
    range = max - min
    factor = prng.max / range

    do:
        value = prng()
    while value > range * factor
    return (value / factor) + min

def constrainedRandom(constraint, prng):
    do:
        value = randomInRange(constraint.min, constraint.max, prng)
    while not constraint.is_acceptable(value)

1

আপনার কোডটি ব্যর্থ হয় না, বা সঠিক জায়গায় সঠিক ব্যতিক্রম ছুঁড়ে দেওয়া ছাড়াও আপনি একটি বৈধ ইনপুট / প্রতিক্রিয়া জুড়ি তৈরি করতে পারেন (এমনকি এটি ম্যানুয়ালি গণনাও করতে পারেন), পরীক্ষায় ইনপুটটি খাওয়াতে পারেন এবং নিশ্চিত হওয়া উচিত যে এটি প্রত্যাশিত প্রতিক্রিয়া ফিরিয়েছে। দুর্দান্ত নয়, তবে আপনি যা করতে পারেন তা হ'ল im যাইহোক, আপনার ক্ষেত্রে এটি সত্যই এলোমেলো নয়, একবার আপনি আপনার সময়সূচী তৈরি করলে আপনি নিয়ম অনুসারে পরীক্ষা করতে পারবেন - প্রতি সপ্তাহে 9-9 এর মধ্যে অবশ্যই 3 টি পরিদর্শন করতে হবে; পরিদর্শন ঘটে যখন সঠিক সময় পরীক্ষা করার কোন সত্যিকার প্রয়োজন বা ক্ষমতা নেই।


1

এটি বেশ কয়েকবার চালানো এবং আপনি যে ডিস্ট্রিবিউশন চান তা পান কিনা তা দেখার চেয়ে সত্য আর কোন উপায় নেই। যদি আপনার 50 টি অনুমোদিত সম্ভাব্য পরিদর্শনের সময়সূচি থাকে তবে আপনি পরীক্ষাটি 500 বার চালাবেন এবং নিশ্চিত করুন যে প্রতিটি সময়সূচীটি 10 ​​বারের কাছাকাছি ব্যবহৃত হয়েছে। আপনি আপনার এলোমেলো জেনারেটরের বীজগুলিকে আরও নিরঙ্কুশ করার জন্য এটি নিয়ন্ত্রণ করতে পারেন, তবে এটি আপনার পরীক্ষাগুলি আরও দৃ tight়তার সাথে বাস্তবায়নের বিশদগুলির সাথে মিলিয়ে দেবে।


তবে যদি এটি সত্যই এলোমেলো হয় তবে মাঝে মাঝে কিছু সময়সূচি ব্যবহার করা হবে না; এবং মাঝে মাঝে কিছু সময়সূচি 20 বারের বেশি ব্যবহৃত হবে। আমি জানি না আপনি কীভাবে পরীক্ষা করতে চান যে প্রতিটি সময়সূচী "10 বারের কাছাকাছি" ব্যবহৃত হয়, তবে আপনি এখানে যে শর্তটি পরীক্ষা করেন না কেন, প্রোগ্রামটি অনুমান করার জন্য কাজ করার সময় আপনি কখনও কখনও ব্যর্থ হন test
দাউদ বলছেন মনিকা

@ দাউদিব্বনক্যারিম পর্যাপ্ত নমুনা আকারের (এবং অভিন্নতার পক্ষে যুক্তিসঙ্গত সীমা) সহ পরীক্ষাটি বিলিয়নে ফেল করার সুযোগটি হ্রাস করতে পারবেন। এবং সাধারণত এর মতো পরিসংখ্যানগুলি n এর সাথে ঘনিষ্ঠ হয় তাই আপনি এই সংখ্যাগুলি পাওয়ার প্রত্যাশার চেয়ে কম সময় নেয়।
এমব্রিগ

1

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

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


2
আপনি স্বয়ংক্রিয় পরীক্ষার মাধ্যমে একেবারে এলোমেলোতা নির্ধারণ করতে পারেন। আপনি কেবলমাত্র পর্যাপ্ত পরিমাণে নমুনা তৈরি করেন এবং সিস্টেমে বায়াসগুলি সনাক্ত করতে এলোমেলোতার স্ট্যান্ডার্ড টেস্ট প্রয়োগ করেন। এটি একটি দুর্দান্ত স্ট্যান্ডার্ড আন্ডারগ্রাড প্রোগ্রামিং অনুশীলন।
ফ্র্যাঙ্ক এসকজারবা

0

কেবলমাত্র আপনার র্যান্ডমাইজারের আউটপুট রেকর্ড করুন (সিউডো বা কোয়ান্টাম / বিশৃঙ্খল বা বাস্তব জগত হোক)। তারপরে সেইগুলি "র্যান্ডম" ক্রমগুলি সংরক্ষণ করুন এবং পুনরায় খেলুন যা আপনার পরীক্ষার প্রয়োজনীয়তার সাথে খাপ খায় বা আপনার ইউনিট পরীক্ষার কেসগুলি তৈরি করার সাথে সাথে এটি সম্ভাব্য সমস্যা এবং বাগগুলি প্রকাশ করে exp


0

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

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

sumফাংশনটি পরীক্ষা করে দেখার জন্য এখানে একটি (বোবা, ব্যর্থ) উদাহরণ রয়েছে :

@given(lists(floats()))
def test_sum(alist):
    result = sum(alist)
    assert isinstance(result, float)
    assert result > 0
  • পরীক্ষার কাঠামোটি একবারে একটি তালিকা তৈরি করে
  • তালিকার বিষয়বস্তু ভাসমান পয়েন্ট সংখ্যা হবে
  • sum বলা হয় এবং ফলাফলের বৈশিষ্ট্য বৈধ হয়
  • ফলাফল সর্বদা ভাসমান
  • ফলাফল ইতিবাচক

এই পরীক্ষাটি মধ্যে "বাগ" একটি গুচ্ছ পাবেন sum(মন্তব্য যদি আপনি অনুমান করতে পেরেছি সব নিজের দ্বারা এগুলোর):

  • sum([]) is 0 (ইনট, ফ্লোট নয়)
  • sum([-0.9]) নেতিবাচক হয়
  • sum([0.0]) কঠোরভাবে ইতিবাচক নয়
  • sum([..., nan]) is nan যা ইতিবাচক নয়

ডিফল্ট সেটিংস সহ, hpythesis1 "খারাপ" ইনপুট পাওয়া যাওয়ার পরে পরীক্ষাটি বাতিল করে দেয়, যা টিডিডির পক্ষে ভাল। আমি ভেবেছিলাম অনেক / সমস্ত "খারাপ" ইনপুটগুলি রিপোর্ট করার জন্য এটিটি কনফিগার করা সম্ভব ছিল, তবে আমি এখন সেই বিকল্পগুলি খুঁজে পাচ্ছি না।

ও.পি. ক্ষেত্রে, যাচাইকৃত বৈশিষ্ট্যগুলি আরও জটিল হবে: পরিদর্শন টাইপ একটি উপস্থিত, পরিদর্শন টাইপ সপ্তাহে তিনবার, পরিদর্শন সময় বি সর্বদা 12 টায়, 9 থেকে 9 অবধি পরিদর্শন টাইপ, [প্রদত্ত তফসিল এক সপ্তাহের জন্য] ধরণের পরিদর্শন এ, বি, সি উপস্থিত, ইত্যাদি etc.

সর্বাধিক পরিচিত গ্রন্থাগারটি হ্যাস্কেলের জন্য কুইকচেক , অন্যান্য ভাষায় এই জাতীয় লাইব্রেরির তালিকার জন্য নীচে উইকিপিডিয়া পৃষ্ঠাটি দেখুন:

https://en.wikipedia.org/wiki/QuickCheck

হাইপোথিসিসের (পাইথনের জন্য) এই ধরণের পরীক্ষার বিষয়ে ভাল লেখার ব্যবস্থা রয়েছে:

https://hypothesis.works/articles/what-is-property-based-testing/


-1

আপনি যা পরীক্ষা করতে পারবেন ইউনিটটি তা যুক্তি নির্ধারণ করে যে এলোমেলো তারিখগুলি বৈধ কিনা বা অন্য এলোমেলো তারিখটি নির্বাচন করা দরকার কিনা।

এলোমেলো তারিখের জেনারেটর পরীক্ষা করার কোনও উপায় নেই যেগুলি একত্রে খেজুর পাবে এবং সেগুলি যথাযথভাবে এলোমেলো কিনা তা স্থির করে।


-1

আপনার লক্ষ্য ইউনিট পরীক্ষাগুলি লিখতে এবং সেগুলি পাস করা নয়, তবে আপনার প্রোগ্রামটি প্রয়োজনীয়তার সাথে খাপ খায় তা নিশ্চিত করা। আপনি এটি করার একমাত্র উপায় হ'ল প্রথমে আপনার প্রয়োজনীয়তাগুলি যথাযথভাবে সংজ্ঞায়িত করা। উদাহরণস্বরূপ, আপনি "এলোমেলো সময়ে তিনটি সাপ্তাহিক পরিদর্শন" উল্লেখ করেছেন। আমি বলব প্রয়োজনীয়তাগুলি হ'ল: (ক) ৩ টি পরিদর্শন (২ বা ৪ নয়), (খ) এমন সময়ে যেগুলি অপ্রত্যাশিতভাবে পরিদর্শন করতে চান না এমন লোকেরা অনুমানযোগ্য নয় এবং (সি) খুব কাছাকাছিও না - পাঁচ মিনিটের ব্যবধানে দুটি পরিদর্শন সম্ভবত অর্থহীন, সম্ভবত খুব দূরেও নয়।

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

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


না কিছু না. ইউনিট পরীক্ষাগুলি প্রমাণ করে যে প্রোগ্রামটি তার প্রয়োজনীয়তার সাথে খাপ খায়, তাই দুটি একই এবং এক and এবং আমি বিপরীত ইঞ্জিনিয়ার র্যান্ডম অ্যালগরিদমগুলিতে ভবিষ্যদ্বাণীপূর্ণ সফ্টওয়্যার লেখার ব্যবসায় নেই। আমি যদি থাকতাম তবে আমি আপনাকে এ সম্পর্কে বলব না, আমি তাদের কীগুলি ভবিষ্যদ্বাণী করে এবং সর্বাধিক দরদাতার কাছে গোপনীয়তা বিক্রি করে একটি সুরক্ষিত ওয়েবসাইটগুলি ক্র্যাকিং করছিলাম। আমার ব্যবসা একটি সময়সূচী লিখছে যা সীমাবদ্ধতার মধ্যে সীমাবদ্ধ তবে অভাবনীয় এবং এমন সময় তৈরি করে এবং আমি প্রমাণ করেছি যে আমি এটি করেছি, সম্ভাব্যতাবাদী নয় যা বলে যে আমি বেশ নিশ্চিত।
কিথস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.