কম্পিউটার টিউটোরিয়াল

রেলস সিস্টেম টেস্ট মিনিটেস্ট দিয়ে освоয়ন: начина वालों के लिए গাইড

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

সিস্টেম টেস্টের পরিচিতি

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

কনফিগারেশন

কনফিগারেশন এতটাই সহজ যে প্রায় বিভ্রান্তিকর।

ব্রাউজারের সাথে ইন্টারঅ্যাক্ট করার জন্য Capybara জেম ব্যবহার হয়। Capybara এর মাধ্যমে আমরা টেস্টে পেজ ভিজিট করাতে পারি, ফর্ম ফিল আপ করাতে পারি, লিংক এবং বাটনে ক্লিক করাতে পারি। আপনি যদি Capybara এর সাথে আগে কাজ করে থাকেন, তবে আপনি জানেন ডাটাবেস ক্লিনিং স্ট্র্যাটেজি এবং ব্রাউজার কনফিগারেশনের সাথে সেটাকে কত কঙ্কাল কোঅর্ডিনেট করতে হতো। রেলস সিস্টেম টেস্ট সেটআপের জন্য জয়জয়কার: এটি Capybara এর সাথে কাজ করার জন্য প্রয়োজনীয় সকল কনফিগারেশন out-of-the-box নেয়। তাই আমরা ফোকাস করতে পারি আসল টেস্ট লিখতে। এটি ডিফল্টভাবে Selenium ড্রাইভার ব্যবহার করে।

ডকুমেন্টেশন থেকে: "ডিফল্টভাবে, ActionDispatch::SystemTestCase Selenium ড্রাইভার দ্বারা চালিত হয়, Chrome ব্রাউজারের সাথে, এবং 1400x1400 ব্রাউজার সাইজ।" Selenium ড্রাইভার Capybara-এর ডিফল্ট থেকে আলাদা এবং এটিকে বেছে নেওয়া হয়েছে কারণ এটি জাভাস্ক্রিপ্টের সাথে কাজ করে।

সব সেটিং application_system_test_case.rb ফাইলে উপলব্ধ। একমাত্র কাজ হল প্রতিটি টেস্ট ফাইলে এটি require করা।

# application_system_test_case.rb (ডিফল্ট) require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :chrome, screen_size: [1400, 1400] end

আপনি যদি রেলস ৬ দিয়ে নতুন অ্যাপ জেনারেট করেন, তবে এটি বাস্তবে আপনার প্রয়োজনীয় সব কিছু। অর্থাৎ: ইন্টারনেটে ইউজার ইন্টারফেস টেস্ট বা RSpec-এর ফিচার টেস্টের জন্য Selenium ড্রাইভার সেটআপ করার সকল পরামর্শ আপনি এড়িয়ে যেতে পারেন।

এক্সিস্টিং অ্যাপে, স্ক্যাফফোল্ড জেনারেট করলে অটোমেটিক্যালি application_system_test_case.rb এবং সিস্টেম টেস্টের জন্য প্রয়োজনীয় সব কিছু জেনারেট হয়।

ঈলিন উচিতেলে যখন সিস্টেম টেস্ট ইন্ট্রোডিউস করেছিলেন, তখন Chrome বেছে নেওয়া হয়েছিল কারণ সময় তে Firefox Selenium-এর সাথে ভালো কাজ করত না। পরে Firefox-এ সেটি ফিক্স হয়েছে। তাই আমি Chrome কে Firefox দিয়ে রিপ্লেস করি, নিম্নরূপ:

# application_system_test_case.rb (ড্রাইভার Firefox-এ পরিবর্তন) require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :firefox, screen_size: [1400, 1400] end

(প্রাথমিকভাবে, ড্রাইভার সوییচ করার পর $ rails db:test:prepare চালিয়েছিলাম ক্লিন স্টার্ট নিশ্চিত করতে, কিন্তু নতুন টেস্ট রাননermosthe স্বয়ংক্রিয়ভাবে :prepare চালিয়ে দেয়।)

রেলস ৬-এ নতুন কি আছে

সিস্টেম টেস্ট ৫.১-এ আসার পর থেকে, chromedriver-helper জেম ডিপ্রিকেটেড হয়েছে। নতুন রেলস ৬ অ্যাপে, এটি webdrivers জেম দিয়ে রিপ্লেস করা হয়েছে। রেলস ৫ অ্যাপে, আপনি chromedriver-helper-কে webdrivers জেম দিয়ে রিপ্লেস করবেন যদি এখনও না করে থাকেন। webdrivers জেম থাকলে, আপনাকে selenium-webdriver জেমের প্রয়োজন নেই; webdrivers সেটিও হ্যান্ডেল করে। মজার তথ্য: রেলস ৬ আমাদের দুটোই দিয়েছে selenium-webdriver জেম এবং webdrivers জেম।

Sanity Check: যা আর প্রয়োজন নেই

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

প্রথমে, রেডিমেড রেলস সেটআপ মানে আমরা আরও অনেক জেম বাদ দিতে পারি যেগুলো টেস্টিং-এর সাথে প্রসঙ্গে বলা হয়, যেন minitest-rails-capybara, বা মিনিটেস্টের এক্সট্রা ফিচার: কালারড আউটপুট, ফাস্ট ফেইলিং টেস্ট এবং এক লাইন/টেস্ট রান করা। এই মিনিটেস্ট ফিচারগুলো রেলস ৫.০-এ ইন্ট্রোডিউস করা টেস্ট রানারের সাথে আছে।

database_cleaner জেম আর প্রয়োজন নেই; রেলস আমাদের জন্য ক্লিনআপ করে ( 'transactional tests' )।

যেহেতু রেলস Capybara ডিফল্টের বদলে Selenium ব্যবহার করে, আমাদের capybara-webkit প্রয়োজন নেই এবং জাভাস্ক্রিপ্ট এলিমেন্ট টেস্ট করার জন্য কোনো এক্সট্রা কিছু করতে হয় না।

আপনাকে এমনকি Capybara-এর save_and_open_screenshot ব্যবহার করতে হবে না, কারণ রেলস একটি take_screenshot মেথড দিয়েছে। এটি /tmp-এ স্ক্রিনশট সেভ করে এবং টেস্ট আউটপুটে লিংক দিয়ে দিয়ে সহজ অ্যাক্সেসের সুবিধা দেয়।

রিয়েল ব্রাউজার এবং হেডলেস ব্রাউজারের মধ্যে বেছে নেওয়া

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

আপনি যদি হেডলেস যেতে চান, তবে আছে headless_chrome এবং headless_firefox। এগুলো ব্যবহার করতে, একটি ছোট পরিবর্তন প্রয়োজন:

# headless_* ড্রাইভারে পরিবর্তন করতে #application_system_test_case.rb (headless_*-এ ড্রাইভার পরিবর্তন:) require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :headless_firefox end

নোট: রেলস ডকুমেন্টেশন এবং বেশ কিছু আর্টিকেলে পল্টারগাইস্টকে ড্রাইভার অপশন হিসেবে উল্লেখ করা হয়েছে। এটি খুব জনপ্রিয় ছিল হেডলেস PhantomJS ড্রাইভার হিসেবে Capybara-এর জন্য। PhantomJS এব্যাবন্ডন করা হয়েছে। তাই সেটির szczegółে যেতে প্রয়োজন নেই—আমি এখানে এটা উল্লেখ করলাম কারণ পল্টারগাইস্ট এবং PhantomJS এখনও রেলস ডক্সে আছে।

আরও কাস্টোমাইজেশন করা যায়, কিন্তু শুরু করার জন্য এটুকুই যথেষ্ট।

টেস্ট রান করা

$ rails test সিস্টেম টেস্ট ছাড়া সব টেস্ট রান করবে। আপনাকে এক্সপ্লিসিটলি $ rails test:system রান করতে হবে। (মজার তথ্য: $ rails কমান্ড সবসময় bin/rails দিয়ে রান করে। আর $ bin/rails টাইপ করতে হবে না।)

  • সব সিস্টেম টেস্ট রান করুন: $ rails test:system
  • নির্দিষ্ট ফাইলে টেস্ট রান করুন (এখানে: users_test.rb) $ rails test/system/users_test
  • ... অথবা এক নির্দিষ্ট টেস্ট: $ rails test test/system/users_test.rb:21
  • সব টেস্ট রান করতে: সিস্টেম টেস্ট প্রথমে রান করুন: $ rails test:system test

নোট: অপশন ফ্ল্যাগগুলো test:system-এর সাথে কাজ করে না; আপনি যদি -f (fail fast এর জন্য) বা -v (verbose এর জন্য) যেন ফ্ল্যাগ ব্যবহার করতে চান, তবে $ rails test test/system -v -f ব্যবহার করুন।

কী টেস্ট করব (এবং করব না)

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

টেস্ট সাবজেক্ট বেছে নেওয়ার সময়, আমি চেষ্টা করি এমন একটি এন্টিটি খুঁজে বের করতে যা রিফলেক্ট করে ইউজার অ্যাপটি কীভাবে ব্যবহার করে। আমার টেস্টের নামকরণের জন্য, আমি GitLab-এর নামকরণ কনভেনশন ROLE_ACTION_test.rb ফলো করি, যা এই পদ্ধতির সাথে খুব ভালো মেলে। উদাহরণস্বরূপ: user_shares_card_test.rb।

সাধারণ টিপস এবং ট্রিকস

  • আপনি যদি Devise ব্যবহার করেন প্রমাণীকরণের জন্য, আপনি Devise ইন্টিগ্রেশন হেল্পার ব্যবহার করতে পারেন টেস্ট ইউজার লগ ইন এবং লগ আউট করার জন্য। include Devise::Test::IntegrationHelpers একটি টেস্ট ক্লাসে যোগ করুন, অথবা test_helper.rb ফাইলে যোগ করুন যাতে সব টেস্টে উপলব্ধ থাকে। এখন আপনি একটি ইউজার তৈরি করে sign_in(@user) করতে পারেন। আপনি যদি সেটি setup মেথডে রাখেন, তবে teardown-এ ইউজার লগ আউট করার প্রয়োজন নেই। রেলস setup মেথডে যা থাকে সেটি ক্লিন আপ করে দেয়।
  • ফর্মের সাথে কাজ করার সময়, রেলস দ্বারা মডেল নাম + ফিল্ড নাম থেকে অটোমেটিক্যালি তৈরি হওয়া আইডি এবং বাটন টাইপ রেফারেন্স করা tempting। ( fill_in "user_email", click_on :commit)। কিন্তু যেহেতু সিস্টেম টেস্ট એখন কী একজন ইউজার আসলে দেখে তাদের স্ক্রিনে, তাই ভিজিবল এলিমেন্টস, অর্থাৎ টেক্সট ব্যবহার করা বুঝদার। একটি যুক্তিসঙ্গত অপশন হবে i18n লোকেল ফাইলে রেফারেন্স কী রাখা এবং সেগুলো ব্যবহার করা শाब্দিক টেক্সটের বদলে যেগুলো সবসময় বদলায়। (fill_in :user_email)। Capybara টেক্সট শুধু পূর্ণ I18n সিনট্যাক্স দিয়ে খুঁজে পায়: assert_selector "h1", text: I18n.t("activerecord.models.things")।
  • পাথ হেল্পার ডিফল্টভাবে ইনক্লুডেড থাকে। কিছু লাইব্রেরির জন্য আপনাকে হেল্পার ইনক্লুড করতে হয় টেস্ট ক্লাসে, উদাহরণস্বরূপ include ActionMailer::TestHelper, assert_emails মেথড ব্যবহার করতে।
  • কাস্টম ক্লাস তৈরি করুন ভিন্ন স্ক্রিন সাইজে টেস্ট রান করার জন্য। গাইড দেখুন।
  • স্ক্রিনশট ফিচারটি ডকুমেন্টেশন এবং প্রোমোশনাল মেটেরিয়ালের জন্য স্ক্রিনশট নেওয়ার জন্যও ব্যবহার করা যায়। আপনি যদি এটি একটি স্ক্রিনকাস্ট বানান এবং প্লেব্যাক স্পীড ধীর করুন, তবে মিনিটে একটি প্রোডাক্ট ভিডিও পাবেন!
  • রেলস সিস্টেম টেস্টের জন্য একটি জেনারেটর প্রদান করে।
  • রেলসে মিনিটেস্ট সরাসরি মিনিটেস্ট থেকে কিছুটা ভিন্ন, এবং রেলস-স্পেসিফিক মেথড এবং অ্যাসারশন যোগ করে। প্রথমে রেলস ডক্স চেক করুন, তারপর মিনিটেস্ট ডক্স।

সিস্টেম টেস্টের সাথে আমার খুব ভালো লেগেছে, এবং এর অধিকাংশ কারন হল কত সহজে এটি out-of-the-box ব্যবহার করা যায়।

উপসংহার

এই পোস্টে, আমরা দেখেছি রেলস out-of-the-box কী কনফিগারেশন দিয়েছে এবং কী মিনিমাল কাস্টোমাইজেশন আমরা যোগ করতে পারি। মিনিটেস্ট সিস্টেম টেস্ট লিখতে খুব ভালো। কিছু টিপস এবং ট্রিকস আপনার প্রথম সিস্টেম টেস্টগুলো চালু করতে সাহায্য করবে। ব্রাউজারে তাদের ম্যাজিক দেখুন!

  1. Apple TV+ নবীনের গাইড: সাইন আপ, নেভিগেট, এবং এক্সক্লूसিভ কন্টেন্ট উপভোগ

  2. স্টারডকের সেরা কাস্টোমাইজেশন অ্যাপস দিয়ে উইন্ডোজ ১১ রূপান্তর করুন

  3. Android Messages for Web মাস্টার করুন: দ্রুত সেটআপ ও টিপস

  4. Xen ভার্চুয়ালাইজেশনের সাথে শুরু: একটি কম্প্রিহেনসিভ বিগিনার্স গাইড