ডাই রোলিংয়ের ব্যবহারের ক্ষেত্রে কমাতে ভাল ইউনিট পরীক্ষাগুলি কী কী?


18

আমি ইউনিট পরীক্ষার সাথে গ্রিপস পেতে চেষ্টা করছি।

বলুন যে আমাদের একটি ডাই আছে যার পার্শ্বের ডিফল্ট সংখ্যা 6 এর সমান হতে পারে (তবে এটি 4, 5 পক্ষযুক্ত হতে পারে):

import random
class Die():
    def __init__(self, sides=6):
        self._sides = sides

    def roll(self):
        return random.randint(1, self._sides)

নিম্নলিখিতগুলি কি বৈধ / দরকারী ইউনিট পরীক্ষা হবে?

  • s পার্শ্বযুক্ত ডাইয়ের জন্য 1-6 রেঞ্জের একটি রোল পরীক্ষা করুন
  • 6 পার্শ্বযুক্ত ডাইয়ের জন্য 0 এর রোল পরীক্ষা করুন
  • 6 পার্শ্বযুক্ত ডাইয়ের জন্য 7 এর রোল পরীক্ষা করুন
  • 3 পার্শ্বযুক্ত ডাইয়ের জন্য 1-3 পরিসরে একটি রোল পরীক্ষা করুন
  • 3 পার্শ্বযুক্ত ডাইয়ের জন্য 0 এর রোল পরীক্ষা করুন
  • 3 পার্শ্বযুক্ত ডাইয়ের জন্য 4 এর রোল পরীক্ষা করুন

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

এছাড়াও, আমার এমনকি ডাই রোলগুলির অন্যান্য প্রকরণগুলি যেমন এই ক্ষেত্রে 3 টিও পরীক্ষা করা দরকার, বা অন্য আরম্ভিক ডাই স্টেটটি কভার করা ভাল?


1
বিয়োগ-5-পক্ষীয় ডাই বা নাল-পার্শ্বে মারা যাওয়া সম্পর্কে কী?
JensG

উত্তর:


22

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

এটি অবশ্যই সম্পূর্ণরূপে সম্ভব যে আপনার কোডটি random.randint()ভুল ব্যবহার করে ; অথবা আপনি random.randrange(1, self._sides)পরিবর্তে কল করছেন এবং আপনার মর কখনই সর্বোচ্চ মান ছুঁড়ে না, তবে এটি একটি ভিন্ন ধরণের বাগ হতে পারে, আপনি ইউনিটেস্টের সাথে ধরতে পারেননি। সেক্ষেত্রে আপনার die ইউনিট ডিজাইন হিসাবে কাজ করছে, তবে নকশাটি নিজেই ত্রুটিযুক্ত ছিল।

এই ক্ষেত্রে, আমি ঠাট্টা ব্যবহার করতে চাই প্রতিস্থাপনrandint() ফাংশন, এবং শুধুমাত্র যাচাই করুন যে এটি হয়েছে বলা সঠিকভাবে। পাইথন ৩.৩ এবং তার বেশি এই ধরণের পরীক্ষার পরিচালনা করার জন্য unittest.mockমডিউলটি নিয়ে আসে তবে ঠিক একই কার্যকারিতাটি পেতে আপনি পুরানো সংস্করণগুলিতে বাহ্যিক mockপ্যাকেজটি ইনস্টল করতে পারেন

import unittest
try:
    from unittest.mock import patch
except ImportError:
    # < python 3.3
    from mock import patch


@patch('random.randint', return_value=3)
class TestDice(unittest.TestCase):
    def _make_one(self, *args, **kw):
        from die import Die
        return Die(*args, **kw)

    def test_standard_size(self, mocked_randint):
        die = self._make_one()
        result = die.roll()

        mocked_randint.assert_called_with(1, 6)
        self.assertEqual(result, 3)

    def test_custom_size(self, mocked_randint):
        die = self._make_one(sides=42)
        result = die.roll()

        mocked_randint.assert_called_with(1, 42)
        self.assertEqual(result, 3)


if __name__ == '__main__':
    unittest.main()

বিদ্রূপের সাথে, আপনার পরীক্ষা এখন খুব সহজ; সত্যিই আছে মাত্র 2 টি মামলা। 6-পক্ষীয় মরার জন্য ডিফল্ট কেস এবং কাস্টম পক্ষের কেস।

randint()এর গ্লোবাল নেমস্পেসে অস্থায়ীভাবে ফাংশনটি প্রতিস্থাপন করার অন্যান্য উপায় রয়েছে Dieতবে mockমডিউলটি এটিকে সহজতম করে তোলে। এখানে @mock.patchসাজসজ্জা পরীক্ষার ক্ষেত্রে সমস্ত পরীক্ষার পদ্ধতিতে প্রযোজ্য ; প্রতিটি পরীক্ষার পদ্ধতিটি একটি অতিরিক্ত যুক্তি, বিদ্রূপিত random.randint()ফাংশনটি পাস করে, তাই আমরা মোক এটির বিরুদ্ধে পরীক্ষা করতে পারি যে এটি সত্যই সঠিকভাবে বলা হয়েছে কিনা। return_valueযুক্তি নির্দিষ্ট করে কি, উপহাস থেকে ফিরিয়ে দেওয়া হয় তাই আমরা যাচাই করতে পারেন যে যখন এটা বলা হয় die.roll()পদ্ধতি সত্যিই আমাদের জন্য 'র্যান্ডম' ফলাফলের ফিরে আসেন।

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

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

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

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

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


1
আপনি 2 টিরও বেশি টেস্ট কেস পেয়েছেন ... ফলাফলগুলি ডিফল্ট মানের জন্য পরীক্ষা করে: নিম্ন (1), উপরের (6) নীচে (0) এর নীচে, উপরের (7) এর বাইরে এবং ম্যাক্স_আইন্টের মতো ব্যবহারকারী নির্দিষ্ট সংখ্যার ফলাফল ইত্যাদি ইনপুটটিও বৈধ নয়, যার জন্য কোনও এক সময় এটি পরীক্ষা করার প্রয়োজন হতে পারে ...
জেমস স্নেল

2
না, সেগুলি randint()কোডের জন্য নয়, এর জন্য পরীক্ষামূলক Die.roll()
মার্টিজন পিটারস

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

@ আরগায়ার: অবশ্যই, আপনি যদি মানটি অপরিবর্তিত অবস্থায় ফিরে পেয়েছেন তা যাচাই করতে চান, sentinel.dieতা নিশ্চিত করার এক দুর্দান্ত উপায়।
মার্টিজন পিটার্স

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

16

মার্টিজনের উত্তর হ'ল আপনি কীভাবে তা করতে চাইলে যদি আপনি সত্যিই এমন কোনও পরীক্ষা চালাতে চান যা দেখায় যে আপনি এলোমেলো.আরেন্ডিন্ট বলছেন। যাইহোক, "যা প্রশ্নের উত্তর দেয় না" বলা হওয়ার ঝুঁকিতে, আমি মনে করি এটি এককভাবে পরীক্ষা করা উচিত নয়। মজাদার র্যান্ডিন্টটি আর ব্ল্যাক বক্স টেস্টিং নয় - আপনি নির্দিষ্টভাবে দেখিয়ে যাচ্ছেন যে বাস্তবায়নে নির্দিষ্ট কিছু চলছে । ব্ল্যাক বক্স টেস্টিং এটি এমনকি কোনও বিকল্প নয় - আপনি কার্যকর করতে পারেন এমন কোনও পরীক্ষা নেই যা প্রমাণ করবে যে ফলাফল কখনই 1 এর চেয়ে কম বা 6 এর বেশি হবে না

আপনি উপহাস করতে পারেন randint? হ্যা, তুমি পারো. তবে আপনি কি প্রমাণ করছেন? আপনি এটিকে আর্গুমেন্ট 1 এবং পক্ষ দিয়ে বলেছেন called কি যে মানে? আপনি এক বর্গক্ষেত্রে ফিরে এসেছেন - দিনের শেষে আপনি প্রমাণ করতে হবে - আনুষ্ঠানিকভাবে বা অনানুষ্ঠানিকভাবে - যে random.randint(1, sides)কলিংটি ডাইস রোলটি সঠিকভাবে প্রয়োগ করে।

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


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

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

হ্যাঁ, এটি একটি সাদা-বাক্স ইউনিট পরীক্ষার সীমাবদ্ধতা। যাইহোক, পরীক্ষার কোনও অর্থ নেই যা random.randint()[1, পক্ষ] (অন্তর্ভুক্ত) পরিসীমাতে সঠিকভাবে মানগুলি ফিরিয়ে দেবে, এটি randomইউনিটটি সঠিকভাবে কাজ করে তা নিশ্চিত করার জন্য পাইথন বিকাশকারীদের ।
মার্টিজন পিটার্স

এবং আপনি যেমন নিজেকে বলেছিলেন, ইউনিট টেস্টিং গ্যারান্টি দিতে পারে না যে আপনার কোড বাগ বাগমুক্ত; যদি আপনার কোড অন্য ইউনিটগুলি ভুলভাবে ব্যবহার করছে (বলুন, আপনি random.randint()যেমনটি আচরণ করার প্রত্যাশা করেছিলেন random.randrange()এবং এটির সাথে এটি কল করেছিলেন random.randint(1, sides + 1), তবে আপনি যে কোনও উপায়ে ডুবে
মার্টিজান পিটারস

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

6

এলোমেলো বীজ ঠিক করুন। 1, 2, 5 এবং 12-পাশের ডাইসের জন্য, নিশ্চিত করুন যে কয়েক হাজার রোলগুলি 1 এবং N সহ ফলাফল দেয় এবং 0 বা এন + 1 সহ নয় fre প্রত্যাশিত পরিসীমাটি কভার করুন, অন্য একটি বীজে স্যুইচ করুন।

উপহাসের সরঞ্জামগুলি দুর্দান্ত, তবে তারা আপনাকে কোনও কাজ করার অনুমতি দেয় বলে এই জিনিসটি করা উচিত নয়। YAGNI বৈশিষ্ট্যগুলির হিসাবে টেস্ট ফিক্সচারগুলিতে প্রয়োগ হয়।

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


3

আপনি Dieযদি এটি সম্পর্কে চিন্তা করেন তবে কী ? - চারপাশে মোড়কের চেয়ে বেশি কিছু নেই random। এটা তোলে encapsulates random.randintএবং আপনার অ্যাপ্লিকেশান নিজস্ব শব্দভান্ডার পরিপ্রেক্ষিতে এটি relabels: Die.Roll

আমি এটা মধ্যে বিমূর্ততা আরেকটি স্তর ঢুকিয়ে প্রাসঙ্গিক খুঁজে না Dieএবং randomকারণ Dieনিজেই ইতিমধ্যে অপ্রত্যক্ষ্যতার এই স্তর আবেদন জানানোর এবং প্ল্যাটফর্ম মধ্যে।

আপনি যদি ডাবের ডাইসের ফলাফল চান তবে কেবল বিদ্রূপ করুন Die, উপহাস করবেন নাrandom

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

=> Dieএটিকে কোডের কয়েকটি তুচ্ছ লাইন মনে করে এবং randomনিজের তুলনায় কোনও যুক্তিই সামান্য যুক্ত করে আমি এই নির্দিষ্ট উদাহরণে এটি পরীক্ষা করতে এড়াতে চাই।


2

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

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

এটি যদি আমিই থাকতাম তবে আমি বলতাম, 6000 রোলগুলি বলুন, সেগুলি টাল করুন এবং নিশ্চিত করুন যে 1-6 থেকে প্রতিটি সংখ্যা 500 এবং 1500 বারের মধ্যে ঘূর্ণিত হয়েছে। আমি এটিও পরীক্ষা করে দেখতে পারি যে এই ব্যাপ্তির বাইরে কোনও নম্বর ফিরে আসে না। আমি এটিও পরীক্ষা করে দেখতে পারি যে, 6000 রোলগুলির দ্বিতীয় সেটের জন্য, যখন ফ্রিকোয়েন্সি অনুসারে [১..6. order] অর্ডার করার সময় ফলাফল ভিন্ন হয় (সংখ্যাটি এলোমেলো হয়ে গেলে এটি 720 রানের মধ্যে একবার ব্যর্থ হবে!)। আপনি যদি পুরোপুরি সুদৃ ;় হতে চান, আপনি সংখ্যার ফ্রিকোয়েন্সিটি 1 এর পরে অনুসরণ করতে পারেন, একটি 2 অনুসরণ করছেন ইত্যাদি তবে নিশ্চিত হয়ে নিন যে আপনার নমুনার আকার যথেষ্ট বড় এবং আপনার যথেষ্ট পরিমাণে বৈকল্পিক রয়েছে। মানুষ প্রত্যাশা করে যে এলোমেলো সংখ্যায় তারা আসলে তুলনায় কম প্যাটার্ন পাবে।

12 টি পক্ষের জন্য পুনরাবৃত্তি করুন এবং 2 তরফা মারা যান (6 সবচেয়ে বেশি ব্যবহৃত হয়, সুতরাং যে কেউ এই কোডটি লেখেন তাদের পক্ষে সর্বাধিক প্রত্যাশিত)।

অবশেষে, আমি 1-পক্ষীয় ডাই, 0 পার্শ্বযুক্ত ডাই, একটি -1 পার্শ্বযুক্ত মরা, ২.৩ পার্শ্বযুক্ত মরা, একটি [1,2,3,4,5,6] পাশের ডাইয়ের সাথে কী হয় তা পরীক্ষা করে দেখব এবং একটি "বালাহ" পক্ষপাতহীন। অবশ্যই, এই সমস্ত ব্যর্থ হওয়া উচিত; তারা কি কার্যকর উপায়ে ব্যর্থ হয়? এগুলি সম্ভবত রোলিংয়ে নয়, সৃষ্টিতে ব্যর্থ হওয়া উচিত।

অথবা, সম্ভবত, আপনি এগুলিও অন্যরকমভাবে পরিচালনা করতে চান - সম্ভবত [1,2,3,4,5,6] দিয়ে একটি ডাই তৈরি করা গ্রহণযোগ্য হবে - এবং সম্ভবত "বেলা "ও হতে পারে; এটি 4 টি মুখ সহ একটি ডাই হতে পারে এবং প্রতিটি মুখের উপর একটি চিঠি রয়েছে। "বগল" গেমটি মনে পড়বে, যেমন ম্যাজিক আট বল।

এবং শেষ অবধি, আপনি এটি নিয়ে ভাবতে চাইতে পারেন: http://lh6.ggpht.com/-fAGXwbJbYRM/UJA_31ACOLI/AAAAAAAAgg/2FxOWzo96KE/s1600-h/random%25255B3%25255D.jpg


2

জোয়ারের বিরুদ্ধে সাঁতার কাটার ঝুঁকিতে আমি বেশ কয়েক বছর আগে এখনও উল্লেখ না করা একটি পদ্ধতি ব্যবহার করে এই সঠিক সমস্যাটি সমাধান করেছি।

আমার কৌশলটি কেবলমাত্র আরএনজিকে এমন একটি দিয়ে ঠাট্টা করা ছিল যা পুরো স্থান জুড়ে মানগুলির একটি অনুমানযোগ্য স্ট্রিম তৈরি করে। যদি (বলুন) পাশ = = এবং আরএনজি 0 থেকে 5 পর্যন্ত ক্রমানুসারে মান উত্পন্ন করে আমি অনুমান করতে পারি যে আমার ক্লাসটি কীভাবে আচরণ করা উচিত এবং সেই অনুযায়ী ইউনিট পরীক্ষা করা উচিত।

যুক্তিটি হ'ল এটি এই ক্লাসে যুক্তিটি একাই পরীক্ষা করে, এই ধারণাটি অনুসারে যে আরএনজি অবশেষে values ​​প্রতিটি মান উত্পাদন করবে এবং নিজেই আরএনজি পরীক্ষা না করে।

এটি সহজ, নির্জনবাদী, পুনরুত্পাদনযোগ্য এবং এটি বাগগুলি ধরতে পারে। আমি আবার একই কৌশল ব্যবহার করব।


আরএনজির উপস্থিতি দেখিয়ে পরীক্ষাগুলি কী হওয়া উচিত, পরীক্ষার জন্য কী কী ডেটা ব্যবহার করা যেতে পারে তা প্রশ্নটি বানান না। আমার পরামর্শটি নিছক আরএনজি নিয়ে ঠাট্টা-বিদ্রূপ করে পরীক্ষা-নিরীক্ষা করা। কী পরীক্ষার জন্য মূল্যবান তা প্রশ্নে সরবরাহিত তথ্যের উপর নির্ভর করে।


বলুন আপনি অনুমানযোগ্য হওয়ার জন্য আরএনজিকে উপহাস করেছেন। আচ্ছা তুমি তাহলে কি পরীক্ষা দিচ্ছ? প্রশ্নটি জিজ্ঞাসা করে "নিম্নলিখিতগুলি কি বৈধ / কার্যকর ইউনিট পরীক্ষা হবে?" এটি 0-5-এ ফিরিয়ে দেওয়ার উপহাস করা কোনও পরীক্ষা নয় বরং পরীক্ষার সেটআপ। আপনি কীভাবে "সেই অনুযায়ী ইউনিট পরীক্ষা" করবেন? এটি কীভাবে "বাগগুলি ধরে" তা বুঝতে ব্যর্থ হচ্ছি। 'ইউনিট' পরীক্ষার জন্য আমার কী প্রয়োজন তা বোঝার জন্য আমার খুব কষ্ট হচ্ছে।
বিডিআরএক্স

@ বিডিআরএক্স: এটি কিছুক্ষণ আগে ছিল: আমি এখন এটির উত্তর দেব। তবে সম্পাদনা দেখুন।
david.pfx

1

আপনার প্রশ্নে আপনি যে পরীক্ষাগুলির পরামর্শ দিচ্ছেন সেগুলি বাস্তবায়ন হিসাবে কোনও মডুলার গাণিতিক কাউন্টার সনাক্ত করে না। এবং তারা সম্ভাব্যতা বিতরণ সম্পর্কিত কোডের মতো সাধারণ প্রয়োগের ত্রুটি সনাক্ত করে না return 1 + (random.randint(1,maxint) % sides)। বা জেনারেটরের একটি পরিবর্তন যা দ্বিমাত্রিক নিদর্শনগুলির ফলাফল করে।

আপনি যদি সত্যিই যাচাই করতে চান যে আপনি সমানভাবে বিতরণ করা এলোমেলো-প্রদর্শিত নম্বরগুলি উত্পন্ন করছেন আপনার খুব বিস্তৃত বৈশিষ্ট্য পরীক্ষা করতে হবে। যুক্তিযুক্ত ভাল কাজ করার জন্য আপনি আপনার উত্পন্ন নম্বরগুলিতে http://www.phy.duke.edu/~rgb/ জেনারাল / ডিএহার্ডার.পিপ চালাতে পারেন run বা অনুরূপ জটিল ইউনিট-পরীক্ষা স্যুট লিখুন।

এটি ইউনিট-টেস্টিং বা টিডিডি-র দোষ নয়, এলোমেলোভাবে যাচাই করা খুব কঠিন সম্পত্তি হিসাবে ঘটে। এবং উদাহরণের জন্য একটি জনপ্রিয় বিষয়।


-1

ডাই-রোলের সবচেয়ে সহজ পরীক্ষাটি হ'ল এটি কয়েক লক্ষ-হাজার বার পুনরাবৃত্তি করা এবং যাচাই করা যে প্রতিটি সম্ভাব্য ফলাফল মোটামুটি (1 / পক্ষের সংখ্যা) বার আঘাত হয়েছিল। --পক্ষের মারা যাওয়ার ক্ষেত্রে, আপনার প্রতিটি সম্ভাব্য মান প্রায় 16.6% হিট হওয়া উচিত। যদি কেউ শতকরা বেশি ছাড়িয়ে থাকে তবে আপনার সমস্যা আছে।

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


1
এই পরীক্ষাটি সম্পূর্ণরূপে অ-এলোমেলো বাস্তবায়নের জন্য পাস করবে যা কেবল পূর্বনির্ধারিত ক্রমে একের পর এক লুপ করে
Gnat

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