কিছু সাধারণ কার্যকারিতা কোড করতে আমি কীভাবে টিডিডি ব্যবহার শুরু করতে পারি?


9

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

আমার জন্য এটি সম্পর্কে সবচেয়ে দরকারী জিনিসটি যেভাবে এটি প্রতিরোধের পরীক্ষার ভূমিকা শোষণ করে।

আমি এখনও এমন কিছু নির্মাণ করি নি যা বিশেষভাবে বিভিন্ন পরীক্ষামূলক আচরণকে আলাদা করে দেয় যা আমি জানি ছবির আরও একটি বড় অংশ।

সুতরাং এই প্রশ্নটি হ'ল নিম্নলিখিত পরীক্ষার জন্য প্রথম পরীক্ষা (গুলি) আমি কী লিখতে পারি তার জন্য পয়েন্টারগুলি জিজ্ঞাসা করা: আমি এমন একটি কোড তৈরি করতে চাই যা নির্মাতা / গ্রাহকের ফ্যাশনে টাস্ক এক্সিকিউশনকে আবদ্ধ করে।

আমি এই কোডটি লেখার পরে এই প্রশ্নটি লিখতে থামলাম এবং এই সিদ্ধান্তটি লিখতে সিদ্ধান্ত নিয়েছি (ভাবছি যদি আমি আসলে এই সময়ের জন্য টিডিডি ব্যবহার করতে পারি)

কোড:

interface ITask
{
    Guid TaskId { get; }
    bool IsComplete { get; }
    bool IsFailed { get; }
    bool IsRunning { get; }
}

interface ITaskContainer
{
    Guid AddTask(ICommand action);
}

interface ICommand
{
    string CommandName { get; }
    Dictionary<string, object> Parameters { get; }
    void Execute();
}

আপনার প্রথমে পরীক্ষাগুলি লিখতে হবে এবং তারপরে ইন্টারফেসগুলি লিখতে হবে! পুরো ধারণাটি হ'ল টিডিডি আপনার এপিআই এর জন্য।

1
এমন একটি ইন্টারফেসের জন্য পরীক্ষা লিখতে পারে যা এখনও বিদ্যমান নেই? তারা এমনকি সংকলন করবে না।
রবার্ট হার্ভে

5
এটিই আপনার প্রথম ব্যর্থ পরীক্ষা।
কোরি

উত্তর:


10

এই ধারণাটি দিয়ে শুরু:
1) আপনি যে আচরণটি চান তা দিয়ে শুরু করুন। এটির জন্য একটি পরীক্ষা লিখুন। পরীক্ষা ব্যর্থ দেখুন।
2) পরীক্ষা পাস করার জন্য পর্যাপ্ত কোড লিখুন। সমস্ত পরীক্ষা পাস দেখুন।
3) রিডান্ট্যান্ট / স্লোপি কোড -> রিফ্যাক্টর সন্ধান করুন। পরীক্ষা পাস এখনও দেখুন। গোটো ঘ

সুতরাং # 1, আসুন আমরা বলি যে আপনি একটি নতুন কমান্ড তৈরি করতে চান (কমান্ডটি কীভাবে কাজ করবে তা আমি প্রসারিত করছি, সুতরাং আমার সাথে সহ্য করুন)। (এছাড়াও, আমি চরম টিডিডির চেয়ে কিছুটা বাস্তববাদী হবো)

নতুন কমান্ডটিকে মেকমাইলঞ্চ বলা হয়, সুতরাং আপনি প্রথমে এটি ইনস্ট্যান্ট করার জন্য এবং আদেশের নাম পাওয়ার জন্য একটি পরীক্ষা তৈরি করুন:

@Test
public void instantiateMakeMyLunch() {
   ICommand command = new MakeMyLunchCommand();
   assertEquals("makeMyLunch",command.getCommandName());
}

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

সুতরাং পরবর্তী আপনি এটি কার্যকর করতে চান। সুতরাং আপনাকে জিজ্ঞাসা করতে হবে: আমি কীভাবে জানি যে "মেকমাইলঞ্চ" সফলভাবে "আমার মধ্যাহ্নভোজন করেছে"। এই অপারেশনের কারণে সিস্টেমে কী পরিবর্তন ঘটে? আমি কি এর জন্য পরীক্ষা করতে পারি?

মনে করুন এটি পরীক্ষা করা সহজ:

@Test
public void checkThatMakeMyLunchIsSuccessful() {
   ICommand command = new MakeMyLunchCommand();
   command.execute();
   assertTrue( Lunch.isReady() );
}

অন্যান্য সময়, এটি আরও কঠিন এবং আপনি যা করতে চান তা হ'ল সাবজেক্টের আন্ডার-টেস্টের (MakeMyLunchCommand) দায়িত্বগুলির পরীক্ষা করা। সম্ভবত MakeMyLunchCommand এর দায়িত্ব হ'ল ফ্রিজ এবং মাইক্রোওয়েভের সাথে যোগাযোগ করা। সুতরাং এটি পরীক্ষা করার জন্য আপনি একটি মক ফ্রিজ এবং মক মাইক্রোওয়েভ ব্যবহার করতে পারেন। [দুটি নমুনা মক ফ্রেমওয়ার্ক হলেন মকিতো এবং এনমক বা এখানে দেখুন look ]

কোন ক্ষেত্রে আপনি নিম্নলিখিত সিউডো কোডের মতো কিছু করবেন:

@Test
public void checkThatMakeMyLunchIsSuccessful() {
   Fridge mockFridge = mock(Fridge);
   Microwave mockMicrowave = mock(Microwave);
   ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
   command.execute();
   mockFramework.assertCalled( mockFridge.removeFood );
   mockFramework.assertCalled( microwave.turnon );
}

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

অনুশীলনবিদ একদল শ্রেণীর জন্য পরীক্ষা এবং ফলাফলের জন্য পরীক্ষা বলেছেন (আপনার মধ্যাহ্নভোজন প্রস্তুত?)

আপনার সিস্টেমে কাজ করে এমন সঠিক ব্যালেন্স খুঁজুন।

(দ্রষ্টব্য: বিবেচনা করুন যে সম্ভবত আপনি আপনার ইন্টারফেস কাঠামোতে খুব তাড়াতাড়ি এসে পৌঁছেছেন। সম্ভবত আপনি আপনার ইউনিট পরীক্ষা এবং প্রয়োগগুলি লেখার সাথে সাথে এইটিকে বিকশিত করতে পারেন এবং # 3 ধাপে আপনি সাধারণ ইন্টারফেসের সুযোগটি "লক্ষ্য করবেন")।


যদি আমি আমার ইন্টারফেসটি আগেই না লিখে থাকতাম তবে এক্সিকিউট () পদ্ধতিটি তৈরি করার বিষয়ে কী প্রশ্ন সৃষ্টি হত - টিডিডি-র আমার প্রাথমিক কিছু প্রচেষ্টা স্থগিত হয়েছিল যখন আমার অতিরিক্ত কার্যকারিতা উদ্দীপনার জন্য "পদক্ষেপ" নেই - আমি পেয়েছি অনুভূতিটি একটি সুপ্ত মুরগি / ডিম ইস্যুটিকে
পাশ কাটাতে

1
ভাল প্রশ্ন! আপনি যে একমাত্র আদেশ দিয়েছেন তা যদি "MakeMyLunchCommand" হয় তবে পদ্ধতিটি ".MakeMyLunch ()" দিয়ে শুরু হতে পারে। যা ভাল হত। তারপরে আপনি অন্য একটি আদেশ ("ন্যাপকম্যান্ড.টেকন্যাপ ()") করুন। এখনও বিভিন্ন পদ্ধতি নিয়ে কোনও সমস্যা নেই। তারপরে আপনি এটিকে আপনার বাস্তুতন্ত্রে ব্যবহার শুরু করেন, সম্ভবত আপনি আইকোমন্ড ইন্টারফেসে সাধারণীকরণ করতে বাধ্য হন। সাধারণভাবে, আপনি প্রায়ই দেরি সাধারণীকরণ গত দায়ী মুহূর্ত পর্যন্ত, কারণ YAGNI [ en.wikipedia.org/wiki/You_ain't_gonna_need_it ] =) অন্য সময়ে, আপনি জানেন আপনি সেখানে পেতে তাই আপনি এটি দিয়ে শুরু যাচ্ছি।
জয়রেনেট

(এখানে অনুমান করার পাশাপাশি আপনি একটি আধুনিক আইডিই ব্যবহার করছেন যা পদ্ধতির নামগুলিকে তুচ্ছ বলে
রিফেক্টরিং করে

1
পরামর্শের জন্য আবারও ধন্যবাদ, অবশেষে সমস্ত টুকরো এবং সেগুলি কীভাবে ফিট হবে তা দেখার জন্য এটি আমার জন্য এক মাইলফলক - এবং হ্যাঁ, দ্রুত রিফ্যাক্টরটি আমার সরঞ্জাম
বাক্সে রয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.