আমার ইউনিটগুলি আমার সাবক্লাসগুলি বা আমার বিমূর্ত অভিভাবক শ্রেণির পরীক্ষা করা উচিত?


12

কার্যকর জাভা ( এখানে বর্ধিত আলোচনা ) থেকে আইটেম 18 এর মতো আমার একটি কঙ্কালের বাস্তবায়ন রয়েছে । এটি একটি বিমূর্ত শ্রেণি যা 2 টি পাবলিক মেথড মেথডএ () এবং মেথডবি () সরবরাহ করে যা "শূন্যস্থান পূরণ করতে" সাবক্লাসের পদ্ধতিগুলি কল করে যা আমি কোনও বিমূর্ত পদ্ধতিতে সংজ্ঞা দিতে পারি না।

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

সময় কেটে গেছে এবং এখন আমার 4 টি সাবক্লাস রয়েছে, প্রতিটি বাস্তবায়নকারী 3 স্বল্প সুরক্ষিত পদ্ধতি যা তাদের কংক্রিট বাস্তবায়নের জন্য খুব নির্দিষ্ট, যখন কঙ্কালের বাস্তবায়ন সমস্ত জেনেরিক কাজ করে।

আমার সমস্যাটি হ'ল আমি যখন একটি নতুন বাস্তবায়ন তৈরি করি তখন আমি আবার পরীক্ষাগুলি লিখি:

  • সাবক্লাস একটি প্রদত্ত প্রয়োজনীয় পদ্ধতি কল করে?
  • একটি প্রদত্ত পদ্ধতিতে কি কোনও টিকা আছে?
  • আমি কী পদ্ধতিটি থেকে প্রত্যাশিত ফলাফল পাব?
  • আমি কী পদ্ধতি বি থেকে প্রত্যাশিত ফলাফল পাব?

এই পদ্ধতির সাথে সুবিধাগুলি দেখুন:

  • এটি পরীক্ষার মাধ্যমে সাবক্লাসের প্রয়োজনীয়তা দলিল করে
  • সমস্যাযুক্ত রিফ্যাক্টরিংয়ের ক্ষেত্রে এটি দ্রুত ব্যর্থ হতে পারে
  • সামগ্রিকভাবে এবং তাদের সর্বজনীন এপিআইয়ের মাধ্যমে সাবক্লাসটি পরীক্ষা করুন ("পদ্ধতিটি () কী কাজ করে?" এবং না "এই সুরক্ষিত পদ্ধতিটি কি কাজ করে?")

আমার সমস্যাটি হ'ল নতুন সাবক্লাসের পরীক্ষাগুলি মূলত একটি নো-ব্রেইনার: - পরীক্ষাগুলি সমস্ত সাবক্লাসে একই রকম হয়, তারা কেবল পদ্ধতিগুলির রিটার্নের ধরণের পরিবর্তন করে (কঙ্কালের বাস্তবায়ন জেনেরিক) এবং বৈশিষ্ট্যগুলি I পরীক্ষার দৃsert় অংশটি পরীক্ষা করুন। - সাধারণত সাবক্লাসগুলির জন্য নির্দিষ্ট কোনও পরীক্ষা থাকে না

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

শ্রেণি শ্রেণিবিন্যাস পরীক্ষা করার সময় এই সমস্যাটি কি সাধারণ? আমি কীভাবে এড়াতে পারি?

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

PS2: আমি googled এবং বিষয় সম্পর্কে অনেক প্রশ্ন খুঁজে পেয়েছি। এর মধ্যে একটি হ'ল এটি যা নাইজেল থর্নের দুর্দান্ত উত্তর রয়েছে , আমার কেসটি হবে তার "নম্বর 1" be এটি দুর্দান্ত হবে তবে আমি এই মুহুর্তে রিফ্যাক্টর করতে পারি না, তাই এই সমস্যাটি নিয়ে আমাকে বাঁচতে হবে। আমি যদি রিফ্যাক্টর করতে পারি তবে কৌশল হিসাবে আমার প্রতিটি উপক্লাস থাকবে। এটি ঠিক আছে, তবে আমি "মেইন ক্লাস" পরীক্ষা করে কৌশলগুলি পরীক্ষা করে দেখব তবে আমি কোনও রিফ্যাক্টরিং লক্ষ্য করব না যা মূল শ্রেণি এবং কৌশলগুলির মধ্যে সংহতিকে ভেঙে দেয়।

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


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

আমি কোথাও পড়েছি যে পরীক্ষার ক্ষেত্রে উত্তরাধিকার ব্যবহার করা উচিত নয়, আমি উত্সটি এটি মনোযোগ সহকারে পড়ার জন্য খুঁজছি
জেএসব্যাচ

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

উত্তর:


5

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

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


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

4

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

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

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

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