আমি ইউনিট আমার ক্লাস পরীক্ষা করেছি, এখন আমি কীভাবে একটি ইন্টিগ্রেশন পরীক্ষা দিয়ে শুরু করব?


19

আমি একটি ক্লাস লিখেছি যা মেলচিম্প তালিকায় প্রাপকদের পরিচালনা করে, তাকে মেলচিম্পরিসিপিয়েন্ট বলে। এটি এমসিএপিআই ক্লাস ব্যবহার করে, যা তৃতীয় পক্ষের এপিআই র‌্যাপার।

http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/

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

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

আমি যা লিখেছি তা আমি একীকরণ পরীক্ষা বলে লিখেছি, যা মূলত পরীক্ষাগুলি পুনরায় বস্তুর সার্বজনীন ইন্টারফেসের পুনরুদ্ধার করে, যেমন:

public function testAddedRecipientCanBeFound()
{
    $emailAddress = 'fred@fredsdomain.com';
    $forename = 'Fred';
    $surname = 'Smith';

    // First, delete the email address if it is already on the list
    $oldRecipient = $this->createRecipient();
    if($oldRecipient->find($emailAddress))
    {
        $oldRecipient->delete();
    }
    unset($oldRecipient);

    // Add the recipient using the test data
    $newRecipient = $this->createRecipient();
    $newRecipient->setForename($forename);
    $newRecipient->setSurname($surname);
    $newRecipient->setEmailAddress($emailAddress);
    $newRecipient->add();
    unset($newRecipient);

    // Assert that the recipient can be found using the same email address
    $this->assertTrue($this->_recipient->find($emailAddress));
}

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

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

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

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


4
আমি মনে করি আপনার পরীক্ষায় আপনার অনেক যুক্তি রয়েছে। আপনি দৃsert়তা না করা পর্যন্ত আপনি প্রচুর কোড চালান। আপনি সম্ভবত প্রথমে কোনও প্রাপকের মুছে ফেলার পরীক্ষা করতে চান। কিন্তু এটি আপনার প্রশ্নের উত্তর দিচ্ছে না, কেবল একটি মন্তব্য।
হ্যাক্রে

1
ভাল setUpআপনার পরীক্ষা চালানোর জন্য ভিত্তি স্থাপনের জন্য ফাংশনটি ব্যবহার করা উচিত । যদি ইনপুটটি সংজ্ঞায়িত হয় তবে ভাল আপনি সত্যিই পরীক্ষা করতে পারবেন না। ইনপুটটি সুনির্দিষ্ট, কঠোর এবং সর্বদা একই হওয়া দরকার। যদি কোনও পরীক্ষার পূর্ব শর্ত পূরণ না হয় তবে পরিবর্তে পরীক্ষাটি এড়িয়ে যান। তারপরে বিশ্লেষণ করুন কেন এটি এড়িয়ে যায় এবং আপনার যদি অতিরিক্ত পরীক্ষা যুক্ত করতে হয় এবং / অথবা এটি সঠিকভাবে করা setUpহয় না।
হ্যাক্রে

1
এটি সম্ভবত নিজস্ব পরীক্ষার অভ্যন্তরে হার্ডকোড পরীক্ষার মানগুলি নাও কিন্তু সেই শ্রেণীর সদস্যদের তৈরি করুন যাতে তারা পরীক্ষাগুলি ভাগ করে নেওয়া যায় (এবং কেন্দ্রীয় জায়গায় পরিবর্তিত হয়) বা ব্যবহার করুন DataProvider(এটি কোনও পরীক্ষার পরামিতি হিসাবে ইনপুট সরবরাহ করে এমন একটি ফাংশন)।
হ্যাক্রে

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

1
ভাল প্রশ্নের জন্য +1, তবে প্রোগ্রামারগুলিতে স্থানান্তরিত করার পক্ষেও ভোট দিয়েছেন। দেখে মনে হচ্ছে যে পরীক্ষার কৌশলগুলি নিয়ে প্রশ্নগুলিই অন্তর্ভুক্ত
গর্ডনএম

উত্তর:


17

আপনার কোডটি পরীক্ষা করার সময় আপনার তিনটি ক্ষেত্রে মনোযোগ দেওয়া উচিত:

  • পরিস্থিতি পরীক্ষা করা
  • কার্যকরী পরীক্ষা
  • অংশ পরিক্ষাকরণ

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

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

ইউনিট পরীক্ষার মাধ্যমে আপনি সমস্ত সম্ভাবনা পরীক্ষা করেন, তাই কেবল 'সুখী পথ' নয় সমস্ত ত্রুটির শর্তও।

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

উদাহরণস্বরূপ, ধরুন আপনি একটি গাড়ী পরীক্ষা করছেন।

আপনি পুরো গাড়িটি একত্র করতে এবং ড্রাইভার হিসাবে প্রতিটি সম্ভাব্য শর্ত পরীক্ষা করতে পারেন তবে এটি করা সত্যিই কঠিন।

পরিবর্তে আপনি সমস্ত সম্ভাবনা (ইউনিট পরীক্ষা) সহ ইঞ্জিনের একটি ছোট অংশ পরীক্ষা করে দেখবেন

তারপরে আপনি পুরো ইঞ্জিনটি পরীক্ষা করুন (গাড়ি থেকে পৃথক) যা কার্যকরী পরীক্ষা হবে।

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

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

আরও কয়েকটি বিষয়,

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

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

1
হ্যাঁ! আমি বুঝতে পেরেছি আপনি ইতিমধ্যে ইউনিট পরীক্ষা করেছেন। এমসিএপিআই অবজেক্টটি কি প্রাপকদের ট্র্যাক রাখে এবং আপনার যে ক্লিনআপটি করতে হবে তা কি? যদি এটি তৃতীয় পক্ষগুলির 'সমস্যা' হয় তবে ইন্টিগ্রেশন পরীক্ষায় আপনি কিছুই করতে পারবেন না। আপনি যদি অন্য তালিকার তালিক রাখেন তবে পরীক্ষা করে একে অপরকে প্রভাবিত না করে তা নিশ্চিত করার জন্য আপনি বৈশ্বিক ডেটা (এবং সিঙ্গেলন) এড়িয়ে চলেছেন তা নিশ্চিত করা উচিত। নিখুঁত বিশ্বে, যখন পরীক্ষা শুরু / শেষ হয় তখন জিনিসগুলি পরিষ্কার করা একটি নকশার ত্রুটির দিকে নির্দেশ করে তবে বাস্তব বিশ্বে আপনি সর্বদা এড়াতে পারবেন না।
ওয়াউটার ডি কর্ট

1
আমি যুক্ত করব যে দৃশ্যের পরীক্ষার সম্ভবত PHPUnit উপযুক্ত কিছু নয় to আপনি হয়ত সেলেনিয়ামের মতো ব্রাউজারে চালাতে পারেন এমন কোনও সরঞ্জাম বা জে মিটারের মতো ব্রাউজারের অনুকরণ করতে পারে এমন একটি সরঞ্জামের দিকে নজর দিতে পারেন।
গর্ডনএম

ধন্যবাদ বন্ধুরা! ভাল টেস্টেবল কোড লেখার বিষয়টি নিশ্চিত করার জন্য অনেক কিছুই আছে, সেখানে নেই। আমি নিজেকে এই বইয়ের একটি অনুলিপি অর্ডার করেছি: amazon.co.uk/… । আশা করি, আপনি যা বলেছেন তা আমার পড়ার পরে কিছুটা আরও অর্থবোধ করবে। @ বাউটার, আমি কেবলমাত্র একজন প্রাপককে মুছে ফেলছি কারণ পরীক্ষার ফলে ইমেল ঠিকানাটি তালিকায় যুক্ত হতে পারে। আমি এটিকে মুছে ফেলছি যাতে তালিকাটি সেই পরীক্ষার দ্বারা প্রভাবিত না হয়।

1
@LewisBassett আমি কোন পিএইচপি ডেভেলপার নই কিন্তু xUnit টেস্ট ধরন ( amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 ) স্পষ্টভাবে একটি ভাল পঠিত। এছাড়াও মিসকো.হেভারি.কম / কোড / রিভিউয়ার্স-গাইডের নিবন্ধগুলি সত্যই আকর্ষণীয়।
ওয়াউটার ডি কর্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.