অনিয়মিত আউটপুট সহ ইউনিট পরীক্ষার পদ্ধতি


37

আমার একটি ক্লাস রয়েছে যার অর্থ একটি দৈর্ঘ্যের এলোমেলো পাসওয়ার্ড তৈরি করা যা এটি এলোমেলো, তবে সংজ্ঞায়িত ন্যূনতম এবং সর্বাধিক দৈর্ঘ্যের মধ্যে সীমাবদ্ধ।

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

তবে যেসব ক্ষেত্রে এসইউটি অনির্দিষ্ট আউটপুট উত্পন্ন করার কথা বলেছে সে সম্পর্কে কী হবে?

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

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


9
ঘনিষ্ঠ ভোট কেন? আমি মনে করি এটি একটি সম্পূর্ণ বৈধ প্রশ্ন
মার্ক বাকের

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

1
@ মার্কবেকার কারণ ইউনিটটেস্টিংয়ের বেশিরভাগ প্রশ্ন প্রোগ্রামারস.এস. এটি মাইগ্রেশনের পক্ষে ভোট, প্রশ্নটি বন্ধ করার জন্য নয়।
ইক্কে

উত্তর:


20

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

function DoSomethingRandom($getRandomIntLessThan)
{
    if ($getRandomIntLessThan(2) == 0)
    {
        // Do action 1
    }
    else
    {
        // Do action 2
    }
}

// For testing purposes, always return 1
$alwaysReturnsOne = function($n) { return 1; };
DoSomethingRandom($alwaysReturnsOne);

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


1
প্রদত্ত সমস্ত উত্তরের আমি বেশ ভাল পরামর্শ দিয়েছিলাম যেগুলি আমি ব্যবহার করেছি, তবে এটিই আমি মনে করি যে মূল বিষয়টি নখর তাই এটি গ্রহণযোগ্যতা পায়।
গর্ডনএম

1
খুব মাথায় এটি নখ। অ-নিরপেক্ষ, যদিও এখনও সীমানা আছে।
surfasb

21

প্রকৃত আউটপুট পাসওয়ার্ডটি প্রতিটি সময় পদ্ধতিটি সম্পাদন করার সময় নির্ধারণ করা নাও হতে পারে তবে এরপরেও এটি পরীক্ষা করতে পারবেন এমন বৈশিষ্ট্যগুলি যেমন ন্যূনতম দৈর্ঘ্য, অক্ষর নির্ধারণকারী অক্ষরের মধ্যে অন্তর্ভুক্ত ইত্যাদি etc.

আপনি এটিও পরীক্ষা করে দেখতে পারেন যে রুটিনটি প্রতিবার একই পাসওয়ার্ডের সাথে একইভাবে আপনার পাসওয়ার্ড জেনারেটর বপন করে একটি ফলাফল নির্ধারণ করে।


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

14

"চুক্তি" বিরুদ্ধে পরীক্ষা। যখন পদ্ধতিগুলি "এজেডের সাথে 15 থেকে 20 অক্ষরের দৈর্ঘ্যের পাসওয়ার্ড উত্পন্ন করে" হিসাবে সংজ্ঞায়িত করা হয়, তখন এটি পরীক্ষা করুন

$this->assertTrue ((bool) preg_match('^[a-z]{15,20}$', $password));

অতিরিক্ত আপনি প্রজন্মকে নিষ্কাশন করতে পারেন, সুতরাং সবকিছু যা এটির উপর নির্ভর করে অন্য একটি "স্ট্যাটিক" জেনারেটর শ্রেণি ব্যবহার করে পরীক্ষা করতে পারে

class RandomGenerator implements PasswordGenerator {
  public function create() {
    // Create $rndPwd
    return $rndPwd;
  }
}

class StaticGenerator implements PasswordGenerator {
  private $pwd;
  public function __construct ($pwd) { $this->pwd = $pwd; }
  public function create      ()     { return $this->pwd; }
}

আপনি যে রেজেক্সটি দিয়েছিলেন তা কার্যকর প্রমাণিত হয়েছে তাই আমি আমার পরীক্ষায় একটি টুইট সংস্করণ অন্তর্ভুক্ত করেছি। ধন্যবাদ।
গর্ডনএম

6

আপনার একটি রয়েছে Password generatorএবং আপনার একটি এলোমেলো উত্স প্রয়োজন।

আপনি যেমন প্রশ্নে বলেছেন randomযে এটি বিশ্বব্যাপী রাষ্ট্র হিসাবে অ-নিরস্তাত্মক আউটপুট তৈরি করে । অর্থ এটি মান উত্পন্ন করতে সিস্টেমের বাইরের কিছু অ্যাক্সেস করে।

আপনি আপনার সমস্ত ক্লাসের জন্য এ জাতীয় কিছু থেকে কখনই মুক্তি পেতে পারবেন না তবে এলোমেলো মান তৈরির জন্য আপনি পাসওয়ার্ড জেনারেশনকে আলাদা করতে পারবেন।

<?php
class PasswordGenerator {

    public function __construct(RandomSource $randomSource) {
        $this->randomSource = $randomSource
    }

    public function generatePassword() {
        $password = '';
        for($length = rand(10, 16); $length; $length--) {
            $password .= $this-toChar($this->randomSource->rand(1,26));
        }
    }

}

আপনি যদি কোডটি এমনভাবে গঠন করেন তবে আপনি RandomSourceআপনার পরীক্ষাগুলির জন্য উপহাস করতে পারেন ।

আপনি 100% পরীক্ষা করতে সক্ষম হবেন না RandomSourceতবে এই প্রশ্নের মানগুলির পরীক্ষার জন্য আপনি যে পরামর্শ পেয়েছেন সেগুলি এটিতে প্রয়োগ করা যেতে পারে (টেস্টিংয়ের মতো যা rand->(1,26);সর্বদা 1 থেকে 26 পর্যন্ত কোনও সংখ্যা ফেরত দেয়।


এটি একটি দুর্দান্ত উত্তর।
নিক হোজেস

3

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


{*} এই জাতীয় পরীক্ষাটি ইউনিট পরীক্ষার জন্য "দ্রুত পরীক্ষা তৈরি করুন" নীতি লঙ্ঘন করে, যাতে আপনি অন্য কোনও উপায়ে তাদের বৈশিষ্ট্যগুলি বোধ করতে আরও ভাল অনুভব করতে পারেন: উদাহরণস্বরূপ, গ্রহণযোগ্যতা পরীক্ষা বা রিগ্রেশন টেস্ট। তবুও, আমি আমার ইউনিট পরীক্ষার কাঠামোটি ব্যবহার করেছি।


3

আমাকে দুটি কারণে গ্রহণযোগ্য উত্তরের সাথে একমত হতে হবে :

  1. Overfitting
  2. অসাধ্যতা

(লক্ষ্য করুন যে এটি অনেক পরিস্থিতিতে একটি ভাল উত্তর হতে পারে, তবে সব ক্ষেত্রেই নয় এবং সম্ভবত বেশিরভাগ ক্ষেত্রেও তা নয়))

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

(ঘটনাক্রমে, এটি সর্বদা একটি সমস্যা যা ইউনিট পরীক্ষার দিকে ঝুঁকে থাকে This এজন্যই ভাল পরীক্ষাগুলি সম্পূর্ণ হয় , বা কোনও নির্দিষ্ট ইউনিটের পক্ষে কমপক্ষে প্রতিনিধি এবং এটি সাধারণভাবে শক্ত))

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

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

সেই সব ক্ষেত্রে আস্থা অর্জনের একমাত্র উপায় হ'ল অনেক পরীক্ষা করা । হালকা, ধুয়ে ফেলা, পুনরাবৃত্তি। এটি একটি নির্দিষ্ট স্তর পর্যন্ত আত্মবিশ্বাস বাড়ায় (অতিরিক্ত পর্যায়ে টেস্ট রান করার জন্য বাণিজ্যটি নগদ হয়ে যায়)।


2

আপনার এখানে আসলে একাধিক দায়িত্ব রয়েছে। ইউনিট টেস্টিং এবং বিশেষত টিডিডি এই ধরণের জিনিস হাইলাইট করার জন্য দুর্দান্ত।

দায়িত্বগুলি হ'ল:

1) এলোমেলো নম্বর জেনারেটর। 2) পাসওয়ার্ড বিন্যাসক।

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

কেবলমাত্র আপনি আরও ভাল কোড পান না তবে আপনি আরও ভাল পরীক্ষা পান।


2

অন্যরা ইতিমধ্যে উল্লেখ করেছে, আপনি এলোমেলোতা সরিয়ে এই কোডটি পরীক্ষা করুন

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

এটি নিজেই পরীক্ষাটি পুনরাবৃত্তিযোগ্য নয় - যতক্ষণ আপনি এটি একবারে ব্যর্থ হওয়ার কারণটি খুঁজে পেতে পারেন ততক্ষণ।


2

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

দেখার আরেকটি উপায় হ'ল ইউনিট পরীক্ষাগুলি "এই কোডটি আমি এটি করার ইচ্ছা করি তা কি করে?" এই প্রশ্নের উত্তর দেওয়ার কথা। আপনার ক্ষেত্রে, আপনি কোডটি কী করবেন তা আপনি জানেন না কারণ এটি অ-নিরঙ্কুশ।

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

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

উচ্চতর স্তরের পরীক্ষায় (এটিকে "গ্রহণযোগ্যতা" বা "সংহতকরণ" বা যাই হোক না কেন) বলুন, আপনি কোডটিকে সত্যিকারের এলোমেলো উত্স দিয়ে চালাতে দেবেন।


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

1

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

নাকি তাই ভাবলাম!

নেমস্পেস যোগ করার একটি পরিণতি হ'ল পিএইচপি ফাংশনগুলিতে নির্মিত মশকরা অবিশ্বাস্যরকম কঠিন থেকে তুচ্ছ সহজতে চলে গেছে। যদি এসইউটি একটি প্রদত্ত নেমস্পেসে থাকে তবে আপনাকে যা করতে হবে তা হ'ল নেমস্পেসের অধীনে ইউনিট পরীক্ষায় আপনার নিজের mt_rand ফাংশনটি সংজ্ঞায়িত করতে হবে এবং এটি পরীক্ষার সময়কালের জন্য বিল্ট ইন পিএইচপি ফাংশনের পরিবর্তে ব্যবহার করা হবে।

এখানে চূড়ান্ত পরীক্ষার স্যুট রয়েছে:

namespace gordian\reefknot\util;

/**
 * The following function will take the place of mt_rand for the duration of 
 * the test.  It always returns the number exactly half way between the min 
 * and the max.
 */
function mt_rand ($min = 42, $max = NULL)
{
    $min    = intval ($min);
    $max    = intval ($max);

    $max    = $max < $min? $min: $max;
    $ret    = round (($max - $min) / 2) + $min;

    //fwrite (STDOUT, PHP_EOL . PHP_EOL . $ret . PHP_EOL . PHP_EOL);
    return ($ret);
}

/**
 * Override the password character pool for the test 
 */
class PasswordSubclass extends Password
{
    const CHARLIST  = 'AAAAAAAAAA';
}

/**
 * Test class for Password.
 * Generated by PHPUnit on 2011-12-17 at 18:10:33.
 */
class PasswordTest extends \PHPUnit_Framework_TestCase
{

    /**
     * @var gordian\reefknot\util\Password
     */
    protected $object;

    const PWMIN = 15;
    const PWMAX = 20;

    /**
     * Sets up the fixture, for example, opens a network connection.
     * This method is called before a test is executed.
     */
    protected function setUp ()
    {
    }

    /**
     * Tears down the fixture, for example, closes a network connection.
     * This method is called after a test is executed.
     */
    protected function tearDown ()
    {

    }

    public function testGetPassword ()
    {
        $this -> object = new PasswordSubclass (self::PWMIN, self::PWMAX);
        $pw = $this -> object -> getPassword ();
        $this -> assertTrue ((bool) preg_match ('/^A{' . self::PWMIN . ',' . self::PWMAX . '}$/', $pw));
        $this -> assertTrue (strlen ($pw) >= self::PWMIN);
        $this -> assertTrue (strlen ($pw) <= self::PWMAX);
        $this -> assertTrue ($pw === $this -> object -> getPassword ());
    }

    public function testGetPasswordFixedLen ()
    {
        $this -> object = new PasswordSubclass (self::PWMIN, self::PWMIN);
        $pw = $this -> object -> getPassword ();
        $this -> assertTrue ($pw === 'AAAAAAAAAAAAAAA');
        $this -> assertTrue ($pw === $this -> object -> getPassword ());
    }

    public function testGetPasswordFixedLen2 ()
    {
        $this -> object = new PasswordSubclass (self::PWMAX, self::PWMAX);
        $pw = $this -> object -> getPassword ();
        $this -> assertTrue ($pw === 'AAAAAAAAAAAAAAAAAAAA');
        $this -> assertTrue ($pw === $this -> object -> getPassword ());
    }

    public function testInvalidLenThrowsException ()
    {
        $exception  = NULL;
        try
        {
            $this -> object = new PasswordSubclass (self::PWMAX, self::PWMIN);
        }
        catch (\Exception $e)
        {
            $exception  = $e;
        }
        $this -> assertTrue ($exception instanceof \InvalidArgumentException);
    }
}

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


0

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

এটি মূলত নিশ্চিত করে যে আপনি নিজের র্যান্ডম ফাংশনটি সঠিকভাবে ব্যবহার করছেন এবং প্রতিটি কলটিতে পুনরায় বীজ বারণ করছেন না।


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