সংগ্রহস্থল প্যাটার্ন সহ টিডিডি


10

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

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

আমি এই সম্পর্কে দুটি দিন থেকে ভাবছি এবং এখনও কোনও যুক্তিসঙ্গত সমাধান নিয়ে আসতে পারি না। এখন আমার কি করা উচিত?

উত্তর:


11

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

এই পদ্ধতির সর্বাধিক বুনিয়াদি হ'ল সংরক্ষণ: বেশিরভাগ ক্ষেত্রে এটি খালি সংগ্রহস্থল থেকে কাজটির একক (বা সেশন) এর দিকে চলে যাবে।

public void Save(Car car)
{
    session.Save(car);
}

তবে আসুন অন্য উদাহরণটি দেখুন, উদাহরণস্বরূপ তার আইডি দিয়ে গাড়ি আনয়ন ching এটি দেখতে মত হতে পারে

public function GetCarWithId(String id)
{
    return Session.QueryOver<Car>()
                    .Where(x => x.Id == id)
                    .SingleOrDefault();
}

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

বিকল্প 1: ওআরএম কাঠামোয় করা কলগুলি মক করুন

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

বিকল্প 2: (পুনরায়) পরীক্ষাগুলি থেকে ডাটাবেস তৈরি করুন

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

বিকল্প 3: একটি আসল ডাটাবেসে পরীক্ষা করুন

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

ডাল পরীক্ষা করবেন না

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

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

'ইউনিট পরীক্ষা' কেবল একটি নাম

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


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

9
  1. তুচ্ছ বা সুস্পষ্ট সংগ্রহস্থল পদ্ধতি পরীক্ষা করবেন না।

    যদি পদ্ধতিগুলি তুচ্ছ CRUD অপারেশন হয় তবে আপনি যা যা পরীক্ষা করছেন তা হ'ল প্যারামিটারগুলি সঠিকভাবে ম্যাপ করা হয়েছে কিনা। আপনার যদি ইন্টিগ্রেশন পরীক্ষা করে থাকে তবে এ জাতীয় ত্রুটিগুলি তত্ক্ষণাত তত্ক্ষণাত্ স্পষ্ট হয়ে উঠবে।

    এটি হ'ল নীতি যা তুচ্ছ বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য যেমন:

    public property SomeProperty
    {
        get { return _someProperty; }
        set { _someProperty = value; }
    }
    

    আপনি এটি পরীক্ষা করেন না, কারণ পরীক্ষার মতো কিছুই নেই। সম্পত্তিটিতে যাচাই করা দরকার এমন কোনও বৈধতা বা অন্যান্য যুক্তি নেই।

  2. আপনি যদি এখনও এই পদ্ধতিগুলি পরীক্ষা করতে চান ...

    বিদ্রূপগুলি এটি করার উপায়। মনে রাখবেন, এগুলি ইউনিট টেস্ট। আপনি ইউনিট পরীক্ষা দিয়ে ডাটাবেস পরীক্ষা করেন না; এটিই ইন্টিগ্রেশন টেস্টগুলির জন্য।

আরও তথ্য
সম্পূর্ণ স্ট্যাক, পার্ট 3: টিডিডি ব্যবহার করে একটি সংগ্রহশালা তৈরি করা (প্রায় 16 মিনিটের মধ্যে দেখা শুরু করুন)।


3
অবশ্যই, আমি এটি বুঝতে পারি। তবুও, যদি এটি টিডিডি পদ্ধতির হয় তবে আমার এই কোডটির জন্য টেস্ট না থাকলে কোনও কোড লিখতে হবে না, তাই না?
থাইভেন

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

2
@ জুলস: টিএলডাব্লু কি ?
রবার্ট হার্ভে

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

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