কোন ধরণের ফাংশন এবং / বা ক্লাস ইউনিট পরীক্ষা করা অসম্ভব এবং কেন


21

ভাল ইউনিট পরীক্ষা না করানোর জন্য বিকাশকারীর মূল অজুহাত হ'ল কোডটি ইউনিট পরীক্ষামূলক ফ্যাশনে ডিজাইন করা হয়নি। আমি কী ধরণের ডিজাইন এবং কোড যা ইউনিট পরীক্ষা করা যায় না তা বোঝার চেষ্টা করছি।


2
তোমার অজুহাত? একজন সহকর্মী? পরিচালকের? আপনি কোন ভাষা / ফ্রেমওয়ার্কের সাথে কাজ করছেন?

1
অ্যাপ্লিকেশনটিতে প্রচুর লিগ্যাসি কোড এবং পুনরায় নকশার সময় নেই।
নট

4
@gnat: আমি একমত নই আপনি যে প্রশ্নটি উদ্ধৃত করেছেন তা হ'ল পরিস্থিতি সম্পর্কে যা ইউনিট পরীক্ষাগুলি কার্যকর নয় not বর্তমান প্রশ্ন পরিস্থিতি সম্পর্কে যা ইউনিট পরীক্ষাগুলি রেন্ডারকে কঠিন করে তোলে।
আর্সেনি মরজেনকো

@ মাইনমা ​​দৃশ্যত আমরা বিভিন্ন প্রশ্ন পড়েছি। "আমি কী ধরণের ডিজাইন এবং কোড যা ইউনিট পরীক্ষা করা যায় না তা বোঝার চেষ্টা করছি" " => "ইউনিট পরীক্ষা না করাই কখন উপযুক্ত?"
gnat

1
@ মানিজজ: আপনি প্রশ্নটিতে এডিট করতে চাইতে পারেন।
jmoreno

উত্তর:


27

একক পরীক্ষায় কোডটি বেশ কয়েকটি কারণকে জটিল করে তুলতে পারে। যখন এটি হয়, রিফ্যাক্টরিং এটি পরীক্ষামূলক হওয়ার জন্য কোডটি উন্নত করতে সহায়তা করে।

কোডের কয়েকটি উদাহরণ যা সম্ভবত পরীক্ষা করা কঠিন হবে:

  • একটি 1000-এলওসি ফাংশন,
  • কোড যা ভারীভাবে বিশ্বরাষ্ট্রের উপর নির্ভর করে,
  • কোড যা কংক্রিটের প্রয়োজন, ইন্টারফেস এবং ডিপেন্ডেন্সি ইনজেকশনের উপর নির্ভর না করে ডাটাবেস প্রসঙ্গের মতো অবজেক্ট তৈরি করতে জটিল,
  • কোড যা ধীরে ধীরে সম্পাদন করে ,
  • স্প্যাগেটি কোড,
  • পাঠযোগ্যতা বা রক্ষণাবেক্ষণের কোনও যত্ন ছাড়াই বছরের পর বছর যাচাই করা হয়েছিল লিগ্যাসি কোড,
  • কোড বোঝার পক্ষে জটিল যা লেখকের মূল উদ্দেশ্য সম্পর্কে কোনও মন্তব্য বা ইঙ্গিত নেই (উদাহরণস্বরূপ এমন কোড যা ভেরিয়েবলের নাম ব্যবহার করে যেমন function pGetDp_U(int i, int i2, string sText)

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


8
এছাড়াও কোডটি পরীক্ষা করা শক্ত যা খাঁটি ফাংশনগুলির উপর নির্ভরতা ইনজেক্ট করে না, যেমন এলোমেলো সংখ্যা, বর্তমান সময়, হার্ড-ওয়্যার্ড I / O, ইত্যাদি
9000

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

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

14

এমন অনেকগুলি বিষয় রয়েছে যা কোডকে ইউনিট পরীক্ষা করা কঠিন করে তোলে। কাকতালীয়ভাবে এর মধ্যে অনেকগুলি কোড বজায় রাখা কঠিন করে তোলে:

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

আমি মনে করি এটি একটি দুর্দান্ত উত্তর। আপনি অনেকগুলি কোড স্তরের সমস্যাগুলি এবং বিশ্বব্যাপী রাষ্ট্রের সমস্যাগুলিতে স্পর্শ করেন। @ মাইনামার আরও কিছু সমস্যা রয়েছে যা আমি মনে করি বৈধ, তবে কম সংজ্ঞায়িত। জেফারি থমাস I / O এবং UI এর উল্লেখ করেছেন। আমি মনে করি আপনি যদি এই তিনটি উত্তরের ভাল অংশ যুক্ত করেন তবে আপনার দুর্দান্ত একাত্মক প্রতিক্রিয়া হবে। কোড এন্টিপ্যাটার্নগুলিতে ফোকাস করার কারণে আমার এই উত্তরটি সবচেয়ে ভাল লেগেছে।
এম 2 টি এম

1
আরগ - ব্যবসায়ের প্রয়োজনীয়তার সাথে সাদৃশ্য নেই এবং ইউনিট পরীক্ষার দৃ worse় প্রতিবেদনের চেয়ে খারাপ আর কিছুই নয় - নির্দিষ্ট সময়ে কেবলমাত্র আউটপুট - উদাহরণস্বরূপ 3 বার বলা যেতে পারে এমন উপহাসগুলি? 3 কেন? কারণ এটি 3 প্রথমবারের মতো পরীক্ষাটি চালানো / চালানো হয়েছিল :)
মাইকেল

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

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

5

কোডের সাধারণ উদাহরণগুলি ইউনিট পরীক্ষায় যেতে চায় না:

  • কোড যা আই / ও (সরাসরি ফাইল, সরাসরি নেটওয়ার্ক কল,…) এর সাথে ইন্টারঅ্যাক্ট করে।
  • কোড যা সরাসরি ইউআই আপডেট করে।
  • কোড যা সরাসরি সিলেটলেট বা গ্লোবাল অবজেক্টের রেফারেন্স করে।
  • কোড যা স্পষ্টভাবে অবজেক্ট বা সাব-অবজেক্টের স্থিতি পরিবর্তন করে।

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

যে জিনিসগুলি সত্যই ইউনিট পরীক্ষা করা যায় না:

  • অসীম লুপস (কোনও থ্রেড ম্যানেজার, ড্রাইভার বা অন্য কোনও ধরণের দীর্ঘ চলমান কোডের জন্য)
  • কিছু নির্দিষ্ট ধরণের সরাসরি সমাবেশ পরিচালনা (যা কিছু ভাষায় সমর্থন করে)
  • কোডে বিশেষায়িত অ্যাক্সেস প্রয়োজন (অসম্ভব নয়, কেবল একটি ভাল ধারণা নয়)

2

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

দুর্বলভাবে ডিজাইন করা কোড লেখা

  • অনুপযুক্ত সংযুক্তকরণ (সাধারণত আঁট সংযোগ যেখানে এটি হওয়া উচিত নয়)
  • রান্নাঘর সিঙ্ক কোড (যেখানে কোনও ফাংশনে অনেক বেশি যুক্তি / দায়িত্ব রয়েছে)

রাষ্ট্রের রিলায়েন্স অন্য ক্ষেত্রে scope

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

  • Singletons
  • Globals
  • বন্ধ

বাহ্যিক / সিস্টেমের অবস্থা

  • হার্ডওয়্যার / ডিভাইস নির্ভরতা
  • নেটওয়ার্ক নির্ভরতা
  • ফাইল সিস্টেম নির্ভরতা
  • আন্ত-প্রক্রিয়া নির্ভরতা
  • অন্যান্য সিস্টেম কল নির্ভরতা

concurrency

  • থ্রেডিং (তালা, সমালোচনা বিভাগ, ইত্যাদি)
  • fork'ing
  • Coroutines
  • ব্যাকগুলিকে কল করুন
  • সিগন্যাল হ্যান্ডলার (সমস্ত না, তবে কিছু)

2

কোড বলে কোনও জিনিস নেই যা পরীক্ষা করা যায় না। তবে কোডের কয়েকটি উদাহরণ রয়েছে যা সত্যই পরীক্ষা করা সত্যিই কঠিন (সম্ভবত চেষ্টাটির পক্ষে উপযুক্ত নয়) এর জন্য:

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

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


0

এর জন্য আমার প্রধান তিনটি গ্রুপ হ'ল:

  • বাহ্যিক পরিষেবাগুলির উপর নির্ভর করে এমন কোড

  • এমন সিস্টেমগুলি যা পরীক্ষকদের আবেদনের স্বাধীনভাবে রাষ্ট্র পরিবর্তন করতে দেয় না।

  • পরীক্ষার পরিবেশগুলি যা উত্পাদন সেটআপটিকে প্রতিলিপি করে না।

বিকাশকারী কিউএ ইঞ্জিনিয়ার হিসাবে এটিই আমি সবচেয়ে বেশি অভিজ্ঞ।

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