কৌশল প্যাটার্নে রিফ্যাক্টর এমন কোনও ক্রিয়াকলাপ কীভাবে ইউনিট করবেন?


10

আমার কোডে যদি আমার কোনও ফাংশন থাকে যা এর মতো হয়:

class Employee{

    public string calculateTax(string name, int salary)
    {
        switch (name)
        {
            case "Chris":
                doSomething($salary);
            case "David":
                doSomethingDifferent($salary);
            case "Scott":
               doOtherThing($salary);               
       }
}

সাধারণত আমি কারখানার শ্রেণি এবং কৌশল প্যাটার্ন ব্যবহার করে প্লাইওমর্ফিজম ব্যবহার করতে এটি রিফ্যাক্টর করব:

public string calculateTax(string name)
{
    InameHandler nameHandler = NameHandlerFactory::getHandler(name);
    nameHandler->calculateTax($salary);
}

এখন আমি যদি টিডিডি ব্যবহার করতাম তবে আমার কিছু পরীক্ষা হবে যা calculateTax()রিফ্যাক্টরিংয়ের আগে মূলতে কাজ করে ।

উদা:

calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}    
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}

calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}   
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){} 

calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}

রিফ্যাক্টরিংয়ের পরে আমার একটি কারখানা ক্লাস NameHandlerFactoryএবং কমপক্ষে 3 টি বাস্তবায়ন হবে InameHandler

আমি কীভাবে আমার পরীক্ষাগুলি রিফ্যাক্টর করতে পারি? আমি claculateTax()থেকে ইউনিট পরীক্ষা মুছে ফেলা উচিত EmployeeTestsএবং প্রতিটি বাস্তবায়নের জন্য একটি টেস্ট ক্লাস তৈরি করা উচিত InameHandler?

আমারও কি ফ্যাক্টরি ক্লাস পরীক্ষা করা উচিত?

উত্তর:


6

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

প্রতিটি স্বতন্ত্র কেসগুলির (এই মুহুর্তে doSomethingএট আল প্রয়োগ করা হয় ) অবশ্যই তাদের নিজস্ব পরীক্ষা-নিরীক্ষা করতে হবে, যা প্রতিটি বাস্তবায়ন সম্পর্কিত অভ্যন্তরীণ বিবরণ এবং বিশেষ ক্ষেত্রে পরীক্ষা করে। নতুন সেটআপে এই পরীক্ষাগুলি সংশ্লিষ্ট কৌশল শ্রেণীর সরাসরি পরীক্ষায় রূপান্তর করতে পারে / করা উচিত।

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

হালনাগাদ

calculateTax(আসুন তাদের উচ্চ স্তরের পরীক্ষাগুলি বলুন ) এবং পৃথক গণনা কৌশলগুলির জন্য নিম্ন স্তরের পরীক্ষাগুলির পরীক্ষার মধ্যে কিছু নকল থাকতে পারে - এটি আপনার বাস্তবায়নের উপর নির্ভর করে।

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

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

আমারও কি ফ্যাক্টরি ক্লাস পরীক্ষা করা উচিত?

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


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

@ সংগো, আমার আপডেট দেখুন।
প্যাটার টারিক

5

আমি এই কথাটি বলতে শুরু করব যে আমি টিডিডি বা ইউনিট পরীক্ষায় কোনও বিশেষজ্ঞ নই, তবে আমি কীভাবে এটি পরীক্ষা করব (আমি সিউডোর মতো কোড ব্যবহার করব):

CalculateTaxDelegatesToNameHandler()
{
    INameHandlerFactory fakeNameHandlerFactory = Fake(INameHandlerFactory);
    INameHandler fakeNameHandler = Fake(INameHandler);

    A.Call.To(fakeNameHandlerFactory.getHandler("John")).Returns(fakeNameHandler);

    Employee employee = new Employee(fakeNameHandlerFactory);
    employee.CalculateTax("John");

    Assert.That.WasCalled(fakeNameHandler.calculateTax());
}

সুতরাং আমি পরীক্ষা করে দেখছি যে calculateTax()কর্মচারী শ্রেণির পদ্ধতিটি তার NameHandlerFactoryজন্য সঠিকভাবে জিজ্ঞাসা করে NameHandlerএবং তারপরে calculateTax()ফিরে আসা পদ্ধতির কল করে NameHandler


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

হ্যাঁ, আমি তাই করতাম। আমি প্রকৃতপক্ষে নেমহ্যান্ডলারফ্যাক্টরি এবং নেমহ্যান্ডলারটির জন্য পৃথক পরীক্ষা লিখব। আপনার যখন এটি থাকে, Employee.calculateTax()পদ্ধতিতে আবার তাদের কার্যকারিতা পরীক্ষা করার কোনও কারণ নেই । আপনি কোনও নতুন নেমহ্যান্ডলার পরিচয় করানোর সময় আপনাকে অতিরিক্ত কর্মচারী-পরীক্ষা যুক্ত করার দরকার নেই।
ক্রিস্টফ ক্লেস

3

আপনি একটি শ্রেণি নিচ্ছেন (কর্মচারী যা সব কিছু করেন) এবং 3 টি শ্রেণির ক্লাস তৈরি করছেন: কারখানা, কর্মচারী (যেটিতে কেবল একটি কৌশল রয়েছে) এবং কৌশলগুলি।

সুতরাং পরীক্ষার 3 টি গ্রুপ করুন:

  1. বিচ্ছিন্নভাবে কারখানাটি পরীক্ষা করুন। এটি কি ইনপুটগুলি সঠিকভাবে পরিচালনা করে? অজানা পাস করলে কী হয়?
  2. কর্মচারীকে বিচ্ছিন্নভাবে পরীক্ষা করুন। আপনি কি একটি স্বেচ্ছাসেবী কৌশল সেট করতে পারেন এবং এটি আপনার প্রত্যাশার মতো কাজ করে? কৌশল বা কারখানার সেট না থাকলে কী হয়? (যদি কোডে এটি সম্ভব হয়)
  3. বিচ্ছিন্নতার কৌশলগুলি পরীক্ষা করুন। প্রত্যেকটি আপনার প্রত্যাশার কৌশলটি সম্পাদন করে? তারা কি অবিচ্ছিন্নভাবে বাউন্ডারি ইনপুটগুলি পরিচালনা করে?

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


2

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

আমি একটি কারখানা বাস্তবায়ন করব এবং প্রতিটি বাস্তবায়নের জন্য একটি পরীক্ষা এবং অবশেষে বাস্তবায়নগুলি সেই পরীক্ষাগুলির জন্য নিজেরাই চালিয়ে যাব।

শেষ পর্যন্ত আমি পুরানো পরীক্ষা মুছে ফেলতাম।


2

আমার অভিমত হল আপনার কিছুই করা উচিত নয়, এর অর্থ আপনার কোনও নতুন পরীক্ষা যুক্ত করা উচিত নয়।

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

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

চাচা ববের একটি দুর্দান্ত পোস্ট রয়েছে , যা টিডিডি ব্যবহার করার সময় এই সমস্যাটি সম্পর্কে ঠিক কথা বলে।

আমি মনে করি যে প্রতিটি পৃথক শ্রেণির পরীক্ষার প্রবণতা হ'ল এটিই টিডিডি মারছে। টিডিডির পুরো সৌন্দর্যটি হ'ল আপনি ডিজাইন স্কিমগুলিকে উত্সাহিত করার জন্য পরীক্ষাগুলি ব্যবহার করেন এবং বিপরীতে নয়।

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