ইউনিট-টেস্টিং ডাটাবেস-চালিত অ্যাপ্লিকেশনগুলির জন্য সেরা কৌশলটি কী?


346

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

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

বছরের পর বছর ধরে, আমি কয়েকটি কৌশল চেষ্টা করেছি, যার মধ্যে কেউই আমাকে পুরোপুরি সন্তুষ্ট করেনি।

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

  • উত্পাদন ডাটাবেসের একটি অনুলিপি লোড করুন এবং এর বিপরীতে পরীক্ষা করুন test এখানে সমস্যাটি হ'ল কোনও সময় নির্ধারিত সময়ে ডিবিতে কী রয়েছে তা আপনার কোনও ধারণা নেই; সময়ের সাথে সাথে ডেটা পরিবর্তন হলে আপনার পরীক্ষাগুলি আবারও লেখার প্রয়োজন হতে পারে।

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

  • একটি মক ডাটাবেস সার্ভার ব্যবহার করুন, এবং কেবল পরীক্ষা করুন যে ওআরএম কোনও প্রদত্ত পদ্ধতি কলের প্রতিক্রিয়া হিসাবে সঠিক কোয়েরি প্রেরণ করছে।

ডাটাবেস-চালিত অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য আপনি কোন কৌশল ব্যবহার করেছেন, যদি থাকে? আপনার জন্য কী সবচেয়ে ভাল কাজ করেছে?


আমি মনে করি অনন্য সূচকগুলির মতো ক্ষেত্রে পরীক্ষার পরিবেশে আপনার এখনও ডাটাবেস সূচী থাকা উচিত।
dtc

আমি pesonally এই প্রশ্নের এখানে কিছু মনে না করেন কিন্তু যদি আমরা বিধি দ্বারা যান, এই প্রশ্নের জন্য নয় Stackoverflow বরং এটি জন্য softwareengineering.stackexchange ওয়েবসাইট।
ITExpert

উত্তর:


155

আমি আপনার বেশিরভাগ সাফল্যের সাথে প্রথম দৃষ্টিভঙ্গিটি ব্যবহার করেছি, তবে কিছুটা ভিন্ন উপায়ে যা আমি মনে করি আপনার সমস্যার কিছু সমাধান করবে:

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

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

  3. আমার গোষ্ঠীর জন্য, ইউজার ইনপুটটি অ্যাপ্লিকেশন পর্যায়ে করা হয় (ডিবি নয়) সুতরাং এটি স্ট্যান্ডার্ড ইউনিট পরীক্ষার মাধ্যমে পরীক্ষা করা হয়।

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

  1. অনুলিপিটি সংস্করণ থেকে পুরানো হয়ে যাবে
  2. অনুলিপিটির স্কিমে পরিবর্তন করা হবে এবং উত্পাদন সিস্টেমে প্রচার করা হবে না। এই মুহুর্তে আমাদের কাছে স্কিমাগুলি অন্যদিকে সরানো হবে। মজা না.

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


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

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

2
আমি দুটি পৃথক বড় প্রকল্প পরিচালনা করি, যার মধ্যে একটিতে এই পদ্ধতির নিখুঁত ছিল, তবে অন্য প্রকল্পে এটি বাস্তবায়নের চেষ্টা করে আমরা প্রচুর সমস্যায় পড়েছি। সুতরাং আমি মনে করি যা পরীক্ষাগুলি সম্পাদনের জন্য প্রতিবার স্কিমাটি কীভাবে সহজেই তৈরি করা যায় তার উপর নির্ভর করে, আমি বর্তমানে এই সর্বশেষ সমস্যার জন্য একটি নতুন সমাধান সন্ধানের জন্য কাজ করছি working
ক্রস করুন

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

বানরের প্যাচিং এবং বিদ্রূপের আরও ভাল ব্যবহার করুন এবং রচনা অপারেশন
এড়ান

56

আমি এই কারণে সবসময় ইন-মেমোরি ডিবি (এইচএসকিউএলডিবি বা ডার্বি) এর বিরুদ্ধে পরীক্ষা চালিয়ে যাচ্ছি:

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

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

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


1
গতি কি (বিশেষত) একটি মেমরি ডিবি ব্যবহারের একমাত্র কারণ?
রিনোগো

2
আমার ধারণা, আর একটি সুবিধা হতে পারে এর "নিক্ষেপ" প্রকৃতি - নিজের পরে পরিষ্কার করার দরকার নেই; শুধু ইন-মেমরি ডিবি মেরে ফেলুন। (তবে এটি সম্পাদন করার অন্যান্য উপায় রয়েছে যেমন রোলব্যাক পদ্ধতির যেমন আপনি উল্লেখ করেছেন)
রিনোগো

1
সুবিধাটি হ'ল প্রতিটি পরীক্ষা পৃথকভাবে তার কৌশল বেছে নিতে পারে। আমাদের পরীক্ষা রয়েছে যা শিশু থ্রেডে কাজ করে যার অর্থ স্প্রিং সর্বদা ডেটা প্রতিশ্রুতিবদ্ধ।
অ্যারন দিগুল্লা 3'14

@ অ্যারন: আমরাও এই কৌশলটি অনুসরণ করছি। আমি জানতে চাই যে আপনার কৌশলটি কী দাবি করে যে ইন-মেমরি মডেলটির বাস্তব কাঠামোর চেয়ে একই কাঠামো আছে?
গিলিয়াম

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

14

আমি দীর্ঘদিন ধরে এই প্রশ্নটি করে আসছি, তবে আমি মনে করি এটির জন্য কোনও রূপালী বুলেট নেই।

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

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

আমি খুব আকর্ষণীয় বলে মনে করি, তবে সামান্য সময় ব্যয় করার পরেও সর্বদা মূল্যবান নয়, আপনি এম্বেড থাকা ডাটাবেসে উত্পাদনের জন্য একই স্কিমা তৈরি করা যা কেবল ইউনিট পরীক্ষার মধ্যে চলে।

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

আপনার কোডের জন্য আপনি যা বেশি প্রাসঙ্গিক বলে মনে করেন না কেন, সেখানে কয়েকটি প্রকল্প রয়েছে যা DbUnit এর মতো সহজ করে তুলতে পারে ।


13

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

এমনকি আপনি যদি নিজের ওআরএমকে কেবলমাত্র ইন্টিগ্রেশন-পরীক্ষা করতে চান, তবে একটি সতর্কতা অবলম্বন করুন যে কোনও ওআরএম আপনার ডাটাবেসে খুব জটিল একটি সিরিজ অনুসন্ধান করেছে, এতে আলাদা হতে পারে

  • বাক্য গঠন
  • জটিলতা
  • অর্ডার (!)

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


5

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

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


3

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

ডিএওগুলির জন্য পরীক্ষা চালানোর জন্য যা কিছু প্রয়োজন তা সোর্স নিয়ন্ত্রণে। এটিতে ডিবি তৈরির জন্য স্কিমা এবং স্ক্রিপ্টগুলি অন্তর্ভুক্ত রয়েছে (এর জন্য ডকার খুব ভাল)। যদি এম্বেড করা ডিবি ব্যবহার করা যায় - আমি এটি গতির জন্য ব্যবহার করি।

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

মূল উদ্দেশ্যটি পরীক্ষার মাধ্যমে ব্যবহৃত ডেটা তৈরি করা

  1. পরীক্ষার খুব কাছাকাছি
  2. সুস্পষ্ট (ডেটাগুলির জন্য এসকিউএল ফাইলগুলি ব্যবহার করা কোন পরীক্ষার মাধ্যমে কোন টুকরো ডেটা ব্যবহার করা হয় তা দেখতে খুব সমস্যাযুক্ত করে তোলে)
  3. সম্পর্কযুক্ত পরিবর্তন থেকে পরীক্ষা বিচ্ছিন্ন করুন।

মূলত এর অর্থ হ'ল এই ইউটিলিটিগুলি পরীক্ষার জন্য পরীক্ষার জন্য প্রয়োজনীয় প্রয়োজনীয় জিনিসগুলি ঘোষণামূলকভাবে মঞ্জুরি দেয় এবং অপ্রাসঙ্গিক জিনিসগুলি বাদ দেয়।

কি এটা বাস্তবে মানে কিছু ধারণা দিতে, কিছু দাও যা দিয়ে কাজ করে জন্য পরীক্ষার বিবেচনা Commentকরতে গুলি Postদ্বারা লিখিত গুলি Authors। এই জাতীয় ডিএওর জন্য সিআরইউডি অপারেশন পরীক্ষা করার জন্য ডিবিতে কিছু ডেটা তৈরি করা উচিত। পরীক্ষার মত দেখতে হবে:

@Test
public void savedCommentCanBeRead() {
    // Builder is needed to declaratively specify the entity with all attributes relevant
    // for this specific test
    // Missing attributes are generated with reasonable values
    // factory's responsibility is to create entity (and all entities required by it
    //  in our example Author) in the DB
    Post post = factory.create(PostBuilder.post());

    Comment comment = CommentBuilder.comment().forPost(post).build();

    sut.save(comment);

    Comment savedComment = sut.get(comment.getId());

    // this checks fields that are directly stored
    assertThat(saveComment, fieldwiseEqualTo(comment));
    // if there are some fields that are generated during save check them separately
    assertThat(saveComment.getGeneratedField(), equalTo(expectedValue));        
}

পরীক্ষার ডেটা সহ এসকিউএল স্ক্রিপ্ট বা এক্সএমএল ফাইলগুলির মধ্যে এটির বেশ কয়েকটি সুবিধা রয়েছে:

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

রোলব্যাক বনাম কমিট

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

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


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

সুতরাং স্পষ্টতার জন্য: আপনি কি আপনার অ্যাপ্লিকেশন জুড়ে ইউটিলিটি ফাংশন / ক্লাস ব্যবহার করছেন, বা কেবল আপনার পরীক্ষার জন্য?
এলা

@ এলা এই ইউটিলিটি ফাংশনগুলি সাধারণত টেস্ট কোডের বাইরে প্রয়োজন হয় না। সম্পর্কে উদাহরণস্বরূপ চিন্তা করুন PostBuilder.post()। এটি পোস্টের সমস্ত বাধ্যতামূলক বৈশিষ্ট্যের জন্য কিছু মান উত্পন্ন করে। এটি উত্পাদন কোডে প্রয়োজন হয় না needed
রোমান কনোভাল

2

জেডিবিসি ভিত্তিক প্রকল্পের জন্য (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে, উদাহরণস্বরূপ জেপিএ, ইজেবি, ...) আপনি পুরো ডাটাবেসকে মকআপ করতে পারবেন না (যেমন সেক্ষেত্রে একটি সত্যিকারের আরডিবিএমএসে একটি পরীক্ষার ডিবি ব্যবহার করা ভাল) তবে জেডিবিসি স্তরে কেবলমাত্র মকআপ ।

সুবিধা হ'ল বিমূর্ততা যা সেভাবে আসে, যেমনটি জেডিবিসি ডেটা (ফলাফল সেট, আপডেট গণনা, সতর্কতা, ...) ব্যান্ডএন্ড যা হয় তা হ'ল: আপনার প্রোড ডিবি, একটি পরীক্ষা ডিবি, বা প্রতিটি পরীক্ষার জন্য কিছু মকআপ ডেটা সরবরাহ করা হয় কেস।

প্রতিটি ক্ষেত্রে জেডিবিসি সংযোগ উপহাসের সাথে টেস্ট ডিবি পরিচালনা করার দরকার নেই (ক্লিনআপ, সময়ে কেবল একটি পরীক্ষা, ফিক্সচারগুলি পুনরায় লোড করুন, ...)। প্রতিটি মকআপ সংযোগ বিচ্ছিন্ন এবং পরিষ্কার করার দরকার নেই। জেডিবিসি এক্সচেঞ্জকে উপহাস করার জন্য প্রতিটি পরীক্ষার ক্ষেত্রে কেবলমাত্র ন্যূনতম প্রয়োজনীয় ফিক্সচার সরবরাহ করা হয়, যা পুরো টেস্ট ডিবি পরিচালনার জটিলতা এড়াতে সহায়তা করে।

অ্যাকোলেট হল আমার কাঠামো যা একটি জেডিবিসি ড্রাইভার এবং এই জাতীয় মকআপের জন্য ইউটিলিটি: http://acolyte.eu.org অন্তর্ভুক্ত

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