পরীক্ষাগুলি হল সবচেয়ে ভালভাবে কাজ করা রেল অ্যাপ্লিকেশনগুলির একটি অবিচ্ছেদ্য অংশ যেখানে রক্ষণাবেক্ষণ কোনও দুঃস্বপ্ন নয় এবং নতুন বৈশিষ্ট্যগুলি ধারাবাহিকভাবে যুক্ত করা হয়, বা বিদ্যমানগুলিকে উন্নত করা হয়৷ দুর্ভাগ্যবশত, অনেক অ্যাপ্লিকেশানের জন্য, একটি উত্পাদন পরিবেশ হল যেখানে তারা প্রথমবারের জন্য ভারী কাজের চাপ বা উল্লেখযোগ্য ট্র্যাফিকের মধ্যে পড়ে। এটি বোধগম্য কারণ এই ধরনের পরীক্ষাগুলি ব্যয়বহুল৷
সৌভাগ্যক্রমে, রেলের শুধুমাত্র ইউনিট, এন্ড-টু-এন্ড এবং ইন্টিগ্রেশন পরীক্ষার জন্যই নয়, পারফরম্যান্স এবং লোডিং সম্পর্কিত পরীক্ষার জন্যও ভাল সমর্থন রয়েছে। আমি নিবন্ধে সেগুলির সবকটি কভার করব এবং কিছু ব্যবহারিক উদাহরণ দেখাব যা আপনাকে বুঝতে সাহায্য করবে যে কীভাবে আপনার অ্যাপ্লিকেশনের কার্যকারিতা স্তর পরীক্ষা করে এমন সরঞ্জামগুলিকে দক্ষতার সাথে ব্যবহার করতে হয়৷
নিবন্ধটি দুটি বিভাগে বিভক্ত:
-
তাত্ত্বিক — আমি আপনাকে দেখাব কেন পরীক্ষা করা প্রয়োজন, আমরা যে ধরনের পরীক্ষা করতে পারি এবং অ্যাপ্লিকেশনে পরীক্ষা করার সময় যে মেট্রিকগুলি অপরিহার্য
-
ব্যবহারিক — আমরা আমাদের হাত নোংরা করব এবং আউটপুট পাওয়ার জন্য একটি প্রকৃত অ্যাপ্লিকেশনের জন্য পরীক্ষা লিখব
দুটি বিভাগ পড়ার পরে, আপনি বিভিন্ন ধরণের পরীক্ষা এবং আপনার রেল অ্যাপ্লিকেশনে কীভাবে সেগুলি সম্পাদন করবেন সে সম্পর্কে গভীরভাবে বুঝতে পারবেন। আকর্ষণীয় শোনাচ্ছে? তাহলে আসুন পরীক্ষা সম্পর্কে এক চিমটি তত্ত্ব দিয়ে শুরু করা যাক।
তত্ত্বে পরীক্ষা
পরীক্ষা সবসময় যে কোনো ধরনের অ্যাপ্লিকেশনের বিকাশের একটি অন্তর্নিহিত অংশ হওয়া উচিত। আপনি যদি এখনও এটি সম্পর্কে নিশ্চিত না হন বা এখনও কোনো পরীক্ষা না লিখে থাকেন, তাহলে এখানে পরীক্ষার জন্য কিছু যুক্তি রয়েছে যা আপনাকে সাহায্য করবে:
- কিছু ভাঙার চিন্তা না করেই পরিবর্তনের পরিচয় দিন - এটিই প্রধান কারণ কেন পরীক্ষাগুলি প্রয়োজনীয়। একটি বিশাল অ্যাপে কাজ করার কথা কল্পনা করুন যেখানে প্রতিবার আপনি কিছু পরিবর্তন, এমনকি একটি ছোট পরিবর্তন প্রবর্তন করার সময় কিছুই ভেঙে না যায় তা নিশ্চিত করতে আপনাকে পুরো অ্যাপটিতে ক্লিক করতে হবে। পরীক্ষার মাধ্যমে, আপনি শুধুমাত্র একটি কমান্ড চালান এবং যাচাইকরণ প্রক্রিয়া স্বয়ংক্রিয় এবং দ্রুত হয়।
- সহজ রিফ্যাক্টরিং প্রক্রিয়া — আমি উপরে উল্লেখ করেছি যে নতুন বৈশিষ্ট্য যোগ করার বা পরিবর্তন করার সময় পরীক্ষাগুলি অপরিহার্য। পরীক্ষা করার সাথে সাথে, আপনি আপনার বিদ্যমান কোড উন্নত করতে আরও স্বাচ্ছন্দ্যবোধ করেন৷
- পরীক্ষা হল ডকুমেন্টেশনের একটি ফর্ম — ভাল-লিখিত পরীক্ষাগুলি অ্যাপ্লিকেশনের বৈশিষ্ট্যগুলির বিভিন্ন সেটের জন্য ডকুমেন্টেশনের একটি ফর্ম হতে পারে। তারা কেবল বৈশিষ্ট্যটি কী তা বর্ণনা করে না বরং এটি কীভাবে কাজ করা উচিত তাও বর্ণনা করে৷
- বাস্তবায়ন পুনর্বিবেচনা করার সুযোগ — আপনি যখন একটি পরীক্ষা লেখেন, আপনি যেভাবে কোডটি প্রয়োগ করতে চান তা সঠিক এবং যুক্তিসঙ্গত কিনা তা নিয়ে আপনার আবার চিন্তা করার সুযোগ থাকে। এছাড়াও, আপনি কেবল পরীক্ষা করে দেখুন যে আপনার কোডটি আপনার প্রত্যাশা অনুযায়ী কাজ করছে কিনা৷
আমি আশা করি উপরের আর্গুমেন্টগুলি আপনাকে যেকোন অ্যাপের ডেভেলপমেন্টের সময় পরীক্ষা ব্যবহার করতে রাজি করেছে। কোড পরীক্ষা করা কেন অপরিহার্য তা জানার পাশাপাশি বিভিন্ন ধরনের পরীক্ষা সম্পর্কে জানাও গুরুত্বপূর্ণ।
বিভিন্ন ধরনের পরীক্ষা
আপনার Rails অ্যাপ্লিকেশনের কর্মক্ষমতা সঠিক এবং ভারী কাজের চাপের মধ্যে পরিকাঠামো ভালভাবে কাজ করছে তা নিশ্চিত করতে আপনি তিনটি প্রাথমিক ধরনের পরীক্ষা লিখতে পারেন। এই প্রকারগুলি নিম্নরূপ:
- লোড টেস্টিং৷ — এই ধরনের পরীক্ষা নিম্নলিখিত প্রশ্নের উত্তর দেয়:একটি নির্দিষ্ট সময়ের জন্য কতজন যুগপত ব্যবহারকারী সিস্টেম পরিচালনা করতে পারে। কল্পনা করুন যে আপনি আপনার ওয়েবসাইটে একটি শীর্ষ-রেটেড পণ্য চালু করেছেন এবং হাজার হাজার ব্যবহারকারী একই সময়ে অর্ডার করতে চান। সঠিক লোডিং পরীক্ষা ছাড়া, আপনি সবচেয়ে জটিল সময়ে ক্র্যাশের ঝুঁকি নিয়ে থাকেন।
- স্ট্রেস টেস্টিং — এই ধরনের পরীক্ষার মাধ্যমে, আপনি সিস্টেমটি একযোগে পরিচালনা করতে পারে এমন ব্যবহারকারীর সংখ্যা যাচাই করার দিকে মনোনিবেশ করবেন না, তবে ব্যবহারকারীদের সীমা আঘাত করলে সিস্টেমটি কীভাবে আচরণ করবে তার উপর।
- পারফরম্যান্স টেস্টিং — আমি বলব যে এই ধরনের পরীক্ষা হল স্ট্রেস এবং লোড পরীক্ষার একটি অভিভাবক। এই ধরনের পরীক্ষার প্রাথমিক উদ্দেশ্য হল মেট্রিক্সের একটি নির্দিষ্ট সেট পাওয়া যার ভিত্তিতে আমরা অ্যাপ্লিকেশনের কোড উন্নত করতে কিছু পদক্ষেপ নিতে পারি। আমি কিছুক্ষণের মধ্যে সেই মেট্রিক্স সম্পর্কে কথা বলব৷
বলা হচ্ছে, আমরা এখন তত্ত্ব অংশের শেষ ধাপে যাওয়ার জন্য প্রস্তুত:একটি রেল অ্যাপ্লিকেশনে পারফরম্যান্স টেস্টিং করার সময় কী মেট্রিক্স অপরিহার্য তা শেখা। সেই জ্ঞান ছাড়া, আমরা পরীক্ষার আউটপুট সঠিকভাবে ব্যাখ্যা করব না এবং সিদ্ধান্ত নেব না যে আমাদের কোড পরিবর্তন করা উচিত কি না।
গুরুত্বপূর্ণ মেট্রিক্স
আপনি পরীক্ষার জন্য যে সরঞ্জামটি ব্যবহার করেন তার উপর নির্ভর করে আপনি যে ধরণের মেট্রিকগুলি পেতে পারেন তা আলাদা হতে পারে, তবে সাধারণত, আমরা তাদের মেট্রিকের একটি সেটে গোষ্ঠীবদ্ধ করতে পারি যা বেশ সাধারণ:
- প্রতিক্রিয়া সময় — অনুরোধ করা হচ্ছে এবং ব্রাউজারে রেন্ডার হওয়ার মধ্যবর্তী সময়। এই মেট্রিকটি আমাদের দেখায় যে ব্যবহারকারীর অনুরোধ করা তথ্য পাওয়ার আগে তাকে কতক্ষণ অপেক্ষা করতে হবে। একে কখনও কখনও প্রক্রিয়া সময় বলা হয়৷
- মেমরি ব্যবহার - প্রদত্ত অনুরোধের জন্য মেমরির পরিমাণ। এটি প্রয়োজনীয় তথ্যের একটি অংশ কারণ এটি আপনাকে সেই জায়গায় নির্দেশ করে যেখানে আপনি কোডটি উন্নত করতে পারেন যাতে সিস্টেম দ্রুত প্রতিক্রিয়া জানাতে পারে এবং কম সংস্থান ব্যবহার করতে পারে৷
- বস্তু বরাদ্দ - একটি উচ্চ মেমরি বরাদ্দ উচ্চ মেমরি ব্যবহার এবং দীর্ঘ প্রতিক্রিয়া সময় কারণ. এই মেট্রিকটি আপনাকে কোডের সঠিক জায়গায় নিয়ে যেতে পারে যেখানে অনেকগুলি বস্তু বরাদ্দ করা হয়েছে, তাই আপনি তা অবিলম্বে পরিদর্শন করতে পারেন৷
পরীক্ষার সময় আপনার কাছে আরও মেট্রিক্স থাকতে পারে, তবে এই তিনটিই সবচেয়ে গুরুত্বপূর্ণ এবং আপনি যে কোনো অ্যাপ্লিকেশন পরীক্ষা করেন তার জন্য বৈধ হবে। আমরা এখন আমাদের হাত নোংরা করতে পারি এবং আসল পরীক্ষা লিখতে পারি।
অভ্যাস করুন
পরীক্ষা করার মতো কিছু না থাকলে আমরা পরীক্ষা লিখতে সক্ষম নই। তাই অনুশীলন অংশের প্রথম ধাপ হল একটি সাধারণ রেল অ্যাপ্লিকেশন লেখা যার জন্য আমরা পরীক্ষা লিখতে পারি।
নমুনা রেল অ্যাপ্লিকেশন
আমি Ruby 3.0.1 এবং Rails 6.1.3.1 ব্যবহার করব তবে আপনি স্বাচ্ছন্দ্য বোধ করেন এমন যেকোনো সংস্করণ ব্যবহার করতে দ্বিধা করবেন না। আপনার কাছে রুবি এবং রেল ইনস্টল করা থাকলে, পরবর্তী পদক্ষেপটি হল অ্যাপ্লিকেশনটির কঙ্কাল তৈরি করা:
rails new simpleapp -d=postgresql
নিবন্ধের উদ্দেশ্যে, আমি একটি অ্যাপ তৈরি করব যেখানে ব্যবহারকারীদের একটি তালিকা তাদের পোষা প্রাণীর নামের সাথে উপস্থাপন করা হয়। এই ধরনের কাঠামো আমাদের সহজেই N+1 কোয়েরি তৈরি করতে দেয় যা পারফরম্যান্স পরীক্ষা করার সময় এবং গতি এবং পরিবর্তনের অন্যান্য মেট্রিক্সের উপর প্রভাব পরীক্ষা করার সময় আরও মজা দেয়।
আমরা মডেল তৈরি করার আগে, প্রথমে ডাটাবেস তৈরি করা যাক:
cd simpleapp/
bin/rails db:create
এখন, আমরা মডেলগুলি তৈরি করতে পারি:
rails g model User name:string
rails g model Animal name:string user:references
bin/rails db:migrate
User
এ শুধু একটি ছোট আপডেট Animal
এর সাথে সম্পর্ক প্রতিফলিত করার জন্য মডেল মডেল:
class User < ApplicationRecord
has_many :animals
end
আমরা এখন db/seeds.rb
এ কিছু বীজ যোগ করতে পারি ফাইল:
people = {
'Tim' => ['Pinky', 'Rick'],
'Martha' => ['Rudolph'],
'Mark' => ['Niki', 'Miki', 'Bella'],
'Tina' => ['Tom', 'Luna']
}
people.each_pair do |name, pets|
user = User.create(name: name)
pets.each do |pet_name|
user.animals.create(name: pet_name)
end
end
এবং ডাটাবেসে ডেটা লোড করুন:
bin/rails db:seed
আমি ব্যবহারকারীদের অ্যাসাইনমেন্টের সাথে একটি নিয়ামক তৈরি করব, এবং তারপরে, আমি সমস্ত ব্যবহারকারীদের তাদের পোষা প্রাণীর নাম দিয়ে তালিকাভুক্ত করব। আমি ইচ্ছাকৃতভাবে কোড ব্যবহার করছি যা কার্যক্ষমতার সমস্যা সৃষ্টি করছে যাতে আপনি পরে উন্নতি পরিমাপ করতে পারেন।
touch app/controllers/home_controller.rb
mkdir app/views/home
touch app/views/home/index.html.erb
কন্ট্রোলারটি সহজ:
class HomeController < ApplicationController
def index
@users = User.all
end
end
এবং ভিউও:
<h1>List</h1>
<ul>
<% @users.each do |user| %>
<li><%= user.name %> (<%= user.animals.count %>)
<ul>
<% user.animals.each do |animal| %>
<li><%= animal.name %></li>
<% end %>
</ul>
</li>
<% end %>
</ul>
শেষ ধাপ হল config/routes.rb
আপডেট করা মূল URL দেখার সময় আমরা কী দেখতে চাই তা রেলগুলিকে জানাতে ফাইল:
Rails.application.routes.draw do
root to: 'home#index'
end
JMeter দিয়ে পরীক্ষা লোড করুন
JMeter হল Apache সফ্টওয়্যার ফাউন্ডেশন দ্বারা তৈরি একটি ওপেন-সোর্স সফ্টওয়্যার, পরীক্ষার কার্যকরী আচরণ লোড করার জন্য ডিজাইন করা হয়েছে। যেহেতু এটি জাভা দিয়ে তৈরি একটি প্রোগ্রাম, আপনি এটি যেকোনো অপারেটিং সিস্টেমে ইনস্টল করতে পারেন। আপনি এখানে ফাইলগুলি ডাউনলোড করতে পারেন:https://jmeter.apache.org/download_jmeter.cgi
আপনি যদি একটি macOS সিস্টেমে কাজ করেন, তাহলে আপনি Homebrew এর সাথে JMeter সহজেই ইনস্টল করতে পারেন:
brew install jmeter
ইনস্টলেশনের পরে, আপনি নিম্নলিখিত কমান্ড দিয়ে প্রোগ্রামটি চালাতে পারেন:
jmeter
পরীক্ষা কনফিগার করা হচ্ছে
কনফিগারেশন প্রক্রিয়া নিম্নলিখিত ধাপগুলি নিয়ে গঠিত:
- থ্রেড গ্রুপ যোগ করা — ব্যবহারকারীর সংখ্যা এবং প্রত্যেকে কতক্ষণ আপনার ওয়েবসাইট ভিজিট করবে তা উল্লেখ করে
- HTTP অনুরোধ কনফিগার করা — JMeter কে আঘাত করা উচিত এমন এন্ডপয়েন্ট নির্দিষ্ট করে
- আমাদের আগ্রহের মেট্রিক্স সেট করা
আসুন আমরা আগে তৈরি করা সাধারণ অ্যাপের মূল পৃষ্ঠায় একটি একক ব্যবহারকারীর অনুরোধ অনুকরণ করতে একটি সাধারণ পরীক্ষার কনফিগারেশনের মাধ্যমে ধাপে ধাপে চলুন।
থ্রেড গ্রুপ যোগ করুন
"পরীক্ষা পরিকল্পনা"-তে ডান-ক্লিক করার পরে প্রসারিত হওয়া মেনু থেকে যোগ -> থ্রেড (ব্যবহারকারী) -> থ্রেড গ্রুপ নির্বাচন করুন:
ব্যবহারকারীর সংখ্যা এবং অতিরিক্ত বৈশিষ্ট্য উল্লেখ করুন:
HTTP অনুরোধ কনফিগার করুন
পূর্ববর্তী ধাপে আমরা যে থ্রেডটি তৈরি করেছি তার উপর ডান-ক্লিক করুন এবং Add -> Sampler -> HTTP অনুরোধ:
নির্বাচন করুন।প্রোটোকল, সার্ভারের নাম, পোর্ট এবং অনুরোধের পথ কনফিগার করুন:
ফলাফল দৃশ্য নির্দিষ্ট করুন
HTTP অনুরোধে রাইট-ক্লিক করুন এবং Add -> Listener -> View Results Tree নির্বাচন করুন:
পরীক্ষা চলছে
পরীক্ষাটি এখন কনফিগার করা হয়েছে, এবং আমরা এটি ট্রিগার করতে পারি। এটি করতে, কেবল সবুজ প্লে বোতামে ক্লিক করুন:
আপনি দেখতে পাচ্ছেন, অ্যাপ্লিকেশনটি পরীক্ষায় উত্তীর্ণ হয়েছে, তবে এটি শুধুমাত্র একটি অনুরোধ ছিল, তাই ফলাফলটি সুস্পষ্ট ছিল। অ্যাপ্লিকেশনটি কীভাবে আচরণ করবে তা দেখতে আপনি এখন ব্যবহারকারীর সংখ্যা এবং অন্যান্য কনফিগারেশন বিকল্পগুলির সাথে পরীক্ষা করতে পারেন। আমার পরীক্ষা থেকে, সাধারণ অ্যাপটি ক্র্যাশ হতে শুরু করে যখন প্রায় 200 জন ব্যবহারকারী একসাথে এটি অ্যাক্সেস করা শুরু করে।
পরবর্তী ধাপগুলি
লোড পরীক্ষা করার পরে, আপনি আপনার আবেদনের ব্যথার পয়েন্টগুলি জানতে পারবেন। ব্যবহারকারীর সীমা বোঝার জন্য, আপনি এখন অ্যাপ্লিকেশনটি কীভাবে আচরণ করবে তা দেখতে স্ট্রেস পরীক্ষা করতে পারেন।
রুবি-প্রোফের সাথে পারফরম্যান্স টেস্ট
পারফরম্যান্স পরীক্ষার বৈশিষ্ট্যটি 3 সংস্করণ পর্যন্ত রেলগুলিতে অন্তর্নির্মিত ছিল এবং তারপরে এটি পৃথক রত্ন https://github.com/rails/rails-perftest-এ বের করা হয়েছিল। যেহেতু রেলের সর্বশেষ সংস্করণে এটি ব্যবহার করে আমার কিছু সমস্যা ছিল, তাই আমি এই নিবন্ধে এটি অন্তর্ভুক্ত না করার সিদ্ধান্ত নিয়েছি। পরিবর্তে, আমি রুবি-প্রোফ লাইব্রেরি ব্যবহার করব যা খুব ভাল কাজ করে।
যথারীতি, প্রথম ধাপ হল আমাদের অ্যাপ্লিকেশনে একটি রত্ন যোগ করা:
bundle add ruby-prof
কনফিগারেশন প্রক্রিয়ার দ্বিতীয় এবং শেষ ধাপ হল config/application.rb
আপডেট করা এবং রত্নটির জন্য মিডলওয়্যার ব্যবহার করুন যাতে লাইব্রেরি স্বয়ংক্রিয়ভাবে আমাদের অনুরোধগুলি পরিদর্শন করতে পারে এবং তাদের উপর ভিত্তি করে প্রতিবেদন তৈরি করতে পারে:
module Simpleapp
class Application < Rails::Application
config.middleware.use Rack::RubyProf, :path => './tmp/profile'
end
end
আপনি এখন অ্যাপটি অ্যাক্সেস করতে পারেন, এবং প্রতিবার আপনি একটি অনুরোধ সঞ্চালন করার সময়, রত্নটি একটি নতুন প্রতিবেদন তৈরি করবে। এটা এই মত দেখায়:
আপনি এটিকে কনফিগার করা পথের অধীনে খুঁজে পেতে পারেন, যা হল tmp/profile
আমাদের ক্ষেত্রে. দ্বিতীয় প্রতিবেদনটিও তৈরি করা হয়েছে, এবং এটি কল স্ট্যাক দেখায়, যা একটি Rails অ্যাপ্লিকেশনে কর্মক্ষমতা সমস্যাগুলি ডিবাগ করার সময় একটি বেশ সহায়ক মেট্রিক।
এটা মনে রাখা গুরুত্বপূর্ণ যে cache_classes
সেট করা এবং cache_template_loading
true
সেটিংস অ্যাপ্লিকেশানের গতি কমিয়ে দেবে এবং অ্যাপ্লিকেশনের মেট্রিকগুলিকে অভিভূত করবে কারণ রেলগুলি প্রয়োজনীয় ফাইলগুলি লোড করার চেষ্টা করবে৷
সারাংশ
পরীক্ষা প্রতিটি উন্নয়ন প্রক্রিয়ার একটি অপরিহার্য অংশ। আমাদের সলিউশনে ভালো পারফরম্যান্স আছে কিনা তা যাচাই করার মতোই কোডটি আমাদের ইচ্ছা অনুযায়ী আচরণ করে কিনা তা পরীক্ষা করা। পরীক্ষা এড়িয়ে যাওয়া গুরুতর সমস্যাগুলির দিকে পরিচালিত করে যা অ্যাপের কার্যক্ষমতা এবং আপনার ব্যবহারকারীদের বিশ্বাসকে প্রভাবিত করে। আশা করি, পরীক্ষা করা কঠিন নয়।
এই নিবন্ধে, আমরা পরীক্ষার নিম্নলিখিত গুরুত্বপূর্ণ দিকগুলি কভার করেছি:
- আপনার কোড পরীক্ষা করার কারণ
- বিভিন্ন ধরনের কর্মক্ষমতা পরীক্ষা
- যেভাবে আপনি আপনার Rails অ্যাপের কর্মক্ষমতা পরীক্ষা করতে পারেন
আমি আশা করি আপনি এখন আরও নিশ্চিত হয়েছেন যে কেন এবং কীভাবে পরীক্ষা করা গুরুত্বপূর্ণ তা আপনি জানেন।
আপনি যদি শুধুমাত্র স্থানীয়ভাবে নয় বরং উৎপাদন বা স্টেজিং পরিবেশেও আপনার অ্যাপের কর্মক্ষমতা নিরীক্ষণ করতে আগ্রহী হন, তাহলে আপনার AppSignalও পরীক্ষা করা উচিত।
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্টও মিস করবেন না!