পরীক্ষার বিমূর্ত শ্রেণি কিভাবে ইউনিট করবেন: স্টাব দিয়ে প্রসারিত করবেন?


446

আমি ভাবছিলাম কীভাবে বিমূর্ত ক্লাসগুলি এবং বিমূর্ত শ্রেণির প্রসারিত ক্লাসগুলি ইউনিট করা যায়।

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

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

নোট করুন যে আমার বিমূর্ত শ্রেণিতে কিছু কংক্রিট পদ্ধতি রয়েছে।

উত্তর:


268

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

আপনার বিমূর্ত শ্রেণীর পরীক্ষা করা উচিত যাতে আপনার অন্যান্য সমস্ত শ্রেণীর মতো কিছু যুক্তি রয়েছে।


9
জঘন্য, আমাকে বলতে হবে এটি প্রথমবারের মতো আমি কোনও উপহাস ব্যবহারের ধারণার সাথে একমত হয়েছি।
জোনাথন অ্যালেন

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

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

5
ওভার-রেটেড পরবর্তী উত্তরটি আরও ভাল।
মার্টিন স্প্যামার

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

449

দুটি উপায় আছে যেখানে বিমূর্ত বেস ক্লাস ব্যবহার করা হয়।

  1. আপনি আপনার বিমূর্ত বস্তুকে বিশেষীকরণ করছেন তবে সমস্ত ক্লায়েন্টরা এর বেস ইন্টারফেসের মাধ্যমে উত্পন্ন শ্রেণিটি ব্যবহার করবে।

  2. আপনি আপনার ডিজাইনের বস্তুগুলির মধ্যে সদৃশকরণ তৈরি করার জন্য একটি বিমূর্ত বেস ক্লাস ব্যবহার করছেন এবং ক্লায়েন্টরা তাদের নিজস্ব ইন্টারফেসের মাধ্যমে কংক্রিট বাস্তবায়ন ব্যবহার করে!


1 এর জন্য সমাধান - কৌশল প্যাটার্ন

বিকল্প 1

আপনার যদি প্রথম পরিস্থিতি থাকে তবে আপনার উত্পন্ন ক্লাসগুলি বাস্তবায়ন করছে এমন বিমূর্ত শ্রেণিতে ভার্চুয়াল পদ্ধতি দ্বারা সংজ্ঞায়িত আপনার কাছে আসলে একটি ইন্টারফেস রয়েছে।

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

IMotor

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


সমাধান 2

আপনার যদি দ্বিতীয় পরিস্থিতি থাকে তবে আপনার বিমূর্ত শ্রেণি সহায়ক সহায়ক শ্রেণি হিসাবে কাজ করছে।

AbstractHelper

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

মোটর সহায়ক

এটি আবার কংক্রিট শ্রেণীর দিকে নিয়ে যায় যা সহজ এবং সহজেই টেস্টযোগ্য।


সচরাচর

জটিল অবজেক্টগুলির একটি সাধারণ নেটওয়ার্কের তুলনায় সাধারণ সামগ্রীর জটিল নেটওয়ার্ককে পছন্দ করুন।

এক্সটেনসিবল টেস্টেবল কোডের মূলটি হ'ল ছোট বিল্ডিং ব্লক এবং স্বতন্ত্র তারের।


আপডেট হয়েছে: উভয়ের মিশ্রণ কীভাবে পরিচালনা করবেন?

এই দুটি ভূমিকা পালনের জন্য একটি বেস শ্রেণি পাওয়া সম্ভব ... যেমন: এটির একটি সার্বজনীন ইন্টারফেস রয়েছে এবং এটি সহায়ক পদ্ধতি সুরক্ষিত করেছে। যদি এটি হয় তবে সাহায্যকারী পদ্ধতিগুলিকে এক শ্রেণিতে (দৃশ্যের 2) রূপান্তর করতে পারেন এবং উত্তরাধিকার গাছটিকে কৌশলগত প্যাটার্নে রূপান্তর করতে পারেন।

যদি আপনি দেখতে পান যে আপনার বেস ক্লাসের প্রয়োগগুলি সরাসরি এবং অন্যটি ভার্চুয়াল হয় এমন কিছু পদ্ধতি রয়েছে তবে আপনি উত্তরাধিকার গাছটিকে কৌশলগত প্যাটার্নে রূপান্তর করতে পারেন, তবে আমি এটিকে একটি ভাল সূচক হিসাবেও গ্রহণ করব যে দায়িত্বগুলি সঠিকভাবে সাজানো হয়নি, এবং হতে পারে রিফ্যাক্টরিং দরকার


আপডেট 2: পদবিন্যাস পাথর হিসাবে বিমূর্ত শ্রেণি (2014/06/12)

আমি বিমূর্ত ব্যবহার করেছি যেখানে অন্য দিন আমার একটি পরিস্থিতি ছিল, তাই আমি কেন এটি অন্বেষণ করতে চাই।

আমাদের কনফিগারেশন ফাইলগুলির জন্য আমাদের একটি মানক ফর্ম্যাট রয়েছে। এই নির্দিষ্ট সরঞ্জামটিতে 3 টি বিন্যাসে থাকা ফাইল রয়েছে। আমি প্রতিটি সেটিং ফাইলের জন্য দৃ strongly়ভাবে টাইপ করা ক্লাস চেয়েছিলাম, তাই নির্ভরতা ইনজেকশনের মাধ্যমে একটি শ্রেণি তার যত্ন নেওয়া সেটিংসের জন্য জিজ্ঞাসা করতে পারে।

আমি এটি একটি অ্যাবস্ট্রাক্ট বেস ক্লাস করে প্রয়োগ করেছি যা কীভাবে সেটিংস ফাইলের ফর্ম্যাটগুলি পার্স করতে হয় এবং যে একই পদ্ধতিগুলি উদ্ঘাটিত করে সেগুলি উত্পন্ন ক্লাস, তবে সেটিংস ফাইলের অবস্থানের অবস্থান সম্পর্কে আলোচনা করে knows

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

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

এই মুহুর্তে দৃ strongly়ভাবে টাইপ করা সেটিংস ক্লাসগুলির আর "গেটর" পদ্ধতির প্রয়োজন হবে না যা অন্তর্নিহিত 'সেটিংস' বাস্তবায়ন প্রকাশ করে।

এই মুহুর্তে আমি আর চাই না যে তাদের সর্বজনীন ইন্টারফেসটি সেটিংস অ্যাকসেসর পদ্ধতিগুলি অন্তর্ভুক্ত করতে পারে; সুতরাং আমি এই শ্রেণিটি থেকে সেটিংস পরিবর্তে একটি সেটিংস পার্সার ক্লাসকে এমপ্ল্যাপুলেটে পরিবর্তন করব।

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

আমি এটি কোনও নিয়মের সাথে সত্য বলে মনে করি ... যেমন "কোনও স্থিতিশীল পদ্ধতি নেই" বা "কোনও ব্যক্তিগত পদ্ধতি নেই"। তারা কোডে একটি গন্ধ নির্দেশ করে ... এবং এটি বেশ ভাল। এটি আপনাকে যে বিমূর্ততাটি মিস করেছে তা সন্ধান করতে সহায়তা করে ... এবং আপনাকে আপনার গ্রাহকের মাঝামাঝি সময়ে মূল্য প্রদান করতে দেয়।

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


18
এটি একটি দুর্দান্ত উত্তর। শীর্ষ রেট থেকে অনেক ভাল। কিন্তু তারপর আমি শুধুমাত্র যারা অনুমান সত্যিই কৃতজ্ঞ হবে testable কোড লিখতে চান .. :)
MalcomTucker

22
এটি আসলে কতটা ভাল উত্তর তা আমি পেতে পারি না। এটি পুরোপুরি বিমূর্ত ক্লাস সম্পর্কে আমার চিন্তাভাবনা পরিবর্তন করেছে। ধন্যবাদ নাইজেল
ম্যালকমটকার

4
ওহ না .. আরেকটা টেনেটে আমার আবার নতুন করে ভাবতে হবে! ধন্যবাদ (উভয়ই আপাতত কৌতুকপূর্ণভাবে, এবং অ-বিদ্রূপাত্মকভাবে একবারের জন্য আমি এটি একীভূত করেছি এবং আরও ভাল প্রোগ্রামারের মতো অনুভব করছি)
মার্টিন লেন

11
চমৎকার উত্তর. অবশ্যই চিন্তা করার মতো কিছু ... তবে আপনি যা বলছেন তা কি মূলত অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার না করার জন্য সিদ্ধ হয় না?
ব্রায়ানস্টে

32
একমাত্র নিয়মের জন্য +1, "জটিল সামগ্রীর একটি সাধারণ নেটওয়ার্কের উপর সহজ সামগ্রীর জটিল নেটওয়ার্ককে পছন্দ করুন" "
ডেভিড গ্লাস

12

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


এটি কি সাবক্লাসে কাস্টিংয়ের সমস্যা সৃষ্টি করে না? যদি এক্স এর পদ্ধতি a এবং Y এর উত্তরাধিকার সূত্রে এক্স থাকে তবে একটি পদ্ধতি বিও রয়েছে। আপনি যখন নিজের পরীক্ষার ক্লাসটি সাবক্লাস করেন তখন আপনাকে বি তে পরীক্ষা করার জন্য আপনার বিমূর্ত পরিবর্তনটি কোনও ওয়াইয়ের কাছে ফেলে দিতে হবে না?
জন্নো নোলান

8

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

আপনি কোনও পদ্ধতিটিকে কল করে পরীক্ষা করেন সুতরাং এটি প্রয়োগ করে একটি বিমূর্ত শ্রেণীর পরীক্ষা করুন ...


8

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

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

তবে, আমি মনে করি এটি গুরুত্বপূর্ণ যে এই পরীক্ষাগুলি কেবল প্রকৃত ব্যবসায়িক যুক্তির কংক্রিট বাস্তবায়নের উপর ফোকাস করা উচিত ; আপনি বিমূর্ত শ্রেণীর পরীক্ষার বাস্তবায়ন বিশদটি ইউনিট করা উচিত নয় কারণ আপনি ভঙ্গুর পরীক্ষা দিয়ে শেষ করবেন।


6

একটি উপায় হ'ল একটি বিমূর্ত পরীক্ষার কেসটি লিখুন যা আপনার বিমূর্ত শ্রেণীর সাথে সম্পর্কিত, তারপরে এমন কংক্রিট পরীক্ষার কেসগুলি লিখুন যা আপনার বিমূর্ত পরীক্ষার কেস সাবক্লাস করে। আপনার মূল বিমূর্ত শ্রেণীর প্রতিটি কংক্রিট সাবক্লাসের জন্য এটি করুন (যেমন আপনার পরীক্ষার কেস শ্রেণিবিন্যাসটি আপনার শ্রেণীর শ্রেণিবিন্যাস আয়না করে)। জুনিট রসিপি বইয়ের একটি ইন্টারফেস পরীক্ষা করুন: http://safari.informit.com/9781932394238/ch02lev1sec6

এক্স ইউনিট নিদর্শনগুলিতে টেস্টকেস সুপারক্লাসও দেখুন: http://xunitpatterns.com/Testcase%20Superclass.html


4

আমি "বিমূর্ত" পরীক্ষার বিরুদ্ধে তর্ক করব। আমি মনে করি একটি পরীক্ষা একটি কংক্রিট ধারণা এবং এটি একটি বিমূর্ততা আছে। আপনার যদি সাধারণ উপাদান থাকে তবে তাদের ব্যবহারকারীর জন্য সহায়ক পদ্ধতি বা ক্লাসে রাখুন।

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


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

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

4

বিমূর্ত শ্রেণীর পরীক্ষার জন্য জোতা স্থাপন করার সময় আমি এই প্যাটার্নটি অনুসরণ করি:

public abstract class MyBase{
  /*...*/
  public abstract void VoidMethod(object param1);
  public abstract object MethodWithReturn(object param1);
  /*,,,*/
}

এবং আমি যে সংস্করণটি পরীক্ষার অধীনে ব্যবহার করি:

public class MyBaseHarness : MyBase{
  /*...*/
  public Action<object> VoidMethodFunction;
  public override void VoidMethod(object param1){
    VoidMethodFunction(param1);
  }
  public Func<object, object> MethodWithReturnFunction;
  public override object MethodWithReturn(object param1){
    return MethodWihtReturnFunction(param1);
  }
  /*,,,*/
}

আমি যখন আশা করি না তখন যদি বিমূর্ত পদ্ধতিগুলি কল করা হয়, পরীক্ষাগুলি ব্যর্থ হয়। পরীক্ষাগুলির ব্যবস্থা করার সময়, আমি সহজেই ল্যাম্বডাস দ্বারা বিমূর্ত পদ্ধতিগুলি ছাঁটাই করতে পারি যা দৃ perform়ভাবে সম্পাদন করে, ব্যতিক্রম ছুঁড়ে দেয়, বিভিন্ন মান ফিরিয়ে দেয় ইত্যাদি perform


3

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


2

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


2

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

ইউনিট পরীক্ষার দৃষ্টিকোণ থেকে, দুটি বিষয় বিবেচনা করতে হবে:

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

  2. উদ্ভূত শ্রেণীর কার্যকারিতা । আপনি যদি আপনার উদ্ভূত শ্রেণীর জন্য লিখেছেন এমন কাস্টম যুক্তি থাকে তবে আপনার এই ক্লাসগুলি বিচ্ছিন্নভাবে পরীক্ষা করা উচিত।

সম্পাদনা করুন: রাইনোমকস একটি দুর্দান্ত মক টেস্টিং ফ্রেমওয়ার্ক যা রানটাইমের সময় আপনার ক্লাস থেকে গতিশীলভাবে ডাইরেক্ট করে মক অবজেক্ট তৈরি করতে পারে। এই পদ্ধতির সাহায্যে আপনি অগণিত ঘন্টা হ্যান্ড-কোডিং থেকে প্রাপ্ত ক্লাসের সঞ্চয় করতে পারেন।


2

প্রথমে যদি বিমূর্ত শ্রেণিতে কিছু কংক্রিট পদ্ধতি থাকে তবে আমার মনে হয় আপনার এই উদাহরণটি বিবেচনা করা উচিত

 public abstract class A 

 {

    public boolean method 1
    {
        // concrete method which we have to test.

    }


 }


 class B extends class A

 {

      @override
      public boolean method 1
      {
        // override same method as above.

      }


 } 


  class Test_A 

  {

    private static B b;  // reference object of the class B

    @Before
    public void init()

      {

      b = new B ();    

      }

     @Test
     public void Test_method 1

       {

       b.method 1; // use some assertion statements.

       }

   }

1

যদি আপনার বাস্তবায়নের জন্য কোনও বিমূর্ত শ্রেণি উপযুক্ত হয়, তবে উত্পন্ন কংক্রিটের ক্লাস পরীক্ষা করুন (উপরে প্রস্তাবিত হিসাবে)। আপনার অনুমান সঠিক।

ভবিষ্যতের বিভ্রান্তি এড়াতে, সচেতন থাকুন যে এই কংক্রিট পরীক্ষার শ্রেণিটি একটি উপহাস নয়, তবে একটি জাল

কড়া কথায়, একটি উপহাস নিম্নলিখিত বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়:

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

1

@ প্যাট্রিক-ডিজজার্ডিনস উত্তর অনুসরণ করে, আমি বিমূর্ত প্রয়োগ করেছি এবং এর বাস্তবায়ন ক্লাসটি বরাবর @Testনিম্নরূপ:

বিমূর্ত শ্রেণি - এবিসি.জভা

import java.util.ArrayList;
import java.util.List;

public abstract class ABC {

    abstract String sayHello();

    public List<String> getList() {
        final List<String> defaultList = new ArrayList<>();
        defaultList.add("abstract class");
        return defaultList;
    }
}

যেহেতু অ্যাবস্ট্রাক্ট শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে সেগুলি সাবক্ল্যাস করা যায় , কংক্রিট শ্রেণি ডিইএফ.জভা নিম্নরূপ:

public class DEF extends ABC {

    @Override
    public String sayHello() {
        return "Hello!";
    }
}

@ বিমূর্তের পাশাপাশি অ-বিমূর্ত পদ্ধতি উভয়ই পরীক্ষা করার জন্য টেস্ট ক্লাস:

import org.junit.Before;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.contains;
import java.util.Collection;
import java.util.List;
import static org.hamcrest.Matchers.equalTo;

import org.junit.Test;

public class DEFTest {

    private DEF def;

    @Before
    public void setup() {
        def = new DEF();
    }

    @Test
    public void add(){
        String result = def.sayHello();
        assertThat(result, is(equalTo("Hello!")));
    }

    @Test
    public void getList(){
        List<String> result = def.getList();
        assertThat((Collection<String>) result, is(not(empty())));
        assertThat(result, contains("abstract class"));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.