ইউনিট পরীক্ষার জন্য মৃত্যুদণ্ড কার্যকর করার আদেশ প্রয়োগ করা কি খারাপ অভ্যাস?


84

আমি একাধিক সাবমডিউল নিয়ে গঠিত এমন একটি প্রকল্পের জন্য পরীক্ষা লিখছি। আমি লিখেছি এমন প্রতিটি পরীক্ষার কেস একে অপরের থেকে স্বতন্ত্র রান করে এবং আমি পরীক্ষার মধ্যে সমস্ত ডেটা সাফ করি।

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

আমি ডামি ডেটা নিয়ে কাজ করতে পারি না, যেহেতু আমি যে প্রধান কার্যকারিতাটি পরীক্ষা করে যাচ্ছি তা হ'ল একটি ব্ল্যাক বক্স রিমোট সার্ভারের সংযোগ, যা কেবলমাত্র প্রথম সাবমডিউল থেকে ডেটা পায়।

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

সম্পাদনা: প্রশ্নটি এমন যেখানে টেস্টগুলির কাঠামো কিভাবে হয় যেখানে একটি পরীক্ষা অন্য পরীক্ষার সেটআপ হয়? "পূর্ববর্তী" পরীক্ষাটি কোনও সেটআপ নয়, তবে সেটআপটি সম্পাদন করে এমন কোডটি পরীক্ষা করে।



123
আপনি যদি কোনও রিমোট সার্ভারের সাথে সংযোগটি পরীক্ষা করে থাকেন তবে সেগুলি ইউনিট পরীক্ষার পরিবর্তে সংজ্ঞায়িত' re
তেলস্তিন

9
প্রথম উত্তরটি আমাকে এখানে বিভ্রান্ত করেছে কারণ আপনার শিরোনামে আপনি বলেছিলেন "এটি কি খারাপ অভ্যাস?" এবং আপনার প্রশ্নের সংক্ষিপ্তায় আপনি লিখেছেন "এটি ঠিক আছে?" হ্যাঁ বা না হয় যে কেউ উত্তর দিচ্ছে সেগুলির মধ্যে একটিকে বিভ্রান্ত করতে চলেছে!
লিথ

8
আপনার মতামত ইন্টিগ্রেশন পরীক্ষার সেট তৈরি করছে। এমনকি সেই পরীক্ষার জন্য অন্য পরীক্ষার উপর নির্ভর করা উচিত নয়।
লো ফ্লাইং পেলিকান

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

উত্তর:


236

আমি ডামি ডেটা নিয়ে কাজ করতে পারি না, যেহেতু আমি যে প্রধান কার্যকারিতাটি পরীক্ষা করে যাচ্ছি তা হ'ল একটি ব্ল্যাক বক্স রিমোট সার্ভারের সংযোগ, যা কেবলমাত্র প্রথম সাবমডিউল থেকে ডেটা পায়।

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

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


14
কিছু পরীক্ষার বিশেষত তা পরীক্ষা করতে হবে যে রিমোট সার্ভারটি অনুপলব্ধ থাকে যখন প্রত্যাশিত আচরণ ঘটে।
আলেকজান্ডার

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

10
সমস্যা সম্ভবতঃ জুনিতের নামে "ইউনিট" রয়েছে।
থরবজর্ন রাভন অ্যান্ডারসন

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

1
@ ম্যাসনহিলার বা এমনকি অ প্রযুক্তিগত পরিচালকদের দ্বারা গ্রহণযোগ্যতা পরীক্ষার মানেও বেছে নেওয়া হয়েছে।
TKK

32

হ্যাঁ, এটি একটি খারাপ অভ্যাস।

সাধারণত, একটি ইউনিট পরীক্ষার উদ্দেশ্য কোডের একক ইউনিট (উদাহরণস্বরূপ একটি পরিচিত রাজ্যের উপর ভিত্তি করে একটি একক ফাংশন) পরীক্ষা করার উদ্দেশ্যে।

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

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


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

8
@ অটোফেজ: অবশ্যই এর সাথে একমত হন। আসলে আমি এটির সাথে এতটাই একমত যে আমি এটি একটি ফাঁদ বলে সম্মত হওয়া সত্ত্বেও নিয়মিত নিজেকে একই ফাঁদে পড়তে দেখি 😂
লাইটনেস রেস অরবিট

16

আপনার প্রস্তাবিত কার্যকর কার্যকর আদেশটি কেবল তখনই বোধগম্য হয় যদি আপনি প্রথম ব্যর্থতার পরেও পরীক্ষার রান বাতিল করে দেন।

প্রথম ব্যর্থতায় পরীক্ষা রান বাতিল করা মানে প্রতিটি পরীক্ষার রান কেবলমাত্র একটি সমস্যা উদ্ঘাটিত করতে পারে এবং পূর্ববর্তী সমস্ত সমস্যা সমাধান না হওয়া পর্যন্ত এটি নতুন সমস্যা খুঁজে পাবে না। যদি প্রথম পরীক্ষা চালানোয় এমন সমস্যা দেখা দেয় যা ঠিক করতে এক মাস সময় নেয়, তবে সেই মাসে কার্যকরভাবে কোনও পরীক্ষা কার্যকর করা হবে না।

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

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


7

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

ইউনিট টেস্টগুলি প্রায়শই "স্বয়ংক্রিয় পরীক্ষার", বা "কোনও প্রোগ্রামার দ্বারা স্বয়ংক্রিয় পরীক্ষার" সাথে বিভ্রান্ত হয়।

ইউনিট টেস্ট অবশ্যই ছোট, স্বতন্ত্র এবং দ্রুত হওয়া উচিত।

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

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


6

উপরে উল্লিখিত হিসাবে, আপনি যা চালাচ্ছেন তা একীকরণের পরীক্ষা বলে মনে হচ্ছে, তবে আপনি উল্লেখ করেছেন:

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

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

যেমন

যদি তোমার থাকে:

class Queries {

    int GetTheNumber() {
        var dataModule = new Submodule1();
        var data = dataModule.GetData();
        return ... run some query on data
    }
}

পরিবর্তে পছন্দ করুন:

interface DataModule {
    Data GetData();
}


class Queries {

    IDataModule _dataModule;

    ctor(IDataModule dataModule) {
       _dataModule = dataModule;
    }

    int GetTheNumber() {
        var data = _dataModule.GetData();
        return ... run some query on data
    }
}

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


6

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


2
আমি কোনও আদেশ প্রয়োগের পরিবর্তে কেন নির্দিষ্ট ইউনিট পরীক্ষা ধীরে ধীরে চলছে তা খতিয়ে দেখার ব্যাপারে আমি আরও আগ্রহী হব। ইউনিট পরীক্ষা দ্রুত হওয়ার কথা।
রবি ডি

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

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

@ মাইকহোলার তারপরে তারা ইউনিট পরীক্ষা নয়। ইউনিট পরীক্ষাগুলি কী তা নিয়ে আসলেই কোনও বিভ্রান্তি হওয়া উচিত নয় ।
রবি ডি

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