যদি আপনার রুবি অ্যাপ্লিকেশন কোনো ধরনের বাহ্যিক API ব্যবহার করে তাহলে আপনি সম্ভবত ধীরগতির পরীক্ষা এবং API হারের সীমা সমস্যার সম্মুখীন হয়েছেন। .
সমাধান কি?
আপনি আপনার ক্লায়েন্ট লাইব্রেরি থেকে ম্যানুয়ালি এইচটিটিপি পদ্ধতিগুলিকে আটকাতে পারেন এবং কিছু পূর্ব-নির্ধারিত প্রতিক্রিয়া ফেরত দিতে পারেন৷
কিন্তু এটা অনেক কাজের এবং কুৎসিত কোড!
একটি ভাল সমাধান হল ওয়েবমক + ভিসিআর এর মত রত্নগুলির একটি শক্তিশালী সংমিশ্রণ ব্যবহার করা .
WebMock সাধারণ HTTP লাইব্রেরি থেকে HTTP অনুরোধগুলিকে বাধা দেয়, যেমন:
- নেট/http
- ফ্যারাডে
- বিশ্রাম ক্লায়েন্ট
- …আরও অনেক কিছু!
এটি একাই দরকারী, তবে আপনাকে এখনও প্রতিক্রিয়া ডেটা সরবরাহ করতে হবে৷
এখানে ভিসিআর আসে…
VCR আপনার কোড দ্বারা তৈরি HTTP প্রতিক্রিয়া রেকর্ড করতে WebMock-এর সাথে একত্রে কাজ করে .
এই রেকর্ডিংগুলোকে "ক্যাসেট" বলা হয়।
যখন আপনি আপনার পরীক্ষা চালান :
ভিসিআর ক্যাসেট ফাইল লোড করবে এবং রেকর্ড করা প্রতিক্রিয়া ফেরত দেবে। আপনি দ্রুত প্রতিক্রিয়া পাবেন কারণ আপনাকে আসল API জিজ্ঞাসা করতে হবে না।
আসুন কিছু কোড উদাহরণ দেখি!
ভিসিআর কোডের উদাহরণ
এই উদাহরণের জন্য আমরা RSpec ব্যবহার করতে যাচ্ছি কারণ এটি VCR-এর সাথে আরও ভালভাবে সংহত করে যেমন আপনি পরবর্তী বিভাগে দেখতে পাবেন।
এই কোডটি আমরা পরীক্ষা করতে চাই :
require "faraday" require "json" class Github def self.user(name) url = "https://api.github.com/users/#{name}" data = Faraday.get(url).body JSON.parse(data, symbolize_names: true) end end
এটি একটি নির্দিষ্ট ব্যবহারকারী সম্পর্কে তথ্য পেতে Github API এর কাছে একটি অনুরোধ করে। বেশ সহজ কিন্তু এটি আমাদের ভিসিআর কিভাবে কাজ করে তা জানতে সাহায্য করবে।
এই কোডের জন্য একটি পরীক্ষা এরকম দেখতে পারে :
require "rspec/autorun" require_relative "github_api_example" describe Github do let(:user_response) { Github.user("ruby") } it "can fetch & parse user data" do expect(user_response).to be_kind_of(Hash) expect(user_response).to have_key(:id) expect(user_response).to have_key(:type) end end
এটি আসল API এবং পাসে আঘাত করবে, তবে এটি শেষ হতে প্রায় অর্ধ সেকেন্ড সময় নেয়।
এক পরীক্ষার জন্য অর্ধেক সেকেন্ড!
খুব বেশি মনে নাও হতে পারে, কিন্তু কল্পনা করুন যে আপনার একশত পরীক্ষা আছে, সেগুলি চালানোর জন্য 50 সেকেন্ড।
এটা ঠিক করার সময়…
এই বিট কোড যোগ করে ভিসিআর চালু করা যাক :
require "vcr" VCR.configure do |c| c.cassette_library_dir = "spec/vcr" c.hook_into :webmock end
আপনি এই কোডটি
test_helper
-এ যোগ করতে পারেন ফাইল, তাই এটি আপনার সমস্ত পরীক্ষার জন্য উপলব্ধ
এই configure
দিয়ে ব্লক করুন আপনি VCR কে বলছেন কোথায় ক্যাসেট ফাইল সংরক্ষণ করতে হবে, এবং WebMock ইন্টিগ্রেশন সক্ষম করতে।
আপনি যদি ফ্যারাডে, বা এক্সকন ব্যবহার করেন, তাহলে ভিসিআর সরাসরি সেগুলির সাথে যুক্ত হতে পারে৷
৷
শুধু :webmock
প্রতিস্থাপন করুন :faraday
এর সাথে , অথবা :excon
.
পরবর্তী :
আপনাকে VCR কে বলতে হবে ক্যাসেটের নাম এবং এগুলোর অধীনে কোন কোড চলবে।
এখানে কিভাবে :
let(:user_response) do VCR.use_cassette("github/user") { Github.user("ruby") } end
আপনি যখন আপনার পরীক্ষা চালাবেন তখন VCR cassette_library_dir
এর অধীনে একটি ফাইল তৈরি করবে , এই ক্ষেত্রে ফাইলের নাম হবে spec/vcr/github/user.yaml
, আপনি যদি অনুসরণ করেন তবে আপনি এটি দেখতে চাইতে পারেন।
যদি আমি এখন পরীক্ষা চালাই তবে এটি অনেক দ্রুত হবে .
আসলে…
এটি শেষ করতে মাত্র 0.01 সেকেন্ড সময় লাগে!
"একটি HTTP অনুরোধ করা হয়েছে যে VCR কীভাবে পরিচালনা করতে হয় তা জানে না"
আপনি যদি এই ত্রুটি বার্তাটি চালান তবে এর অর্থ দুটি জিনিসের মধ্যে একটি:
1. আপনি VCR সক্ষম করে একটি HTTP কল করার চেষ্টা করছেন, কিন্তু একটি VCR.use_cassette
এর বাইরে ব্লক।
সমাধান :ডিফল্টরূপে VCR + WebMock সমস্ত HTTP অনুরোধ ব্লক করুন। আপনি কনফিগারেশন বিকল্পগুলির সাথে এটি পরিবর্তন করতে পারেন, অনুপস্থিত VCR ব্লক যোগ করতে পারেন, অথবা RSpec মেটাডেটা (পরবর্তী বিভাগ) ব্যবহার করতে পারেন।
2.আপনি একটি ভিন্ন অনুরোধ করার চেষ্টা করছেন এবং একটি ক্যাসেট ব্যবহার করছেন যা এই URL এর সাথে মেলে না৷ উদাহরণস্বরূপ, যদি আপনি আপনার পরীক্ষায় অনুরোধ করেন /users/ruby
, যদি আপনি পরীক্ষাটি /users/apple
-এ পরিবর্তন করেন তাহলে ক্যাসেটটি বিশেষভাবে এই URL-এর জন্য তৈরি করা হবে তারপর আপনি এই ত্রুটিটি দেখতে পাবেন কারণ ক্যাসেটটি একটি ভিন্ন URL এর জন্য।
সমাধান :বিভিন্ন URL-এর জন্য বিভিন্ন ক্যাসেট ব্যবহার করুন, new_episodes
সক্ষম করুন রেকর্ডিং মোড (vcr: { record: :new_episodes }
) অথবা আপনি অনুরোধ URL আপডেট করার পরে পুরানো ক্যাসেট মুছে দিন।
আরএসপিক মেটাডেটা কিভাবে ব্যবহার করবেন
VCR.use_cassette
পদ্ধতিটি এই রত্নটি ব্যবহার করার একটি ভাল উপায়৷
কিন্তু…
আপনি ভিসিআরকে আপনার জন্য স্বয়ংক্রিয়ভাবে ক্যাসেট তৈরি করতে দিতে পারেন।
কিভাবে?
এটি VCR.configure
-এর ভিতরে যোগ করুন ব্লক:
c.configure_rspec_metadata!
এখন আপনি একটি নির্দিষ্ট পরীক্ষার জন্য ভিসিআর সক্ষম করতে পারেন (it
ব্লক), অথবা একটি পরীক্ষার গ্রুপের জন্য (describe
)।
এরকম :
describe Github, :vcr do # ... end
এটি পরীক্ষার বিবরণের নামে ক্যাসেট ফাইল তৈরি করবে :
spec/vcr/ └── Github ├── can_parse_user_data.yml └── can_test_vcr.yml
লক্ষ্য করুন যে এটি প্রতি পরীক্ষায় একটি ক্যাসেট তৈরি করবে…
এমনকি যদি দুটি পরীক্ষা একই অনুরোধ করে এবং একই ডেটা ব্যবহার করে। ভিসিআর তাদের জন্য আলাদা ক্যাসেট তৈরি করবে।
সহায়ক ভিসিআর বিকল্প এবং টিপস
যদি আপনার ক্যাসেট নিয়ে সমস্যা হয়, বা আপনি যদি ডেটার একটি নতুন সংস্করণ চান, তাহলে আপনি ক্যাসেট ফাইলগুলি মুছে ফেলতে পারেন .
VCR নতুন API প্রতিক্রিয়া রেকর্ড করবে এবং এটি আপনার সমস্যার সমাধান করতে পারে।
কিন্তু তা না হলে কি হবে?
আপনি ডিবাগ মোড সক্ষম করতে পারেন৷ VCR.configure
-এ :
VCR.configure do |c| # ... c.debug_logger = $stderr end
এটি প্রচুর আউটপুট তৈরি করতে পারে, তাই আপনার পরীক্ষাগুলিকে শুধুমাত্র আপনার আগ্রহীদের মধ্যে সীমাবদ্ধ করুন৷
৷পরবর্তী :
ধরা যাক API কী, বা API প্রতিক্রিয়ার অংশ হিসাবে অন্যান্য সংবেদনশীল ডেটা আছে…
আপনি রেকর্ডিং থেকে সেই ডেটা ফিল্টার করতে চাইতে পারেন।
এখানে কিভাবে :
VCR.configure do |c| # ... c.define_cassette_placeholder("<API_KEY>", ENV["API_KEY"]) end
সারাংশ
আপনি শিখেছেন কিভাবে WebMock এবং VCR রত্ন ব্যবহার করতে হয় যাতে আপনি বহিরাগত API প্রতিক্রিয়াগুলির জন্য অপেক্ষা না করে আপনার রুবি অ্যাপগুলির জন্য পরীক্ষা লিখতে পারেন!
আপনি যদি এটি পছন্দ করেন তবে এই নিবন্ধটি শেয়ার করতে ভুলবেন না যাতে আরও লোকেরা এটি উপভোগ করতে পারে৷
পড়ার জন্য ধন্যবাদ 🙂