ফাংশনগুলি পড়ার / লেখার জন্য আমি কীভাবে টিডিডি প্রয়োগ করব?


10

মনে হচ্ছে মুরগি ও ডিমের সমস্যার মতো।

আপনি কিছু ডেটা স্টোরে একটি রাইটিং ফাংশন লিখতে পারেন, তবে কখনই জানেন না যে আপনি এটি পরীক্ষা করা পঠন ফাংশন ছাড়া সঠিকভাবে সংরক্ষণ করেছেন।

আপনি কোনও ডেটা স্টোর থেকে পঠন ফাংশনটি তৈরি করতে পারেন, তবে পরীক্ষামূলক লেখার কাজ না করে আপনি কীভাবে সেই ডেটা স্টোরে স্টাফ রাখবেন?

সম্পাদনা করুন:

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

@ সোনমান উল্লেখ করেছেন বলে এটি অ্যাড / ডিলিটের মতো নয়। আমি জানতে চাই যে আমি লিখিত সামগ্রীগুলি সঠিক, তবে এর জন্য একটি ভাল-পরীক্ষিত পঠন ফাংশন প্রয়োজন। আমি যখন পড়ি, তখন আমি নিশ্চিত হতে চাই যে আমার পড়াটি যা লেখা হয়েছিল তার সমান একটি অবজেক্টটি সঠিকভাবে তৈরি করেছে; তবে এর জন্য একটি ভাল-পরীক্ষিত লেখার ফাংশন প্রয়োজন।


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


1
ঘনিষ্ঠভাবে সম্পর্কিত হওয়ার পরেও, আমি মনে করি না যে এটি সেই নির্দিষ্ট প্রশ্নের সদৃশ। ডুপ টার্গেট অ্যাড / ডিলিটের কথা বলছে, এটি পড়া / লেখা is পার্থক্যটি হ'ল পঠন / লেখার উপর নির্ভরশীলতা সম্ভবত পড়ার / লিখিত সামগ্রীর সামগ্রীর উপর নির্ভর করে , যখন একটি সাধারণ অ্যাড / ডিলিট পরীক্ষা সম্ভবত অনেক সহজ হতে পারে: বস্তুর অস্তিত্ব আছে কি নেই।

2
আপনি পড়ার ফাংশনটি পরীক্ষা করার জন্য ডেটাবেস এবং কোনও লিখন ফাংশন সহ একটি ডেটাবেস স্টেজ করতে পারেন।
জেফো

উত্তর:


7

পঠন ফাংশন দিয়ে শুরু করুন।

  • পরীক্ষার সেটআপে : ডাটাবেস তৈরি করুন এবং পরীক্ষার ডেটা যুক্ত করুন। হয় মাইগ্রেশন স্ক্রিপ্টগুলির মাধ্যমে বা ব্যাকআপ থেকে। যেহেতু এটি আপনার কোড নয়, এটির জন্য টিডিডি পরীক্ষার প্রয়োজন হয় না

  • পরীক্ষায় : আপনার সংগ্রহস্থলকে প্রশমিত করুন, আপনার পরীক্ষার ডিবিতে নির্দেশ করুন এবং পড়ুন পদ্ধতিটি কল করুন। পরীক্ষার ডেটা ফিরে এসেছে কিনা তা পরীক্ষা করে দেখুন।

এখন আপনার একটি সম্পূর্ণ পরীক্ষিত পঠন ফাংশন রয়েছে, আপনি লিখন ফাংশনে যেতে পারেন, যা বিদ্যমান ফলাফলটি তার নিজস্ব ফলাফল যাচাই করতে ব্যবহার করতে পারে


আমার ধারণা আপনি জিনিসগুলি গতি বাড়ানোর জন্য স্মৃতিতে একটি ডিবি তৈরি করতে পারেন তবে এটি খুব জটিল হতে পারে। ইউনিট পরীক্ষার পরিবর্তে মক ব্যবহার করবেন না কেন?
BЈовић

1
এখানে ডেভিলের অ্যাডভোকেট কিছুটা হলেও আপনি কীভাবে পরীক্ষা করবেন যে ডাটাবেসটি সঠিকভাবে তৈরি হয়েছিল? ওপি যেমন বলেছে, মুরগী ​​এবং ডিম।
ব্যবহারকারী 949300

1
@ ইভান - আমি একমত যে আপনি তাদের ডিবি কোড পরীক্ষা না করা উচিত absolutely তবে আপনি কীভাবে জানবেন যে আপনার ডিবি সেটআপ কোডটি কোনও কোথাও একটি INSERT ভুলেনি বা কোনও কলামে একটি ভুল মান রেখেছিল?
ব্যবহারকারী 4949300

1
খাঁটি টিডিডি থেকে পরীক্ষার প্রয়োজনীয়তা। সুতরাং এটি যৌক্তিকভাবে ভুল হতে পারে। রিয়েল ওয়ার্ল্ডের অবভিসগুলি আপনাকে এটি চোখের সামনে দেখতে হবে
ইওয়ান

1
আইপসোস কাস্টোড কুইসড কাস্টোড? বা, "পরীক্ষাগুলি কে পরীক্ষা করে?" :-) আমি আপনার সাথে একমত যে একটি পিউরিস্ট টিডিডি বিশ্বে এটি করা হবে মারাত্মক ক্লান্তিকর এবং বাগ প্রবণ (উদাহরণস্বরূপ, এটি একটি জটিল একাধিক টেবিল কাঠামো ছিল 8 জিনস) এটি করার উপায়। সম্মত।
ব্যবহারকারী 949300

6

আমি প্রায়শই একটি লিখন করি তারপরে একটি পঠন। যেমন (সিউডোকোড)

Foo foo1 = setup some object to write
File tempfile = create a tempfile, possibly in memory 
writeFoo(foo1, tempfile) 
Foo foo2 = readFoo(tempfile) 
assertEquals(foo1, foo2); 
clean-up goes here

পরে যুক্ত হয়েছে

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

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


1
কারণ এটি 90% সত্যিই ঘন সিউডোকোড? নিশ্চিত না. হয়তো পাঠ্যটি হাইলাইট করুন এবং কোডটি কম গোলমাল করবেন?
রাবারডাক

1
হ্যাঁ @ ইভান জিলিওট এটির উপরে ভ্রূণিত হতেন, তবে বাস্তববাদী প্রোগ্রামারটি "যথেষ্ট ভাল" বলতেন এবং এগিয়ে যান।
রাবারডাক

1
আমি এই প্রশ্নটি পড়ি .. "ধরে নিচ্ছি আমি টিডিডিটিকে একজন জিলিওটের মতো অনুসরণ করি ..."
ইওয়ান

1
আমার ওপি এবং টিডিডি সম্পর্কে আমার ব্যাখ্যাটি হ'ল আপনার পরীক্ষাটি প্রথমে লেখা উচিত এবং অন্য কোথাও পরীক্ষা না করা হলে পড়া এবং লেখার উভয়ই ব্যবহার করা উচিত নয়।
ইয়ান

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

4

না। ইউনিট পরীক্ষা I / O করবেন না। শুধু শুধুই সময় নষ্ট.

ইউনিট পরীক্ষার যুক্তি। আপনি যদি I / O কোডটিতে পরীক্ষা করতে চান এমন অনেক যুক্তিযুক্ত হয়ে থাকে, আপনি কীভাবে I / O করবেন এবং I / O করার আসল ব্যবসা থেকে আপনি কী করেন তার যুক্তি আলাদা করার জন্য আপনার কোডটি রিফ্যাক্টর করা উচিত (যা পরীক্ষা করা নিকট-অসম্ভব)।

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

আপনার কোড পৃথক করা উচিত:

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

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

এটি সাধারণভাবে কেবলমাত্র ভাল ডিজাইন, তবে এর অন্যতম কারণ হ'ল এটি পরীক্ষা করা সহজ করে তোলে।


এখানে কিছু উদাহরন:

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

2

আমি জানি না এটি একটি আদর্শ অনুশীলন কিনা তা তবে তা আমার পক্ষে ভাল কাজ করে।

আমার অ-ডেটাবেজে রিড রাইটিং পদ্ধতি বাস্তবায়নে আমি নিজের নিজস্ব-নির্দিষ্ট toString()এবং fromString()পদ্ধতি প্রয়োগের বিবরণ হিসাবে ব্যবহার করি ।

এগুলি সহজেই বিচ্ছিন্নভাবে পরীক্ষা করা যেতে পারে:

 assertEquals("<xml><car type='porsche'>....", new Car("porsche").toString());

আসল পড়ার লেখার পদ্ধতির জন্য আমার একটি ইন্টিগ্রেশন টেস্ট রয়েছে যা শারীরিকভাবে একটি পরীক্ষায় পড়ে এবং লিখতে পারে

যাইহোক: পরীক্ষার সাথে একসাথে পড়া / লেখার কিছু ভুল আছে কি?


এটি ভাল বা "খাঁটি" মনে হচ্ছে না তবে এটি ব্যবহারিক সমাধান।
রাবারডাক

আমিও এক সাথে পড়ার এবং লেখার পরীক্ষার ধারণা পছন্দ করি। আপনার টস্ট্রিং () একটি দুর্দান্ত ব্যবহারিক সমঝোতা।
user949300

1

জ্ঞাত তথ্য অবশ্যই একটি জ্ঞাত পদ্ধতিতে ফর্ম্যাট করতে হবে। এটি বাস্তবায়নের সহজতম উপায় হ'ল একটি ধ্রুবক স্ট্রিং ব্যবহার করা এবং ফলাফলের সাথে তুলনা করা, যেমন @ কে 3 বি বর্ণিত।

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

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


1

নির্ভরতা ইনজেকশন এবং মশকরা ব্যবহার করুন।

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

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

আপনার উত্পাদন কোডে, আসল ডাটাবেস অবজেক্টটি পাস করুন।

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

এইভাবে আপনি এমনকি কোনও প্রকৃত ডাটাবেসের প্রয়োজন ছাড়াই আপনার ডাটাবেস বিমূর্ত স্তর পরীক্ষা করতে পারেন।


শয়তানের অ্যাডভোকেট: আপনি কীভাবে জানবেন যে কোন এসকিউএল স্টেটমেন্ট এটি "গ্রহণের কথা"? ডিবি ড্রাইভার কোডে যা প্রদর্শিত হবে তার থেকে আদেশটি অনুকূল করে ফেললে কী হবে?
user949300

@ user949300 একটি ডাটাবেস মক অবজেক্ট সাধারণত ডাটাবেস ড্রাইভারকে প্রতিস্থাপন করে।
ফিলিপ

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

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

হ্যাঁ. আমি বলছি কোনও ডিবি সংগ্রহস্থলের পরীক্ষার কোনও পয়েন্ট ইউনিট নেই। ইন্টিগ্রেশন পরীক্ষা একমাত্র জিনিস মূল্য করছে
ইওয়ান

0

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

এনহাইবারনেট দৃ Pers়তা স্পেসিফিকেশন পরীক্ষার অফার করে । এটি দ্রুত ইউনিট পরীক্ষার জন্য একটি মেমরির স্টোরের বিরুদ্ধে কাজ করার জন্য কনফিগার করা যেতে পারে।

আপনি যদি ভাণ্ডারগুলির একক সংস্করণ এবং কর্মের নিদর্শনগুলির এককটি অনুসরণ করেন এবং আপনার সমস্ত ম্যাপিং পরীক্ষা করে থাকেন তবে আপনি কাজকর্মের উপর নির্ভর করতে পারেন।

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