ডাটাবেস টেস্টিং। ডাটাবেস পরীক্ষা ব্যবসা প্রক্রিয়া চক্র পরীক্ষা

রিজওয়ান জাফরি ​​প্রবন্ধের অনুবাদ

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

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

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

একটি ডাটাবেস পরীক্ষা করার সময় কি পরীক্ষা করবেন?

1) তথ্য ম্যাপিং:
নিশ্চিত করুন যে ডাটাবেসের সংযোগগুলি ডিজাইন ডকুমেন্টেশনের সাথে মিলে যায়৷ সমস্ত CRUD ক্রিয়াকলাপের জন্য, ব্যবহারকারী যখন অ্যাপ্লিকেশন GUI থেকে সংরক্ষণ, রিফ্রেশ, অনুসন্ধান বা মুছুন ক্লিক করে তখন সংশ্লিষ্ট টেবিল এবং রেকর্ডগুলি আপডেট করা হয়েছে কিনা তা যাচাই করুন৷

2) ACID লেনদেনের বৈশিষ্ট্য:
লেনদেনের ACID বৈশিষ্ট্য অন্তর্ভুক্ত পারমাণবিকতা, পরবর্তী, অন্তরণএবং শক্তি. ডাটাবেস পরীক্ষার সময়, আপনার এই চারটি বৈশিষ্ট্য পরীক্ষা করা উচিত। ডাটাবেস বিতরণ করা হলে এই এলাকায় আরও ব্যাপক পরীক্ষার প্রয়োজন।

3) তথ্য অখণ্ডতা:
মনে রাখবেন যে বিভিন্ন অ্যাপ্লিকেশন মডিউল (যেমন স্ক্রিন এবং ফর্ম) একই ডেটা ব্যবহার করে এবং CRUD অপারেশনগুলি ভিন্নভাবে সম্পাদন করে। অতএব, আপনাকে নিশ্চিত করতে হবে যে ডেটার সর্বশেষ অবস্থা সর্বত্র সমানভাবে প্রতিফলিত হয়। সিস্টেমটি সমস্ত ফর্ম এবং স্ক্রিনে আপডেট হওয়া মানগুলি দেখাতে হবে। একে বলা হয় ডেটা ইন্টিগ্রিটি।

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

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

কিভাবে একটি ডাটাবেস পরীক্ষা করতে?

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

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

3. বিকাশকারী সহায়তা
এই সবচেয়ে সহজ উপায়। পরীক্ষক GUI-তে যেকোন CRUD ক্রিয়াকলাপ সম্পাদন করে এবং বিকাশকারীর দ্বারা লিখিত সংশ্লিষ্ট SQL প্রশ্নগুলি সম্পাদন করে তাদের ফলাফল যাচাই করে। এই পদ্ধতি SQL এর ভালো জ্ঞান বা অ্যাপ্লিকেশন ডাটাবেস কাঠামোর ভালো জ্ঞানের প্রয়োজন নেই।
তাই এই পদ্ধতি সহজ মনে হয় এবং ভাল পছন্দডাটাবেস পরীক্ষার জন্য। কিন্তু এর নেতিবাচক দিক হল বিশৃঙ্খলা। ডেভেলপারের লেখা ক্যোয়ারী শব্দার্থগতভাবে ভুল হলে বা ব্যবহারকারীর প্রয়োজনীয়তা সঠিকভাবে পূরণ না করলে কী হবে? এই ক্ষেত্রে, পরীক্ষা পণ্যের গুণমান সম্পর্কে কোন গ্যারান্টি প্রদান করে না।

উপসংহার

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

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

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

নিশ্চিত করুন যে আপনার pdo PHP এক্সটেনশন এবং ডাটাবেস এক্সটেনশন যেমন pdo_mysql ইনস্টল করা আছে। অন্যথায় নীচের উদাহরণ কাজ করবে না.

আপনি সম্ভবত আপনার দৈনন্দিন কাজ এবং প্রকল্পগুলি থেকে এই পরিস্থিতির সাথে পরিচিত যেখানে আপনি আপনার নতুন বা উন্নত PHPUnit দক্ষতাগুলি ব্যবহার করতে চান তবে আপনি নিম্নলিখিত সমস্যার মধ্যে একটির সম্মুখীন হন:

  1. একটি পদ্ধতি যেখানে আপনি একটি মোটামুটি বড় JOIN অপারেশন পরীক্ষা করতে চান এবং তারপর কিছু গুরুত্বপূর্ণ ফলাফল গণনা করার জন্য ফলাফল ডেটা ব্যবহার করুন৷
  2. আপনার ব্যবসায়িক যুক্তি SELECT, INSERT, UPDATE, এবং DELETE বিবৃতিগুলির একটি সম্পূর্ণ গুচ্ছ সম্পাদন করে৷
  3. পরীক্ষা করা পদ্ধতিগুলির জন্য উপযুক্ত প্রাথমিক ডেটা পেতে আপনাকে দুইটির বেশি টেবিলে পরীক্ষার ডেটা (সম্ভবত একটি উল্লেখযোগ্য পরিমাণ) কনফিগার করতে হবে।

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

সমর্থিত ডাটাবেস টেস্টিং বিক্রেতা

DbUnit বর্তমানে MySQL, PostgreSQL, Oracle এবং SQLite সমর্থন করে। জেন্ড ফ্রেমওয়ার্ক বা ডকট্রিন 2-এ ইন্টিগ্রেশনের মাধ্যমে, এই এক্সটেনশনটির অন্যান্য ডাটাবেস ম্যানেজমেন্ট সিস্টেম (DBMS), যেমন IBM DB2 বা Microsoft SQL সার্ভারে অ্যাক্সেস রয়েছে।

ডাটাবেস পরীক্ষায় অসুবিধা

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

  • ডাটাবেস স্কিমা এবং টেবিল
  • এই টেবিলের মধ্যে পরীক্ষার জন্য প্রয়োজনীয় সারি সন্নিবেশ করান
  • পরীক্ষা পাস করার পরে ডাটাবেসের অবস্থা পরীক্ষা করা হচ্ছে
  • প্রতিটি নতুন পরীক্ষার জন্য ডাটাবেস সাফ করা

যেহেতু অনেক ডাটাবেস API যেমন PDO, MySQLi বা OCI8 ব্যবহার করা কষ্টকর এবং লেখার জন্য ভার্বোস, তাই ম্যানুয়ালি এই পদক্ষেপগুলি সম্পাদন করা একটি দুঃস্বপ্ন হতে পারে।

পরীক্ষার কোড বিভিন্ন কারণে যতটা সম্ভব সংক্ষিপ্ত এবং সুনির্দিষ্ট হওয়া উচিত:

  • প্রোডাকশন কোডে ছোট পরিবর্তন করার সময় আপনি পরীক্ষার কোডের উল্লেখযোগ্য পরিমাণ পরিবর্তন করতে চান না।
  • আপনি চান যে আপনার পরীক্ষার কোডটি লেখার কয়েক মাস পরেও পড়তে এবং বোঝা সহজ হয়।

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

একটি মার্জিত উপায়ে একটি ডাটাবেসের বিরুদ্ধে পরীক্ষা করার সময় DbUnit এই সমস্ত সমস্যাগুলি সহজ করতে সহায়তা করে।

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

উদাহরণস্বরূপ, ডকট্রিন 2 প্রজেক্টের টেস্ট স্যুটে বর্তমানে প্রায় 1000টি পরীক্ষা রয়েছে, যার প্রায় অর্ধেকটি একটি ডাটাবেস ব্যবহার করে এবং যার সবকটি একটি স্ট্যান্ডার্ড ডেস্কটপ কম্পিউটারে একটি MySQL ডাটাবেস ব্যবহার করে 15 সেকেন্ডের মধ্যে চলে।

ডাটাবেস পরীক্ষার চারটি ধাপ

তার বই xUnit টেস্ট প্যাটার্নস-এ, জেরার্ড মেসজারোস ইউনিট পরীক্ষার চারটি পর্যায় তালিকাভুক্ত করেছেন:

    ফিক্সচার সেট আপ করা হচ্ছে

    পরীক্ষার অধীনে এক্সিকিউটিং সিস্টেম

    ফলাফল পরীক্ষা করা হচ্ছে

    পরিষ্কার করা (ছিঁড়ে ফেলা)

    একটি ফিক্সচার কি?

    একটি ফিক্সচার পরীক্ষাটি সম্পাদিত হওয়ার সময় আপনার অ্যাপ্লিকেশন এবং ডাটাবেসের প্রাথমিক অবস্থা বর্ণনা করে।

ডেটাবেস পরীক্ষার জন্য আপনার টেবিলে প্রয়োজনীয় ফিক্সচার ডেটা পরিষ্কার এবং লিখতে কমপক্ষে একটি সেটআপ এবং পরিষ্কারের প্রয়োজন। যাইহোক, পরীক্ষার সময় ডাটাবেসকে চারটি ধাপে পিছিয়ে যাওয়ার জন্য প্রসারিত করার একটি ভাল কারণ রয়েছে, ডাটাবেস ব্যবহার করে ওয়ার্কফ্লো তৈরি করা যা প্রতিটি পরীক্ষার জন্য চলে:

1. ডাটাবেস পরিষ্কার করা

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

2. ফিক্সচার সেট আপ করা

PHPUnit তারপর সমস্ত নির্দিষ্ট ফিক্সচার সারিগুলির মাধ্যমে পুনরাবৃত্তি করবে এবং উপযুক্ত টেবিলে তাদের সন্নিবেশ করবে।

3-5। পরীক্ষা চালানো, ফলাফল পরীক্ষা করা এবং পরিষ্কার করা

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

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

PHPUnit ডাটাবেস টেস্টকেস কনফিগারেশন

সাধারণত, PHPUnit ব্যবহার করার সময়, আপনার পরীক্ষাগুলি এইভাবে PHPUnit\Framework\TestCase থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে:

assertSame(2, 1 + 1); ))

আপনি যদি একটি ডাটাবেস ব্যবহার করে এমন কোড পরীক্ষা করতে চান তবে এই জাতীয় পরীক্ষা সেট আপ করা একটু বেশি জটিল কারণ আপনাকে আরেকটি বিমূর্ত ক্লাস, TestCase থেকে উত্তরাধিকার সূত্রে প্রাপ্ত করতে হবে, যার জন্য দুটি বিমূর্ত পদ্ধতি getConnection() এবং getDataSet() প্রয়োগ করতে হবে:

createDefaultDBConnection($pdo, ":memory:"); ) /** * @return PHPUnit\DbUnit\DataSet\IDataSet */ সর্বজনীন ফাংশন getDataSet() ( $this->createFlatXMLDataSet(dirname(__FILE__)."/_files/guestbook-seed.xml") ফেরত দিন; ))

getConnection বাস্তবায়ন ()

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

পূর্ববর্তী উদাহরণে, আমরা মেমরিতে একটি SQLite সংযোগ তৈরি করি এবং এটি createDefaultDBConnection পদ্ধতিতে পাস করি, যা PDO দৃষ্টান্ত এবং দ্বিতীয় প্যারামিটার (ডাটাবেস নাম) টাইপের একটি খুব সাধারণ ডাটাবেস বিমূর্ত স্তরে মোড়ানো হয়। PHPUnit \ DbUnit \ ডেটাবেস \ সংযোগ .

ডাটাবেস সংযোগ API ব্যবহার করা বিভাগটি এই ইন্টারফেসের API এবং কীভাবে আপনি এটিকে সর্বোত্তমভাবে ব্যবহার করতে পারেন তা ব্যাখ্যা করে।

getDataSet() বাস্তবায়ন

getDataSet() পদ্ধতি নির্ধারণ করে প্রতিটি পরীক্ষা চালানোর আগে ডাটাবেসের প্রাথমিক অবস্থা কেমন হওয়া উচিত। ডেটাবেস অবস্থা দুটি ধারণা ব্যবহার করে বিমূর্ত করা হয় - ডেটাসেট এবং ডেটাটেবল, যা ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয় PHPUnit\DbUnit\DataSet\IDataSetএবং PHPUnit\DbUnit\DataSet\IDataTableযথাক্রমে পরবর্তী বিভাগে এই ধারণাগুলি কীভাবে কাজ করে এবং ডাটাবেস পরীক্ষায় ব্যবহার করার সময় তাদের সুবিধাগুলি কী তা বিশদ বিবরণ দেবে।

বাস্তবায়নের জন্য, আমাদের শুধুমাত্র জানতে হবে যে getDataSet() পদ্ধতিটি সেটআপ() এর সময় ফিক্সচার ডেটা সেট পুনরুদ্ধার করতে এবং ডাটাবেসের মধ্যে প্রবেশ করার জন্য শুধুমাত্র একবার কল করা হয়। এই উদাহরণে আমরা কারখানা পদ্ধতি ব্যবহার করছি CreateFlatXMLDataSet($filename), যা একটি XML উপস্থাপনার উপর ভিত্তি করে একটি ডেটাসেট।

ডাটাবেস স্কিমা (DDL) সম্পর্কে কি?

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

একটি ডাটাবেসের সাথে পরীক্ষার জন্য এই পূর্বশর্তটি অর্জন করার বিভিন্ন উপায় রয়েছে।

  1. আপনি যদি একটি স্থায়ী সংযোগ ডাটাবেস ব্যবহার করেন (এসকিউএল-ইন-মেমরি নয়), আপনি MySQL-এর জন্য phpMyAdmin-এর মতো টুল ব্যবহার করে একবার সহজেই ডাটাবেস সেট আপ করতে পারেন এবং প্রতিবার পরীক্ষা চালানোর সময় ডাটাবেসটি পুনরায় ব্যবহার করতে পারেন।
  2. আপনি যদি ডকট্রিন 2 বা প্রোপেলের মতো লাইব্রেরি ব্যবহার করেন, আপনি একটি ডাটাবেস স্কিমা তৈরি করতে তাদের API ব্যবহার করতে পারেন, যা আপনার পরীক্ষা চালানোর আগে আপনার শুধুমাত্র একবার প্রয়োজন হবে। আপনি PHPUnit এর বুটস্ট্র্যাপ এবং কনফিগারেশন ক্ষমতা ব্যবহার করতে পারেন প্রতিবার আপনার পরীক্ষা চালানোর সময় এই কোডটি চালানোর জন্য।

PHPUnit ডাটাবেস টেস্টকেস

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

conn === null) (যদি (self::$pdo === null) ( self::$pdo = new PDO("sqlite::memory:"); ) $this->conn = $this->createDefaultDBConnection (self::$pdo, ":memory:" ) $this->conn ফেরত দিন; ))

যাইহোক, এই ডাটাবেস সংযোগটি PDO সংযোগে হার্ড কোডেড। PHPUnit এর একটি আশ্চর্যজনক বৈশিষ্ট্য রয়েছে যা এই পরীক্ষা ক্লাসটিকে আরও বহুমুখী করতে সহায়তা করে। আপনি যদি XML কনফিগারেশন ব্যবহার করেন, আপনি প্রতিটি পরীক্ষা চালানোর জন্য ডাটাবেস সংযোগ কাস্টমাইজযোগ্য করতে পারেন। প্রথমে, নিম্নলিখিত বিষয়বস্তু সহ অ্যাপ্লিকেশনের tests/ ডিরেক্টরিতে একটি "phpunit.xml" ফাইল তৈরি করা যাক:

এখন আমরা এই মত দেখতে পরীক্ষার ক্লাস পরিবর্তন করতে পারি:

conn === null) (যদি (self::$pdo === null) ( self::$pdo = new PDO($GLOBALS["DB_DSN"], $GLOBALS["DB_USER"], $GLOBALS["DB_PASSWD "]); ) $this->conn = $this->createDefaultDBConnection(self::$pdo, $GLOBALS["DB_DBNAME"]); ) $this->conn ফেরত দিন; ))

আমরা এখন কমান্ড লাইন ইন্টারফেস থেকে বিভিন্ন কনফিগারেশন ব্যবহার করে ডাটাবেস টেস্ট স্যুট চালাতে পারি:

$ user@desktop> phpunit --configuration developer-a.xml MyTests/ $ user@desktop> phpunit --configuration developer-b.xml MyTests/

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

ডেটাসেট এবং ডেটা টেবিল বোঝা

PHPUnit ডাটাবেস এক্সটেনশনের পিছনে মূল ধারণা হল DataSets এবং DataTables। PHPUnit ব্যবহার করে ডাটাবেস টেস্টিং আয়ত্ত করতে আপনার এই সহজ ধারণাটি বোঝার চেষ্টা করা উচিত। DataSet এবং DataTable হল ডাটাবেসের সারি এবং কলামের চারপাশে বিমূর্ততার স্তর। একটি সাধারণ API একটি অবজেক্ট স্ট্রাকচারে একটি ডাটাবেসের মূল বিষয়বস্তু লুকিয়ে রাখে যা ডাটাবেস ব্যতীত অন্য উত্স দ্বারা প্রয়োগ করা যেতে পারে।

এই বিমূর্ততাটি প্রত্যাশিতগুলির সাথে ডাটাবেসের বর্তমান বিষয়বস্তুর তুলনা করার জন্য প্রয়োজনীয়। প্রত্যাশিত বিষয়বস্তু XML, YAML, CSV বা PHP অ্যারে ফাইলের আকারে হতে পারে, উদাহরণস্বরূপ। DataSet এবং DataTable ইন্টারফেসগুলি শব্দার্থগতভাবে অনুরূপ পদ্ধতিতে একটি রিলেশনাল ডাটাবেস স্টোরকে অনুকরণ করে এই ধারণাগতভাবে ভিন্ন উত্সগুলির তুলনা করার অনুমতি দেয়।

আপনার পরীক্ষায় ডাটাবেস দাবীর জন্য কর্মপ্রবাহ তাই তিনটি সহজ পদক্ষেপ নিয়ে গঠিত:

  • টেবিলের নাম দ্বারা ডাটাবেসের এক বা একাধিক টেবিল সনাক্ত করুন (প্রকৃত ডেটা সেট)
  • পছন্দের বিন্যাসে প্রত্যাশিত ডেটা সেট নির্দিষ্ট করুন (YAML, XML, ..)
  • বিবৃতিটি পরীক্ষা করুন যে ডেটা সেটের উভয় উপস্থাপনা একে অপরের সমান (সমতুল্য)।

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

  • ডেটাসেটে নির্দিষ্ট করা টেবিল থেকে সমস্ত সারি মুছে দেয়।
  • ডাটাবেসের ডাটা টেবিলে সব সারি লেখে।

উপলব্ধ বাস্তবায়ন

তিনটি ভিন্ন ধরনের ডেটাসেট/ডেটা টেবিল রয়েছে:

  • ফাইল-ভিত্তিক ডেটাসেট এবং ডেটা টেবিল
  • ক্যোয়ারী ভিত্তিক ডেটাসেট এবং ডেটা টেবিল
  • ফিল্টার করুন এবং DataSets এবং DataTables যোগদান করুন

ডেটা এবং টেবিলের ফাইল সেটগুলি সাধারণত প্রাথমিক ফিক্সচারের জন্য ব্যবহৃত হয় এবং ডাটাবেসের প্রত্যাশিত অবস্থা বর্ণনা করে।

ফ্ল্যাট এক্সএমএল ডেটাসেট

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

এটি স্পষ্টতই লেখা সহজ। এই উদাহরণে - টেবিলের নাম যেখানে চারটি কলাম সহ দুটি সারি “id”, “content”, “user” এবং “created” তাদের সংশ্লিষ্ট মানগুলির সাথে যোগ করা হয়েছে।

যাইহোক, এই সরলতা একটি মূল্য আসে.

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

সাধারণ XML ডেটা সেটগুলিতে NULL মানগুলি পরিচালনা করা ক্লান্তিকর। NULL মান প্রায় যেকোনো ডাটাবেসের খালি স্ট্রিং মান থেকে আলাদা (ওরাকল একটি ব্যতিক্রম), যা নিয়মিত XML বিন্যাসে বর্ণনা করা কঠিন। আপনি স্ট্রিং (রেকর্ড) থেকে অ্যাট্রিবিউট বাদ দিয়ে একটি NULL মান উপস্থাপন করতে পারেন। যদি আমাদের গেস্টবুক "ব্যবহারকারী" কলামে একটি NULL মান দ্বারা উপস্থাপিত বেনামী এন্ট্রির অনুমতি দেয়, তাহলে গেস্টবুক টেবিলের একটি অনুমানমূলক অবস্থা হতে পারে:

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

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

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

কার্যকরভাবে ফ্ল্যাট এক্সএমএল ডেটাসেট ব্যবহার করার জন্য যখন NULL মানগুলি গুরুত্বপূর্ণ, প্রতিটি টেবিলের প্রথম সারিতে অবশ্যই NULL মান থাকবে না এবং শুধুমাত্র পরবর্তী সারিগুলি বৈশিষ্ট্যগুলি বাদ দিতে পারে৷ এটি অসুবিধাজনক হতে পারে কারণ সারি ক্রম ডাটাবেস দাবির জন্য একটি গুরুত্বপূর্ণ ফ্যাক্টর।

পরিবর্তে, যদি আপনি একটি ফ্ল্যাট XML ডেটাসেটে টেবিল কলামের একটি উপসেট নির্দিষ্ট করেন, তাহলে সমস্ত অনুপস্থিত মানগুলি ডিফল্ট মানগুলিতে সেট করা হবে। অনুপস্থিত কলামগুলির একটিকে "NOT NULL DEFAULT NULL" হিসাবে সংজ্ঞায়িত করা হলেই এটি ত্রুটি তৈরি করবে৷

উপসংহারে, আমি কেবলমাত্র ফ্ল্যাট এক্সএমএল ডেটাসেটগুলি ব্যবহার করার পরামর্শ দিতে পারি যদি আপনার শূন্য মানগুলির প্রয়োজন না হয়।

আপনি পদ্ধতিতে কল করে ডেটাবেস টেস্টকেসের মধ্যে একটি নিয়মিত এক্সএমএল ডেটাসেট ইনস্ট্যান্ট করতে পারেন CreateFlatXmlDataSet($filename) :

createFlatXmlDataSet("myFlatXmlFixture.xml"); ))

XML ডেটাসেট

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

, , , এবং . ফ্ল্যাট এক্সএমএল ব্যবহার করে পূর্বে সংজ্ঞায়িত গেস্টবুকের জন্য সমতুল্য ডেটা সেট দেখতে এইরকম হবে:

আইডিবিষয়বস্তুব্যবহারকারীতৈরি 1 ওহে, বন্ধু আমার! জো 2010-04-24 17:15:23 2 আমি এটা পছন্দ করি! 2010-04-26 12:14:20

কোনো নির্দিষ্ট ট্যাগ

একটি নাম আছে এবং সমস্ত কলামকে তাদের নামের সাথে সংজ্ঞায়িত করতে হবে। এতে শূন্য বা যেকোনো ধনাত্মক সংখ্যা নেস্টেড উপাদান থাকতে পারে . অনুপস্থিত উপাদান `` মানে টেবিল খালি। ট্যাগ `` এবং পূর্বে উল্লিখিত উপাদানের ক্রমে নির্দিষ্ট করা আবশ্যক . ট্যাগ , স্পষ্টতই মানে হল মানটি NULL।

আপনি createXmlDataSet($filename) পদ্ধতিতে কল করে ডেটাবেস টেস্টকেসের ভিতরে একটি XML ডেটাসেট ইনস্ট্যান্ট করতে পারেন:

createXMLDataSet("myXmlFixture.xml"); ))

মাইএসকিউএল এক্সএমএল ডেটাসেট

এই নতুন XML ফর্ম্যাটটি বিশেষভাবে MySQL ডাটাবেস সার্ভারের জন্য ডিজাইন করা হয়েছে। এটির সমর্থন PHPUnit 3.5 এ যোগ করা হয়েছে। এই বিন্যাসের ফাইলগুলি mysqldump ইউটিলিটি ব্যবহার করে তৈরি করা যেতে পারে। CSV ডেটাসেটের বিপরীতে, যা mysqldumpও সমর্থন করে, এই XML ফর্ম্যাটে একটি একক ফাইল একাধিক টেবিলের জন্য ডেটা থাকতে পারে। আপনি এই ধরনের mysqldump চালিয়ে এই বিন্যাসে একটি ফাইল তৈরি করতে পারেন:

$ mysqldump --xml -t -u --password= > /path/to/file.xml

এই ফাইলটি পদ্ধতিতে কল করে আপনার ডেটাবেস টেস্টকেসে ব্যবহার করা যেতে পারে CreateMySQLXMLDataSet($filename) :

createMySQLXMLDataSet("/path/to/file.xml"); ))

YAML ডেটাসেট

বিকল্পভাবে, আপনি গেস্টবুকের উদাহরণের জন্য YAML ডেটাসেট ব্যবহার করতে পারেন:

গেস্টবুক: - আইডি: 1 বিষয়বস্তু: "হ্যালো, বন্ধু!" ব্যবহারকারী: "joe" তৈরি করা হয়েছে: 2010-04-24 17:15:23 - id: 2 বিষয়বস্তু: "আমি এটা পছন্দ করি!" ব্যবহারকারী: তৈরি: 2010-04-26 12:14:20

এই বিন্যাসটি সহজ এবং সুবিধাজনক, এবং সবচেয়ে গুরুত্বপূর্ণভাবে, এটি একটি অনুরূপ ফ্ল্যাট এক্সএমএল ডেটা সেটে NULL এর সমস্যা সমাধান করে। YAML-এ NULL হল একটি কলামের নাম যার কোনো মান নির্দিষ্ট করা নেই। একটি খালি স্ট্রিং এইভাবে নির্দিষ্ট করা হয়েছে - কলাম 1: ""।

বর্তমানে YAML DataSet-এর ডেটাবেস TestCase-এ ফ্যাক্টরি পদ্ধতি নেই, তাই আপনাকে নিজেই একটি তৈরি করতে হবে:

CSV ডেটাসেট

CSV ফর্ম্যাটের উপর ভিত্তি করে আরেকটি ফাইল ডেটা সেট। ডেটাসেটের প্রতিটি টেবিল একটি CSV ফাইল দ্বারা উপস্থাপিত হয়। আমাদের গেস্টবুক উদাহরণের জন্য, আমরা guestbook-table.csv ফাইলটি সংজ্ঞায়িত করি:

আইডি,কন্টেন্ট,ব্যবহারকারী, 1 তৈরি করেছে,"হে বন্ধু!","জো","2010-04-24 17:15:23" 2,"আমি এটা পছন্দ করি!","ন্যান্সি","2010-04- 26 12:14:20"

যদিও এটি Excel বা OpenOffice এর মাধ্যমে সম্পাদনা করার জন্য খুবই সুবিধাজনক, আপনি একটি CSV ডেটা সেটে NULL মান নির্দিষ্ট করতে পারবেন না। একটি খালি কলাম ডাটাবেসের কলামে একটি খালি মান ঢোকানোর কারণ হবে।

আপনি এইভাবে একটি CSV ডেটাসেট তৈরি করতে পারেন:

addTable("গেস্টবুক", dirname(__FILE__)।"/_files/guestbook.csv"); $dataSet ফেরত দিন; ))

অ্যারে ডেটাসেট

PHPUnit ডাটাবেস এক্সটেনশনে কোনো ডেটাসেট-ভিত্তিক অ্যারে (এখনও) নেই, তবে আমরা সহজেই আমাদের নিজস্ব বাস্তবায়ন করতে পারি। একটি উদাহরণ গেস্ট বই এই মত হওয়া উচিত:

[ [ "id" => 1, "content" => "হাই, বন্ধু!", "user" => "joe", "created" => "2010-04-24 17:15:23" ], [ "id" => 2, "content" => "আমি এটা পছন্দ করি!", "user" => null, "created" => "2010-04-26 12:14:20" ], ], ]); ))

অন্যান্য সমস্ত ফাইল-ভিত্তিক ডেটা সেটের তুলনায় ডেটাসেট পিএইচপি-র সুস্পষ্ট সুবিধা রয়েছে:

  • পিএইচপি অ্যারে স্পষ্টতই NULL মানগুলি পরিচালনা করতে পারে।
  • আপনার দাবির জন্য অতিরিক্ত ফাইলের প্রয়োজন নেই এবং সেগুলি সরাসরি TestCase-এ ব্যবহার করতে পারেন।

এই সেটটিকে ফ্ল্যাট XML, CSV, বা YAML-এর মতো দেখতে, তালিকাভুক্ত প্রথম সারির কীগুলি টেবিলের কলামগুলির নামগুলিকে সংজ্ঞায়িত করে, যা পূর্ববর্তী ক্ষেত্রে "id", "সামগ্রী", "ব্যবহারকারী" এবং "তৈরি করা হবে" "

একটি DataSet অ্যারের বাস্তবায়ন সহজ এবং সহজবোধ্য:

$rows) ( $columns = ; if (isset($rows)) ( $columns = array_keys($rows); ) $metaData = new DefaultTableMetaData($tableName, $columns); $table = new DefaultTable($metaData); foreach ($rows হিসেবে $row) ( $table->addRow($row); ) $this->tables[$tableName] = $table) ) সুরক্ষিত ফাংশন createIterator($reverse = false) ( নতুন DefaultTableIterator($ this) ->টেবিল, $রিভার্স); "); ) $this->টেবিল [$tableName] ফেরত দিন; ) )

প্রশ্ন (SQL) ডেটাসেট

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

getConnection()); $ds->addTable("গেস্টবুক");

শুধুমাত্র নামের দ্বারা একটি টেবিল যোগ করা নিম্নলিখিত প্রশ্নের সাথে একটি ডেটা টেবিল সংজ্ঞায়িত করার একটি অন্তর্নিহিত উপায়:

getConnection()); $ds->addTable("গেস্টবুক", "সিলেক্ট * ফ্রম গেস্টবুক");

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

getConnection()); $ds->addTable("গেস্টবুক", "সিলেক্ট আইডি, গেস্টবুক থেকে কন্টেন্ট ORDER BY DESC");

Database Assertions বিভাগটি কিভাবে Query DataSet ব্যবহার করতে হয় তার বিশদ প্রদান করবে।

ডেটাবেস (ডিবি) ডেটাসেট

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

testGuestbook() তে দেখানো হিসাবে আপনি হয় সমগ্র ডাটাবেসের জন্য একটি ডেটাসেট তৈরি করতে পারেন, অথবা testFilteredGuestbook() পদ্ধতিতে দেখানো হিসাবে একটি সাদাতালিকা ব্যবহার করে নির্দিষ্ট টেবিলের নামের সেটে সীমাবদ্ধ করতে পারেন।

createDefaultDBConnection($pdo, $database); ) পাবলিক ফাংশন testGuestbook() ( $dataSet = $this->getConnection()->createDataSet(); // ... ) পাবলিক ফাংশন testFilteredGuestbook() ( $tableNames = ["গেস্টবুক"]; $dataSet = $this- >getConnection()->createDataSet($tableNames);

ডেটাসেট প্রতিস্থাপন

আমি ফ্ল্যাট এক্সএমএল এবং সিএসভি ডেটাসেটের NULL-এর সমস্যাগুলির বিষয়ে কথা বলেছি, তবে উভয় ডেটাসেট NULL-এর সাথে কাজ করার জন্য কিছুটা জটিল সমাধান রয়েছে।

Replace DataSet হল একটি বিদ্যমান ডেটা সেটের জন্য একটি সাজসজ্জা যা আপনাকে ডেটা সেটের যেকোনো কলামে অন্য প্রতিস্থাপন মান দিয়ে মান প্রতিস্থাপন করতে দেয়। NULL মানগুলির সাথে কাজ করা আমাদের গেস্টবুকের একটি উদাহরণ পেতে, আমরা নিম্নরূপ ফাইলটি নির্দিষ্ট করি:

তারপরে আমরা ফ্ল্যাট এক্সএমএল ডেটাসেটকে একটি প্রতিস্থাপন ডেটাসেটে মোড়ানো:

createFlatXmlDataSet("myFlatXmlFixture.xml"); $rds = নতুন PHPUnit\DbUnit\DataSet\ReplacementDataSet($ds); $rds->addFullReplacement("##NULL##", null); $rds ফেরত; ))

ডেটাসেট ফিল্টার

আপনার যদি একটি বড় ফিক্সচার ফাইল থাকে, তাহলে সাবসেটে থাকা উচিত এমন টেবিল এবং কলামগুলির একটি সাদা এবং কালো তালিকা তৈরি করতে আপনি ডেটাসেট ফিল্টারিং ব্যবহার করতে পারেন। এটি বিশেষ করে ডেটা সেট কলাম ফিল্টার করার জন্য একটি DB ডেটাসেটের সাথে একত্রে কার্যকর।

getConnection()->createDataSet(); $filterDataSet = নতুন PHPUnit\DbUnit\DataSet\DataSetFilter($dataSet); $filterDataSet->addIncludeTables(["গেস্টবুক"]); $filterDataSet->setIncludeColumnsForTable("গেস্টবুক", ["id", "content"]); //। $filterDataSet->addExcludeTables(["foo", "bar", "baz"]); // শুধুমাত্র গেস্টবুক টেবিল রাখুন। ); // ..))

আপনি একই সময়ে একই টেবিলে কলাম ফিল্টারিং বর্জন এবং সক্ষম করতে পারবেন না, শুধুমাত্র বিভিন্নটিতে। উপরন্তু, এটি শুধুমাত্র সাদাতালিকা বা ব্ল্যাকলিস্ট টেবিলের জন্যই সম্ভব, উভয় নয়।

কম্পোজিট ডেটাসেট

একটি কম্পোজিট ডেটাসেট একটি ডেটা সেটে ইতিমধ্যে বিদ্যমান একাধিক ডেটা সেটকে একত্রিত করার (একত্রিত) জন্য খুব দরকারী। যখন একাধিক ডেটাসেটে একই টেবিল থাকে, তখন নির্দিষ্ট ক্রমে সারি যোগ করা হয়। উদাহরণস্বরূপ, যদি আমাদের দুটি ডেটা সেট থাকে - fixture1.xml:

এবং fixture2.xml:

একটি যৌগিক ডেটাসেট ব্যবহার করে, আমরা উভয় ফিক্সচার ফাইল একত্রিত করতে পারি:

createFlatXmlDataSet("fixture1.xml"); $ds2 = $this->createFlatXmlDataSet("fixture2.xml"); $compositeDs = নতুন PHPUnit\DbUnit\DataSet\CompositeDataSet(); $compositeDs->addDataSet($ds1); $compositeDs->addDataSet($ds2); $compositeDs ফেরত দিন; ))

বিদেশী চাবি থেকে সাবধান

আপনি যখন একটি ডাটাবেস এক্সটেনশন ফিক্সচার ইনস্টল করেন, তখন PHPUnit আপনার ফিক্সচারে নির্দিষ্ট করা ক্রমে ডাটাবেসের মধ্যে সারিগুলি সন্নিবেশিত করে। যদি আপনার ডাটাবেস স্কিমা বিদেশী কী ব্যবহার করে, তাহলে এর মানে হল যে আপনাকে এমন একটি ক্রমে টেবিলগুলি নির্দিষ্ট করতে হবে যা বিদেশী কী সীমাবদ্ধতা লঙ্ঘন করে না।

আপনার নিজস্ব DataSets/DataTables বাস্তবায়ন করা

DataSets এবং DataTables এর অভ্যন্তরীণ বিষয়গুলি বোঝার জন্য, আসুন DataSet ইন্টারফেসটি একবার দেখে নেওয়া যাক। আপনি যদি নিজের ডেটাসেট বা ডেটাটেবিল বাস্তবায়নের পরিকল্পনা না করেন তবে আপনি এই অংশটি এড়িয়ে যেতে পারেন।

ডাটা সেটের গুণমান পরীক্ষা করার জন্য ডাটাবেস টেস্টকেসে assertDataSetsEqual() দাবির ভিতরে পাবলিক ইন্টারফেস ব্যবহার করা হয়। IteratorAggregate ইন্টারফেস থেকে, IDataSet ডেটা সেটের সমস্ত টেবিলে পুনরাবৃত্তি করার জন্য getIterator() পদ্ধতির উত্তরাধিকারী হয়। বিপরীত পুনরাবৃত্তিকারী PHPUnit-কে বিদেশী কী সীমাবদ্ধতাগুলি পূরণ করতে তাদের তৈরির বিপরীত ক্রমে টেবিলের সারিগুলি সাফ করার অনুমতি দেয়।

বাস্তবায়নের উপর নির্ভর করে, একটি ডেটাসেটে টেবিলের উদাহরণ যোগ করতে বিভিন্ন পদ্ধতি ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি উৎস ফাইল থেকে সমস্ত ফাইল-ভিত্তিক ডেটাসেটে তৈরি করার সময় টেবিলগুলি অভ্যন্তরীণভাবে যোগ করা হয়, যেমন YamlDataSet, XmlDataSet, বা FlatXmlDataSet।

টেবিলটি নিম্নলিখিত ইন্টারফেস দ্বারাও প্রতিনিধিত্ব করা হয়:

getTableMetaData() পদ্ধতি ব্যতীত, যা স্ব-ব্যাখ্যামূলক। ব্যবহৃত পদ্ধতিগুলি বিভিন্ন ডাটাবেস এক্সটেনশন দাবীর জন্য প্রয়োজনীয়, যা পরবর্তী অধ্যায়ে ব্যাখ্যা করা হয়েছে। getTableMetaData() পদ্ধতিটি অবশ্যই ইন্টারফেসের একটি বাস্তবায়ন প্রদান করবে PHPUnit\DbUnit\DataSet\ITableMetaData, যা টেবিলের গঠন বর্ণনা করে। এতে নিম্নলিখিত তথ্য রয়েছে:

  • টেবিলের নাম
  • টেবিল কলাম নামের একটি অ্যারে, ফলাফল সেটে তাদের উপস্থিতির দ্বারা ক্রমানুযায়ী।
  • প্রাথমিক কী কলামের একটি অ্যারে।

এই ইন্টারফেসে একটি দাবীও রয়েছে যা পরীক্ষা করে যে টেবিল মেটাডেটার দুটি দৃষ্টান্ত একে অপরের সমান কিনা, যা ডেটা সেট সমতা দাবী দ্বারা ব্যবহৃত হয়।

ডেটাবেস সংযোগ API ব্যবহার করে

সংযোগ ইন্টারফেসে তিনটি আকর্ষণীয় পদ্ধতি রয়েছে যা ডাটাবেস টেস্টকেসে getConnection() পদ্ধতি থেকে ফেরত দিতে হবে:

  1. createDataSet() পদ্ধতি একটি ডেটাবেস (DB) DataSet তৈরি করে, যেমনটি DataSet বাস্তবায়ন বিভাগে বর্ণিত হয়েছে।
getConnection()->createDataSet(); ))

2. createQueryTable() পদ্ধতিটি ফলাফলের নাম এবং SQL ক্যোয়ারী পাস করে QueryTable উদাহরণ তৈরি করতে ব্যবহার করা যেতে পারে। এটি একটি সুবিধাজনক পদ্ধতি যখন এটি ফলাফল/সারণী দাবীর কথা আসে, যেমনটি পরবর্তী বিভাগে দেখানো হবে, ডেটাবেস অ্যাসারশন API।

getConnection()->createQueryTable("গেস্টবুক", "সিলেক্ট * ফ্রম গেস্টবুক"); ))

3. getRowCount() পদ্ধতিটি একটি টেবিলে সারিগুলির সংখ্যা অ্যাক্সেস করার একটি সুবিধাজনক উপায়, অগত্যা একটি অতিরিক্ত যেখানে ধারা দ্বারা ফিল্টার করা হয় না। এটি একটি সাধারণ সমতা বিবৃতি দিয়ে ব্যবহার করা যেতে পারে:

assertSame(2, $this->getConnection()->getRowCount("গেস্টবুক")); ))

ডাটাবেস অ্যাসারশন API

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

সারণী সারির সংখ্যা জাহির করা

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

assertSame(2, $this->getConnection()->getRowCount("গেস্টবুক"), "প্রি-কন্ডিশন"); $গেস্টবুক = নতুন গেস্টবুক(); $guestbook->addEntry("সুজি", "হ্যালো ওয়ার্ল্ড!"); $this->assertSame(3, $this->getConnection()->getRowCount("গেস্টবুক"), "ঢোকানো ব্যর্থ হয়েছে"); ))

টেবিল রাষ্ট্র দাবী

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

এটি করার জন্য, আমাদের একটি ক্যোয়ারী টেবিল উদাহরণ সংজ্ঞায়িত করতে হবে যা টেবিলের নাম এবং SQL ক্যোয়ারী দ্বারা বিষয়বস্তু আউটপুট করে এবং এটি একটি ফাইল/অ্যারে ভিত্তিক ডেটাসেটের সাথে তুলনা করে:

addEntry("সুজি", "হ্যালো ওয়ার্ল্ড!"); $queryTable = $this->getConnection()->createQueryTable("গেস্টবুক", "সিলেক্ট * ফ্রম গেস্টবুক"); $expectedTable = $this->createFlatXmlDataSet("expectedBook.xml") ->getTable("গেস্টবুক"); $এই->

এখন এই স্টেটমেন্টের জন্য আমাদের একটি নিয়মিত XML ফাইল তৈরি করতে হবে expectBook.xml:

এই দাবিটি তখনই সফল হবে যদি এটি ঠিক সময়ে চালানো হয় 2010–05–01 21:47:08 . একটি ডাটাবেসের বিরুদ্ধে পরীক্ষা করার সময় তারিখগুলি একটি বিশেষ সমস্যা, এবং আমরা দাবীতে "তৈরি করা" কলামটি বাদ দিয়ে এই ত্রুটিটি সমাধান করতে পারি।

সামঞ্জস্যপূর্ণ ফ্ল্যাট এক্সএমএল ফাইল expectBook.xmlদাবি পাস করার জন্য সম্ভবত এখন এই মত দেখা উচিত:

আমাদের ক্যোয়ারী টেবিল কল ঠিক করতে হবে:

getConnection()->createQueryTable("গেস্টবুক", "সিলেক্ট আইডি, কন্টেন্ট, ইউজার ফ্রম গেস্টবুক");

অনুরোধ ফলাফল অনুমোদন

আপনি ক্যোয়ারী টেবিল পদ্ধতি ব্যবহার করে জটিল প্রশ্নের ফলাফল যাচাই করতে পারেন কেবলমাত্র ক্যোয়ারী ফলাফলের নাম উল্লেখ করে এবং ডেটাসেটের সাথে তুলনা করে:

getConnection()->createQueryTable("myComplexQuery", "SELECT complexQuery..."); $expectedTable = $this->createFlatXmlDataSet("complexQueryAssertion.xml") ->getTable("myComplexQuery"); $this->assertTablesEqual($expectedTable, $queryTable); ))

একাধিক টেবিলের অবস্থা জাহির করা

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

  1. আপনি সংযোগ থেকে ডেটাবেস (DB) ডেটাসেট ব্যবহার করতে পারেন এবং এটি একটি ফাইল-ভিত্তিক ডেটাসেটের সাথে তুলনা করতে পারেন।

getConnection()->createDataSet(["গেস্টবুক"]); $expectedDataSet = $this->createFlatXmlDataSet("guestbook.xml"); $this->assertDataSetsEqual($expectedDataSet, $dataSet); ))

2. আপনি নিজেই ডেটাসেট তৈরি করতে পারেন:

    addTable("গেস্টবুক", "সিলেক্ট আইডি, কন্টেন্ট, ইউজার ফ্রম গেস্টবুক"); // অতিরিক্ত টেবিল $expectedDataSet = $this->createFlatXmlDataSet("guestbook.xml"); $this->assertDataSetsEqual($expectedDataSet, $dataSet); ))

FAQ

PHPUnit (পুনরায়) প্রতিটি পরীক্ষার জন্য স্কিমা ডাটাবেস তৈরি করবে?

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

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

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

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

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

ডাটাবেস পরীক্ষা করার সময় আপনার আর কী পরীক্ষা করা উচিত?

তথ্য ম্যাপিং

নিশ্চিত করুন যে ডাটাবেসের সংযোগগুলি ডিজাইন ডকুমেন্টেশনের সাথে মিলে যায়৷ সমস্ত CRUD ক্রিয়াকলাপের জন্য, ব্যবহারকারী যখন অ্যাপ্লিকেশন GUI থেকে সংরক্ষণ, রিফ্রেশ, অনুসন্ধান বা মুছুন ক্লিক করে তখন সংশ্লিষ্ট টেবিল এবং রেকর্ডগুলি আপডেট করা হয়েছে কিনা তা যাচাই করুন৷

ACID লেনদেনের বৈশিষ্ট্য

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

তথ্য অখণ্ডতা

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

ব্যবসায়িক যুক্তি বাস্তবায়নের যথার্থতা

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

কিভাবে একটি ডাটাবেস পরীক্ষা করতে?

এসকিউএল কোয়েরি লেখা

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

টেবিলে ডেটা দেখা হচ্ছে

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

বিকাশকারী সহায়তা

পরীক্ষক GUI-তে যেকোন CRUD ক্রিয়াকলাপ সম্পাদন করে এবং বিকাশকারীর দ্বারা লিখিত সংশ্লিষ্ট SQL প্রশ্নগুলি সম্পাদন করে তাদের ফলাফল যাচাই করে। এই পদ্ধতির জন্য SQL এর ভাল জ্ঞান বা অ্যাপ্লিকেশন ডাটাবেস কাঠামোর ভাল জ্ঞানের প্রয়োজন হয় না। কিন্তু এর নেতিবাচক দিক হল বিশৃঙ্খলা। ডেভেলপারের লেখা ক্যোয়ারী শব্দার্থগতভাবে ভুল হলে বা ব্যবহারকারীর প্রয়োজনীয়তা সঠিকভাবে পূরণ না করলে কী হবে? এই ক্ষেত্রে, পরীক্ষা পণ্যের গুণমান সম্পর্কে কোন গ্যারান্টি প্রদান করে না।

ডাটাবেস ডেটা অখণ্ডতা পরীক্ষার জন্য একটি পদ্ধতির উদাহরণ

ডাটাবেস এবং ডাটাবেস প্রক্রিয়া একটি স্বাধীন সাবসিস্টেম হিসাবে পরীক্ষা করা উচিত। এই ক্ষেত্রে, ডেটার ইন্টারফেস হিসাবে লক্ষ্য ব্যবহারকারী ইন্টারফেস ছাড়া সমস্ত সাবসিস্টেম অবশ্যই পরীক্ষা করা উচিত। নিম্নলিখিত সারণীতে সংজ্ঞায়িত পরীক্ষাকে সমর্থন করার জন্য সরঞ্জাম এবং কৌশলগুলি নির্ধারণ করতে ডেটাবেস ম্যানেজমেন্ট সিস্টেমে (DBMS) অতিরিক্ত গবেষণা করা উচিত।

পদ্ধতির লক্ষ্য ডাটাবেস অ্যাক্সেসের পদ্ধতি এবং UI থেকে স্বাধীন প্রক্রিয়াগুলির পরীক্ষা, যাতে ত্রুটিপূর্ণ লক্ষ্য অ্যালগরিদম বা ডেটা দুর্নীতি পর্যবেক্ষণ এবং রেকর্ড করা যায়।
পদ্ধতি প্রতিটি ডাটাবেস অ্যাক্সেস পদ্ধতি বা প্রক্রিয়া কল করুন, বৈধ এবং অবৈধ ডেটা বা ডেটা অনুরোধের সাথে প্রতিটিকে পপুলেট করে।

ডাটা সঠিকভাবে পপুলেট করা হয়েছে এবং সমস্ত ডাটাবেস ইভেন্ট প্রত্যাশিতভাবে ঘটছে তা নিশ্চিত করার জন্য ডাটাবেসকে যাচাই করা বা প্রয়োজনে সঠিক ডেটা পুনরুদ্ধার করা হয়েছে তা নিশ্চিত করার জন্য ফেরত ডেটা যাচাই করা।

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

প্রক্রিয়া ম্যানুয়ালি কল করা আবশ্যক.

ছোট বা ন্যূনতম আকারের ডেটাবেসগুলি (সীমিত সংখ্যক রেকর্ড সহ) সমস্ত দূষিত ইভেন্টের সুযোগ বাড়ানোর জন্য ব্যবহার করা উচিত।

1) লক্ষ্য এবং উদ্দেশ্য ……………………………………………………………… 3

2) ডাটাবেসের বর্ণনা ……………………………………………………… 4

3) ডাটাবেসের সাথে কাজ করা ……………………………………………………… 6

4) ডাটাবেসের লোড টেস্টিং……………………………………11

5) উপসংহার……………………………………………………………………….১৫

6) সাহিত্য……………………………………………………………….16

লক্ষ্য ও উদ্দেশ্য

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

কাজ:

MYSQL ওয়ার্কবেঞ্চে কমপক্ষে 5টি সত্তার সাথে একটি ডাটাবেস স্কিমা তৈরি করুন। এই সত্তা এবং তাদের সংযোগ বর্ণনা করুন.

· এই ডাটাবেসের ব্যবহার বর্ণনা করুন, প্রধান প্রশ্নগুলি বর্ণনা করুন, তাদের সম্পাদনের সময় দেখুন এবং সিদ্ধান্তে আঁকুন

· ডাটাবেস অপ্টিমাইজেশান

· apache-jmeter ব্যবহার করে লোড টেস্টিং করুন। গ্রাফ তৈরি করতে এটির জন্য এক্সটেনশন ব্যবহার করুন।

ডাটাবেস বিবরণ

কোর্সের কাজটি তৈরি করা Witcher1 ডাটাবেস ব্যবহার করে, যার প্রধান সত্তাগুলি হল টেবিল:

চিত্র.1 Witcher1 ডাটাবেসের পরিকল্পিত উপস্থাপনা

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

Ingridients টেবিলে উপাদানগুলির নাম (Disscription) এবং এই উপাদানটি কোথায় পাওয়া যাবে (WhereFind) সম্পর্কে তথ্য রয়েছে। idElixirs কলাম হল Ingridients এবং Elixirs টেবিলের জন্য একটি লিঙ্কিং কলাম।

Elixirs টেবিলে একটি নির্দিষ্ট অমৃত এবং সেই অমৃতের নাম কীভাবে ব্যবহার করতে হয় সে সম্পর্কে তথ্য রয়েছে। এই টেবিলটি অন্যান্য টেবিলের জন্য মূল টেবিল।

অবস্থান সারণীতে কোন অবস্থান বা শহরে একটি নির্দিষ্ট উপাদান পাওয়া যাবে সে সম্পর্কে তথ্য রয়েছে।

সারণি IL একটি নির্দিষ্ট এলাকায় কোথায় এবং কিভাবে একটি নির্দিষ্ট উপাদান খুঁজে পেতে এবং এটি কি সম্পর্কে একত্রিত তথ্য রয়েছে। উপাদান এবং অবস্থান টেবিলের মধ্যে একটি n:m (অনেক থেকে অনেক) সম্পর্ক প্রতিষ্ঠিত হয়েছিল, যেহেতু IL চাইল্ড টেবিলে নির্দেশিত হিসাবে একাধিক উপাদান একাধিক স্থানে পাওয়া যেতে পারে।

দানব টেবিলে দানবের ধরন সম্পর্কে তথ্য রয়েছে

"উইচার 3", কীভাবে এই বা সেই দানবকে চিনবেন এবং তাদের বৈশিষ্ট্যযুক্ত নামগুলি সম্পর্কে।

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

ডাটাবেস নিয়ে কাজ করা

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

· কিভাবে একটি নির্দিষ্ট দানব খুঁজে পেতে তথ্যের জন্য একটি অনুরোধ.

এই ক্যোয়ারীতে JOIN কীওয়ার্ড থাকবে, ধন্যবাদ যার জন্য Witcher1 ডাটাবেসের ML এবং Monsters টেবিলগুলি অ্যাক্সেস করা হবে।

এই অনুরোধ এই মত দেখাবে:

ml JOIN monsters ON monsters.idMonsters=ml.idMonsters;

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

দানব।দানব নাম, দানব।দানব বর্ণনা,

ml.DiscriptionHowFind, ml.idLocations

ml JOIN monsters ON monsters.idMonsters=ml.idMonsters

যেখানে monsters.MonstersName='Hym';

কোন দানবটি এই বা সেই আইডিটির সাথে মিল রয়েছে তা দানব বা ML টেবিলগুলি অনুসন্ধান করে খুঁজে পাওয়া যেতে পারে৷ প্রশ্নগুলি এইরকম দেখাবে:

সিলেক্ট সিলেক্ট করুন

IdMonsters, MonstersName idMonsters, MonstersName

মিলি থেকে; দানব থেকে;

কমপ্লায়েন্স চেক করতে, আপনি ML এবং Monsters টেবিল উভয়কেই জিজ্ঞাসা করতে পারেন, প্রথমে idMonsters দ্বারা তাদের সাথে যোগদান করুন।

ml.idMonsters, monsters.MonstersName

ml যোগদান দানব চালু

ml.idMonsters=monsters.idMonsters

monsters.idMonsters দ্বারা অর্ডার;

· এই দৈত্যের জন্য কী অমৃত উপযুক্ত তার জন্য একটি অনুরোধ।

এই অনুরোধটি বাস্তবায়ন করতে, একটি যোগদান ব্যবহার করা হবে। ক্যোয়ারী দুটি টেবিলে সম্বোধন করা হবে Elixirs এবং Monsters এবং দানবের বিরুদ্ধে লড়াইয়ে কখন এবং কী অমৃত পান করতে হবে সে সম্পর্কে তথ্য থাকবে:

monsters.MonstersName ,elixirs.ElixirName, elixirs.ElixirDiscription

elixirs যোগদান দানব চালু

elixirs.idElixirs=monsters.idElixirs;

· একটি নির্দিষ্ট এলাকায় কি উপাদান পাওয়া যায় সে সম্পর্কে একটি প্রশ্ন।

এই অনুরোধটি বাস্তবায়ন করতে, একটি যোগদান ব্যবহার করা হবে। ক্যোয়ারী দুটি টেবিলে সম্বোধন করা হবে উপাদান এবং অবস্থান এবং কোন উপাদান কোন অবস্থানে অবস্থিত সে সম্পর্কে তথ্য এবং এর প্রকার সম্পর্কে তথ্য থাকবে:

ingridients.Discription, locations.discription, ingridients.WhereFind

উপাদান যোগদান অবস্থানে

ingridients.idIngridients=locations.idIngridients

উপাদান দ্বারা অর্ডার করুন। বর্ণনা;

· আপডেট অনুরোধ

আমরা Hym নামের মনস্টার টেবিলে একটি দানবের জন্য এই প্রশ্নটি বাস্তবায়ন করি। ধরা যাক আমরা তাঁর নাম পরিবর্তন করতে চাই:

দানব

SET MonstersName="Him"

যেখানে idMonsters=1;

কিন্তু, যেহেতু ইংরেজি সংস্করণে Hym সঠিক, তাই আসুন সবকিছু ফিরিয়ে দেওয়া যাক:

দানব

SET MonstersName="Hym"

যেখানে idMonsters=1;

চিত্র 2। আপডেট প্রশ্ন বাস্তবায়ন করা হচ্ছে

· "সমষ্টি" প্রশ্ন। COUNT এবং COUNT (বিচ্ছিন্ন)

COUNT ফাংশন একটি প্রদত্ত সারণীতে অ-খালি সারির সংখ্যা গণনা করে (তাদের ভিতরে NULL ছাড়া)। COUNT এর একটি অপ্টিমাইজ করা সংস্করণ রয়েছে যখন 1টি টেবিলের জন্য ব্যবহার করা হয় তখন সারির সংখ্যা প্রদর্শনের জন্য। উদাহরণ স্বরূপ:

চিত্র 3. Elixirs, Monsters, and Monsters JoIN elixirs টেবিলে সারি গণনা করুন।

COUNT(DISTINCT) ফাংশনটি সারণীতে পুনরাবৃত্তি না হওয়া সারির সংখ্যা প্রদর্শন করতে ব্যবহৃত হয় এবং এটি COUNTটি ফাংশন পরিবারের আরও অপ্টিমাইজ করা সংস্করণ:

চিত্র 4. Monsters টেবিলে অ-পুনরাবৃত্ত অমৃত গণনা।

· ডিলিট ফাংশন।

INSERT ব্যবহার করে Elixirs টেবিলে আরেকটি সারি যোগ করা যাক:

অমৃতমূল্যের মধ্যে ঢোকান (6,'ForDelete','DiscriptionDelete');

চিত্র.5. Elixirs টেবিলে একটি সারি যোগ করা হচ্ছে.

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

ইলিক্সির থেকে মুছুন যেখানে idElixirs=6;

Fig.6. যোগ করা লাইন মুছুন।

ডাটাবেস লোড টেস্টিং

এখন যে প্রশ্নগুলি সম্পন্ন হয়েছে এবং ডাটাবেসে অ্যাক্সেস প্রতিষ্ঠিত হয়েছে, এটি বিভিন্ন পরামিতি ব্যবহার করে পরীক্ষা করা যেতে পারে:

· সময়ের সাথে সাথে প্রতিক্রিয়ার সময় বা সময়ের সাথে প্রতিক্রিয়ার সময় - এই চেকটি প্রতিটি অনুরোধের জন্য তার গড় প্রতিক্রিয়া সময় সম্পর্কে মিলিসেকেন্ডে তথ্য প্রদর্শন করে।

· রেসপন্স টাইমস ডিস্ট্রিবিউশন বা রেসপন্স টাইম ডিস্ট্রিবিউশন - এই চেকটি একটি নির্দিষ্ট সময়ের ব্যবধানে প্রতিক্রিয়ার সংখ্যা প্রদর্শন করে যেখানে অনুরোধটি কার্যকর করা হয়েছিল।

· রেসপন্স টাইম পার্সেন্টাইল - এই চেক রেসপন্স টাইম মানের জন্য পার্সেন্টাইল দেখায়। গ্রাফে, X অক্ষ হবে শতাংশ, এবং Y অক্ষ হবে প্রতিক্রিয়ার সময়।

সবচেয়ে যুক্তিযুক্ত পরীক্ষার জন্য, আমরা নির্দিষ্ট সেট করব

বিকল্প:

চিত্র 7. পরীক্ষার পরামিতি

থ্রেডের সংখ্যা (ব্যবহারকারী) - ভার্চুয়াল ব্যবহারকারীর সংখ্যা। আমাদের ক্ষেত্রে, আমরা যতটা সম্ভব আমাদের ডাটাবেস লোড করার জন্য এটিকে 1000 এ সেট করব।

র‌্যাম্প-আপ পিরিয়ড – যে সময়কালে সমস্ত ব্যবহারকারী জড়িত থাকবে।

অনেক ব্যবহারকারীর দ্বারা একযোগে সক্রিয় হলে আমরা তাদের কর্মক্ষমতার জন্য সমস্ত যোগদানের অনুরোধগুলি পরীক্ষা করব।

শেষ 3 পয়েন্ট হল চেকের প্লটার যার দ্বারা আমরা ডাটাবেস পরীক্ষা করব।

·
সময়ের সাথে রেসপন্স টাইম চেক করা হচ্ছে

চিত্র 7. পরীক্ষার সময় প্রশ্ন নির্বাহের ফলাফল সময়ের সাথে সাথে প্রতিক্রিয়া সময়

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

·
পরীক্ষা প্রতিক্রিয়া টাইমস বিতরণ

চিত্র 8. পরীক্ষার সময় প্রশ্ন নির্বাহের ফলাফল প্রতিক্রিয়া টাইমস বিতরণ.

এই গ্রাফ থেকে আমরা উপসংহারে আসতে পারি যে একই সময়ের মধ্যে আমাদের প্রতিটি অনুরোধের প্রতিক্রিয়ার সংখ্যা একই।

·
রেসপন্স টাইম পার্সেন্টাইল চেক করা হচ্ছে

অর্ডিনেট অক্ষটি সম্পাদনের সময় দেখায় এবং অ্যাবসিসা অক্ষটি মোট পরিমাণের শতাংশ দেখায়। গ্রাফের উপর ভিত্তি করে, আমরা উপসংহারে পৌঁছাতে পারি যে 90% অনুরোধগুলি 0 থেকে 340 মিলিসেকেন্ডের মধ্যে সময়ের ব্যবধানে কার্যকর হয় এবং 5% থেকে 15% পর্যন্ত অনুরোধের সংখ্যা রৈখিকভাবে বৃদ্ধি পায়, এবং তারপরে খুব ছোট সহগ বৃদ্ধির সাথে দ্রুতগতিতে বৃদ্ধি পায়।

অবশিষ্ট 10% 340 মিলিসেকেন্ড থেকে 700 মিলিসেকেন্ড পর্যন্ত সময়ের ব্যবধানে কার্যকর করা হয়, যা এই উপসংহারে নিয়ে যায় যে ডাটাবেসে একটি খুব বড় লোড রয়েছে।

উপসংহার

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

শেষ পর্যন্ত, পরবর্তী সিদ্ধান্তের সাথে এর ফলাফলের পরীক্ষা এবং বিশ্লেষণ করা হয়েছিল।

এটি লক্ষ করা উচিত যে ডাটাবেসটি নিজেই শুধুমাত্র একটি শিক্ষামূলক হিসাবে তৈরি করা হয়েছিল, তাই এটি এত বিশাল নয়।

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

সাহিত্য

1. http://phpclub.ru/mysql/doc/- ইন্টারনেট সংস্থান "MySQL - রেফারেন্স গাইড"

2. Schwartz B., Zaitsev P., Tkachenko V. et al - MySQL। কর্মক্ষমতা অপ্টিমাইজ করা (২য় সংস্করণ)

3. Thalmann L., Kindal M., Bell C. - "MySQL-ভিত্তিক সিস্টেমের উচ্চ প্রাপ্যতা নিশ্চিত করা"

4. Andrzej Sapkowski - "দ্য উইচার (বড় সংগ্রহ)", পৃষ্ঠার সংখ্যা: 571

5. সিডি প্রজেক্ট রেড, GOG COM। "দ্য উইচার 3: ওয়াইল্ড হান্ট।"


সংশ্লিষ্ট তথ্য।


: কিভাবে ডাটাবেস পরীক্ষা এবং ডিবাগ করতে হয়

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

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

অ্যালগরিদম এই মত:

  1. একটি লেনদেন খুলুন;
  2. যদি প্রয়োজন হয়, আমরা পরীক্ষার জন্য প্রস্তুতিমূলক পদক্ষেপ গ্রহণ করি;
  3. একটি ইউনিট পরীক্ষা সম্পাদন করুন (অথবা কেবল স্ক্রিপ্টটি চালান যার অপারেশন আমরা পরীক্ষা করতে চাই);
  4. স্ক্রিপ্টের ফলাফল পরীক্ষা করুন;
  5. আমরা লেনদেন বাতিল করি, ডাটাবেসটিকে তার আসল অবস্থায় ফিরিয়ে দিই।

এমনকি পরীক্ষার অধীনে কোডে অপ্রকাশিত লেনদেন থাকলেও, বাহ্যিক ROLLBACK এখনও সমস্ত পরিবর্তন সঠিকভাবে ফিরিয়ে আনবে।

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

বিতরণ করা লেনদেন তৈরি করতে তাড়াহুড়া করবেন না, একটি সহজ সমাধান আছে! স্ট্যান্ডার্ড SQL সার্ভার টুল ব্যবহার করে, আপনি একটি সংযোগে একটি লেনদেন খুলতে পারেন এবং অন্য সংযোগে এটি চালিয়ে যেতে পারেন।

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

কর্মের ক্রম নিম্নরূপ:

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

এখন অ্যাপ্লিকেশনটির কাজ হল আমাদের নিয়ন্ত্রণ লেনদেনের সাথে আবদ্ধ করা যা এটি করা উচিত তা করা শুরু করার আগে।

তারপরে অ্যাপ্লিকেশনটি কাজ শুরু করে, এর সঞ্চিত পদ্ধতিগুলি চালানো, এর লেনদেনগুলি খোলা, বিচ্ছিন্নতা মোড পরিবর্তন করা সহ... কিন্তু আমাদের ডিবাগিং সেশনটি এই সময় অ্যাপ্লিকেশনটির মতো একই লেনদেনের মধ্যে থাকবে৷

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

অন্যান্য সমস্ত সেশনের জন্য অ্যাপ্লিকেশনের ক্রিয়াগুলি লক দ্বারা লুকানো থাকে...

আমাদের ডিবাগিং সেশন লকগুলির মধ্য দিয়ে যায় (সার্ভার মনে করে সেগুলি আমাদের নিজস্ব লক)!

অথবা কল্পনা করুন যে অ্যাপ্লিকেশনটি স্ন্যাপশট মোডে স্ট্রিংগুলির নিজস্ব সংস্করণগুলির সাথে কাজ শুরু করে৷ আমি কিভাবে এই সংস্করণগুলি দেখতে পারি? এমনকি এটি সম্ভব যদি আপনি একটি সাধারণ লেনদেনের মাধ্যমে সংযুক্ত থাকেন!

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

আপনি কোর্সগুলিতে এই সম্পর্কে আরও জানতে পারেন