ইউনিট টেস্টিং - শুরু হচ্ছে


14

আমি সবেমাত্র ইউনিট টেস্টিং দিয়ে শুরু করছি তবে আমি নিশ্চিত না যে আমি সত্যিই এটির সমস্ত বিষয় বুঝতে পেরেছি কিনা। আমি এগুলি সম্পর্কে টিউটোরিয়াল এবং বইগুলি পড়েছি, তবে আমার কাছে কেবল দুটি দ্রুত প্রশ্ন রয়েছে:

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

  2. আমাদের কোডগুলির বেশিরভাগই বাহ্যিক উত্সগুলিতে নির্ভর করে। আমাদের কোডটি রিফ্যাক্ট করার পরে, এমনকি এটি মূল কোডটি ভেঙে দেবে, আমাদের পরীক্ষাগুলি এখনও ঠিক জরিমানা চলবে, যেহেতু বাহ্যিক উত্সগুলি আমাদের পরীক্ষার ক্ষেত্রে কেবল ম্যাক-আপস। এটি ইউনিট পরীক্ষার উদ্দেশ্যকে পরাজিত করে না?

দুঃখিত যদি আমি এখানে বোবা শব্দ করি তবে আমার মনে হয়েছিল কেউ আমাকে কিছুটা আলোকিত করতে পারে।

আগাম ধন্যবাদ.

উত্তর:


7

আমার 0.02 $ ... এটি কিছুটা সাবজেক্টিভ, সুতরাং লবণের এক দানা নিয়ে নিন, তবে আশা করি এটি আপনাকে ভাবতে এবং / অথবা কিছু কথোপকথন সঞ্চার করবে:

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

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

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

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

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


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

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

    - ইউনিট পরীক্ষার আর্ট

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


1

একটি ভাল প্রশ্ন জিজ্ঞাসা কোনওভাবেই বোবা নয়।

আমি আপনার প্রশ্নের সমাধান করব।

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

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

    এখানে একটি উদাহরণ:

    TEST(MyTest, TwoPlusTwoIsFour) {
        ASSERT_EQ(4, 2+2);
    }
    
    TEST(MyTest, TwoPlusThreeIsntFour) {
        ASSERT_NE(4, 2+3);
    }
    

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

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


1

দেখে মনে হচ্ছে আপনার কাছে একরকম অ্যাপ রয়েছে যা void main()ডাটাবেস অ্যাক্সেস থেকে শুরু করে আউটপুট জেনারেশন পর্যন্ত সমস্ত কিছু করে। আপনি যথাযথ ইউনিট পরীক্ষা শুরু করার আগে এখানে বেশ কয়েকটি পদক্ষেপ রয়েছে।

1) একাধিকবার লিখিত / অনুলিপিযুক্ত কোডের একটি টুকরো সন্ধান করুন। এমনকি যদি এটি ঠিক হয় string fullName = firstName + " " + lastName। এটিকে কোনও পদ্ধতিতে ভাঙ্গুন, যেমন:

private static string GetFullName (firstName, lastName)
{
    return firstName + " " + lastName;
}

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

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


0

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

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