নির্ভরতা ইনজেকশন ইউনিট পরীক্ষার জন্য প্রয়োজনীয়?


55

ব্যবহার করছে নির্ভরতা ইনজেকশন ইউনিট পরীক্ষার জন্য (ডিআই) অপরিহার্য?

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


5
নির্ভরতা ইনজেকশন অপরিহার্য নয়, তবে বিপরীত নিয়ন্ত্রণের বিস্তৃত ধারণাটি is
জেরেমি হিলার

এখানে স্কেলের জন্য কিছু বলার আছে। আমার যদি খুব কম স্তর সহ একটি ছোট কোড বেস থাকে তবে ডিআই কার্যকর নাও হতে পারে।
জেবি কিং

@ জেবিকিং যদি আপনার একটি ছোট কোড বেস থাকে তবে আপনার স্তর বা ইউনিট পরীক্ষার দরকার নেই
Sklivvz

1
আপনার কোডটিকে টেস্টেবল করার জন্য প্রচুর ডিজাইনের সিদ্ধান্ত নেওয়া দরকার। পরীক্ষা লিখতে শুরু করুন এবং খুঁজে বের করুন।
নাথান কুপার

উত্তর:


42

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

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

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

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


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

@ ক্যামোদা উদাহরণস্বরূপ কি?
BЈовић

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

@ কেমোদা মনে হচ্ছে আপনি ফাংশনাল প্রোগ্রামিং বর্ণনা করছেন, এবং আপনি ডিআই ব্যবহার করছেন। আপনি পদ্ধতির পরামিতি হিসাবে আপনার নির্ভরতা ইনজেকশন দিচ্ছেন।
এরিক ডায়েটারিচ

3
@ হুগি, বাস্তবায়ন বিশদ এখানে কেন ফাঁস হবে? ইনজেকশনের উপর নির্ভরশীলতা সাধারণত একটি ইন্টারফেসের আড়ালে লুকানো থাকে এবং পুরো বিষয়টি হ'ল ক্লায়েন্ট শ্রেণি সম্পর্কে কোনও ধারণা নেই - এবং এর সাথে উদ্বিগ্ন নয় - এই নির্ভরতার প্রকৃত বাস্তবায়ন কি আসল উত্পাদন শ্রেণি বা একটি উপহাস। এর ইনস্ট্যান্টেশন ক্লায়েন্ট শ্রেণীর বাইরে ঘটে, এটি কেবল প্রস্তুত-দৃষ্টিকোণটি দেখতে পায়।
প্যাটার তারেক

56

ইউনিট পরীক্ষার জন্য ডিকপলিং অপরিহার্য। ডিও হ'ল ডিওপলিং অর্জনের দুর্দান্ত উপায়।


17
একটি খুব সত্য বিবৃতি যা কোনওভাবেই প্রশ্নের উত্তর দেয় না।
ট্র্যাভিস

10

আপনি যে প্রযুক্তি ব্যবহার করছেন তার উপর নির্ভর করে আপনি ডিআই ব্যবহার না করে নির্ভরতা বিচ্ছিন্ন করতে পারেন। উদাহরণস্বরূপ ,। নেট নেট ওয়ার্ল্ডে মোলস আপনাকে ডিআই প্যাটার্ন ছাড়াই নির্ভরতা আলাদা করতে দেয়।

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

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


3
বা মোলস আপনাকে ভাবতে দেয় যে আপনি পরিষ্কার, ভাল মানের টেস্টেবল কোড পেয়েছেন কারণ আপনি যাদুবিদ্যার মাধ্যমে পরীক্ষা করছেন।
ওয়াট বার্নেট

@ ওয়াটবার্নেট হ্যাঁ, খুব সত্য। "কাউকে এই বহুপদীতা এবং খোলা / বন্ধ স্টাফগুলি দরকার, যাইহোক, বলার জন্য কাউকে বলার দক্ষতা রয়েছে মোলসকে?
এরিক ডায়েটারিচ

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

1
@ সাইন করুন আপনার লিঙ্কটি আরও বলেছে, "জালযুক্ত ধরণের অ-ভার্চুয়াল এবং স্ট্যাটিক পদ্ধতিগুলি সহ যে কোনও .NET পদ্ধতিতে শিম দেওয়ার জন্য নকল কাঠামো ব্যবহার করা যেতে পারে" " বিচ্ছিন্ন ফ্রেমওয়ার্কগুলি ডিআইয়ের সাথে একত্রে ব্যবহৃত হতে পারে তার অর্থ এই নয় যে তারা ডিআই are
এরিক ডায়েটারিচ

4

না, ইউনিট পরীক্ষার জন্য ডিআই প্রয়োজনীয় নয়, তবে এটি অনেক সাহায্য করে।

আপনি কারখানার বা লোকেটারগুলি ব্যবহার করতে পারেন এবং ডিআইয়ের সাথে যেমন পরীক্ষা করতে পারেন (ঠিক মার্জিত হিসাবে নয় এবং আরও সেটআপের প্রয়োজন হবে)।

এছাড়াও, লিগ্যাসি সিস্টেমগুলিতে মক অবজেক্টগুলি গুরুত্বপূর্ণ হবে যেখানে অনেকগুলি কল নির্ভরতার পরিবর্তে ফাংশনগুলিতে প্রেরণ করা হয়। (মক অবজেক্টগুলি যথাযথ সেটআপেও ব্যাপকভাবে ব্যবহার করা যেতে পারে)

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


3

না , নির্ভরতা ইঞ্জেকশন ইউনিট পরীক্ষার জন্য প্রয়োজনীয় নয়।

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

উদাহরণ (ডিআই ব্যবহার করে) এই বাস্তবায়নটি কর্মচারী, অ্যাকাউন্ট, ...

 bool hasPermissionToTransferMoney(Employee employee, Account from, Account to, Money amount)
 {
     if (amount > 100 && employee.isStudent())
        return false;
     if (to.getOwner().getFamiliyName() == employee.getFamilyName() && ...
        return false; // cannot transfer money to himself;
     ...
 }

ডেটা সংগ্রহ এবং গণনার বিচ্ছিন্নতার পরে:

 bool hasPermissionToTransferMoney(Employee employee, Account from, Account to, Money amount)
 {
     return hasPermissionToTransferMoney(employee.isStudent(), employee.getFamilyName(), to.getOwner().getFamilyName(), ...);
 }

 // the actual permission calculation
 static bool hasPermissionToTransferMoney(boolean isStudent, string employeeFamilyName, string receiverFamilyName, ...)
     if (amount > 100 && isStudent)
        return false;
     if (receiverFamilyName == employeeFamiliyName && ...
        return false; // cannot transfer money to himself
     ...
 }

নির্ভরতার ইনজেকশন ছাড়াই গণনার অংশটি সহজেই পরীক্ষা করা যায়।


1
  • নির্ভরতা ইঞ্জেকশন ইউনিট পরীক্ষার জন্য প্রয়োজনীয় নয়

  • আপনি অন্যের জন্য একটি বাস্তবায়ন অদলবদল করতে চান যখন অন্যদিকে নিয়ন্ত্রণের বিপরীতমুখী হওয়া আবশ্যক।


0

হ্যাঁ, বিচ্ছিন্নতার জন্য ডিআই ব্যবহারের বিকল্প রয়েছে।

একটি বিকল্প হ'ল কারখানা বা একটি সার্ভিস লোকেটার ব্যবহার করা যা পরীক্ষাগুলি থেকে বাস্তবের পরিবর্তে মক অবজেক্টগুলি ফেরত পাঠাতে কনফিগার করা যায়।

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

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