আপনি একটি নতুন প্রকল্প শুরু করেছেন এবং আপনার কোডটি তৃতীয় পক্ষের পরিষেবার উপর নির্ভর করার সময়। এটি ইলাস্টিক সার্চ, রেস্ক, একটি বিলিং প্রদানকারী, অথবা শুধুমাত্র একটি নির্বিচারে HTTP API এর মত কিছু হতে পারে। আপনি একজন ভাল বিকাশকারী, তাই আপনি চান যে এই কোডটি ভালভাবে পরীক্ষা করা হোক। কিন্তু আপনি কীভাবে এমন কোড পরীক্ষা করবেন যা সম্পূর্ণরূপে আপনার নিয়ন্ত্রণের বাইরে এমন একটি পরিষেবার অনুরোধগুলি ফায়ার করে?
আপনি পরীক্ষাগুলি এড়িয়ে যেতে পারেন, তবে আপনি শীঘ্রই অশনি ফাউন্ডেশনে আরও কোড তৈরি করবেন। অ-পরীক্ষিত কোডটি আরও জটিল কোডকে আকর্ষণ করে, এবং আপনি শেষ পর্যন্ত মনে করবেন যে কোডটি খুব বিপজ্জনক টরফ্যাক্টর কারণ আপনার কাছে নিরাপদ বোধ করার জন্য প্রয়োজনীয় পরীক্ষার কভারেজ নেই। আপনি আপনার ভবিষ্যত কাজের জন্য একটি স্থিতিশীল ভিত্তি তৈরি করতে চান, কিন্তু পরিবর্তে আপনি একটি অসংযত জগাখিচুড়ির সাথে শেষ করেছেন৷
এই পরিস্থিতি এড়ানো অনেক সহজ মনে হয়! কিছু টুলস এবং একটু আপ-ফ্রন্ট প্রচেষ্টার সাহায্যে, আপনি আপনার কোডের উপর নির্ভর করে এমন পরিষেবাগুলি থেকে আপনার পরীক্ষাগুলিকে দ্বিগুণ করতে পারেন, সহজ কোড লিখতে পারেন এবং আপনার লেখা কোডটি উন্নত করার আত্মবিশ্বাস রাখতে পারেন – বাগগুলি প্রবর্তন না করেই৷ দেরি না করে কারণ আপনি জানেন না কিভাবে পরবর্তী পরীক্ষাগুলো লিখতে হয়, আপনি আপনার কোড এবং বহির্বিশ্বের মধ্যে একটি মিথস্ক্রিয়া দেখতে পারেন এবং ঠিক কীভাবে এর মাঝখানে ঝাঁপিয়ে পড়তে হয় তা জানতে পারেন।
মোচা:দ্রুত এবং নোংরা পদ্ধতি
আপনার কোড এবং বাইরের বিশ্বের মধ্যে মোচা হল সবচেয়ে সহজ উপায়।
উদাহরণ হিসেবে, বলুন আপনার একটি Cart
আছে বস্তু যা ক্রেডিটকার্ড চার্জ ট্রিগার করে যখন এটি চেক আউট হয়। আপনি নিশ্চিত করতে চান যে চার্জ ব্যর্থ হলে কার্টটিতে একটি ত্রুটি বার্তা সংযুক্ত রয়েছে৷
আপনি সম্ভবত আপনার পরীক্ষাগুলি আসলে হিট করতে চান না৷ বিলিং সিস্টেম প্রতিবার পরীক্ষা চালানোর সময়। এমনকি যদি আপনি করেন, তাহলে সেই পরিষেবাটিকে ব্যর্থতা ফিরিয়ে দিতে বাধ্য করা কঠিন হতে পারে। মোচা দিয়ে এটি দেখতে কেমন হবে তা এখানে:
def test_error_message_set_on_charge_failure
cart = Cart.new(items)
cart.stubs(:charge!).returns(false) # mocha in action
cart.checkout!
assert_equal "The credit card could not be charged", cart.credit_card_error
end
মোচাও আপনার পরীক্ষায় ব্যর্থ হতে পারে যদি পদ্ধতিগুলিকে আপনি যেভাবে আশা করেন সেভাবে বলা না হয়:
def test_only_bill_once_per_cart
cart = Cart.new(items)
cart.expects(:charge!).once # Don't double-bill, no matter how many times we check out
cart.checkout!
cart.checkout!
end
মোচা ব্যবহার করা সহজ, কিন্তু অবিশ্বাস্যভাবে সহজ হতে পারে। আপনাকে সতর্ক থাকতে হবে যে আপনি শুধু উপহাস করছেন আপনি যে আচরণটি ঘটতে চান না - খুব বেশি উপহাস করা এবং আসল বাগগুলি লুকানো সহজ। আপনি এই পদ্ধতির সাথে ওভারবোর্ডে যেতে চান না:expects
পূর্ণ পরীক্ষা এবং stubs
পড়া এবং চিন্তা করা কঠিন।
জাল পরীক্ষা করুন:আমার পছন্দের পদ্ধতি
আপনি যদি একই বস্তুতে সব সময় একই পদ্ধতি নিয়ে উপহাস করেন বা স্টাব করেন, তাহলে আপনি আপনার ঠাট্টাকে পূর্ণাঙ্গ বস্তুতে উন্নীত করতে পারেন (কখনও কখনও জাল পরীক্ষা করা হয় ), এই মত:
def test_billed_full_amount_minus_discount
test_payment_provider = TestPaymentProvider.new # A fake payment provider
cart = Cart.new(items, discount: 30, provider: test_payment_provider)
cart.checkout!
assert_equal items.sum(:&price) * 0.7, test_payment_provider.total_charges
end
জাল মহান:
-
আপনার জাল তার অভ্যন্তরীণ অবস্থার উপর নজর রাখতে পারে
জালটিতে কাস্টম অ্যাসারশন মেসেজ এবং হেল্পার ফাংশন থাকতে পারে যা আপনার পরীক্ষাগুলিকে আরও সহজ করে তোলে, যেমন
total_charges
উপরের উদাহরণে পদ্ধতি। -
একটি সম্পূর্ণ বস্তু হিসাবে, আপনি অতিরিক্ত সম্পাদক এবং ভাষা সমর্থন পান
আপনি যদি এটিকে সমর্থন করে এমন একটি সম্পাদক ব্যবহার করেন, তাহলে আপনি স্বয়ংসম্পূর্ণ, ইনলাইন ডকুমেন্টেশন এবং অন্যান্য জিনিসগুলি পেতে পারেন যা আপনি মোচা দিয়ে পৃথক পদ্ধতিগুলিকে আটকে দিয়ে পাবেন না। এছাড়াও আপনি আরও ভাল বৈধতা, ব্যতিক্রম পরিচালনা এবং অন্য যা কিছু আপনার জাল তৈরি করতে চান তা পাবেন।
-
আপনি যদি ডেভেলপমেন্ট মোডে একটি নকল ব্যবহার করেন, তাহলে আপনার আসল পরিষেবার সাথে সংযোগ থাকতে হবে না
আপনি বাসে আপনার অ্যাপটি লিখতে পারেন, আপনার ল্যাপটপের ব্যাটারি শেষ হয়ে যাওয়া পরিষেবার বন থাকতে হবে না এবং আপনি এই নকল পরিষেবাগুলিকে সেট আপ করতে পারেন যাতে আপনি অনেক কিছুর প্রয়োজন ছাড়াই এজ কেসগুলির মাধ্যমে কাজ করতে চান এমন ডেটা ফেরত দিতে পারেন। সেটআপ।
-
এই বস্তুগুলি আপনার পরীক্ষার বাইরে ব্যবহার করা যেতে পারে
এটি সম্ভবত জাল আমার প্রিয় অংশ. আপনি একটি 3য় পক্ষের পরিষেবা এবং আপনার নকল উভয়ের জন্য একটি লগিং ক্লায়েন্ট লগ থাকতে পারেন, একটি ইন-মেমরি অ্যারে দ্বারা ব্যাকড৷ আপনি তারপর আপনার সাইটে একটি অ্যাডমিন ভিউতে এই অ্যারের বিষয়বস্তু ডাম্প করতে পারেন , আপনি লগিং করছেন বলে আপনি যা মনে করেন তা যাচাই করা আরও সহজ করে তোলে৷
আপনি এই মত কিছু করতে পারেন:
fake_backend = FakeBackend.new
LoggingService.backends = [RealBackend.new, fake_backend]
LoggingService.debug("TEST MESSAGE PLEASE IGNORE")
fake_backend.messages.first # => [:debug, "TEST MESSAGE PLEASE IGNORE"]
একটি জাল লেখার জন্য পৃথক পদ্ধতিগুলিকে আটকানোর চেয়ে বেশি প্রচেষ্টা লাগে, তবে অনুশীলনের সাথে সহায়ক জাল তৈরি করতে এক বা দুই ঘন্টার বেশি সময় নেওয়া উচিত নয়। আপনি যদি এমন একটি তৈরি করেন যা অন্য লোকেদের জন্য উপযোগী হবে, তবে এটি ভাগ করুন! আমি অনেক আগে রেস্ক-ইউনিট তৈরি করেছি, এবং আজও অনেক মানুষ এটি ব্যবহার করে।
আমি কীভাবে এই বস্তুগুলিকে ইনজেকশন করতে পারি?
কোনভাবে এই নকলের সাথে কথা বলার জন্য আপনাকে আপনার বস্তুগুলি পরীক্ষা করতে হবে। সৌভাগ্যবশত, রুবিকে অপব্যবহার করা এত সহজ যে নকল ইনজেকশন দেওয়া কঠিন নয়।
আপনি যদি পরীক্ষার অধীনে বস্তুর API নিয়ন্ত্রণ করেন, তাহলে অ্যাডফল্ট প্যারামিটার, একটি অ্যাট্রিবিউট বা একটি কনস্ট্রাক্টর বিকল্প যোগ করা ভাল যেখানে আপনি আপনার জাল সেট করতে পারেন:
class Card
attr_reader :provider
def initialize(items, options={})
@provider = options.fetch(:provider) { RealProvider.new }
end
end
আপনি যখন আসল পরিষেবার সাথে কথা বলছেন তখন এটি পরিষ্কার হয় এবং পরে নমনীয়তা যোগ করার জন্য আপনাকে অহুক দেয়।
আপনি যদি বস্তুটিকে নিয়ন্ত্রণ না করেন বা অতিরিক্ত প্যারামিটার যোগ করতে না চান, তাহলে আপনি সর্বদা মাঙ্কি প্যাচ করতে পারেন:
# if in test mode
Card.class_eval do
def provider
@provider ||= TestProvider.new
end
end
এটি পরীক্ষায় আরও কুৎসিত, কিন্তু পরিবেশে পরিষ্কার যা নকল ব্যবহার করে না।
এখনই নিজের জাল তৈরি করা শুরু করুন
অনুশীলনের মাধ্যমে জাল তৈরি করা সহজ হয়ে যায়, তাই আপনার এটি এখনই চেষ্টা করা উচিত:
- একটি পরীক্ষা খুঁজুন যা একটি বহিরাগত পরিষেবার সাথে কথা বলে৷ আপনি ইন্টারনেট থেকে সংযোগ বিচ্ছিন্ন করলে যে পরীক্ষাগুলি ব্যর্থ হবে সেগুলি ভাল প্রার্থী৷
- আসলে কোন বস্তুটি যোগাযোগ করে, এবং সেই বস্তুটিকে আপনার কোড কি বলে কল করে তা বের করুন।
- সেই অবজেক্টের ক্লাসের বেশিরভাগ খালি ডুপ্লিকেট তৈরি করুন, এবং এটিকে আপনি অ্যারেতে করা কলগুলি লগ করতে দিন৷
- কলের তালিকা ফেরত দেওয়ার জন্য আপনার জালটিতে একটি পদ্ধতি যোগ করুন।
- আপনার নতুন নকল বস্তুর সাথে আসল বস্তুটি অদলবদল করুন, এবং আপনার কোডের মাধ্যমে করা কলগুলির বিরুদ্ধে কিছু দাবি লিখুন।
আপনি যদি এটি একবার চেষ্টা করেন তবে আমাকে জানান যে এটি কীভাবে যায়!
এই কৌশলগুলির সাহায্যে, যতক্ষণ না আপনি আপনার অ্যাপ্লিকেশন এবং বহির্বিশ্বের মধ্যে সবচেয়ে পাগলামি মিথস্ক্রিয়াকে নিয়ন্ত্রণ করতে সক্ষম হবেন ততক্ষণ বেশি সময় লাগবে না। সঠিক জায়গায় একটি সাধারণ স্টাব আপনাকে আপনার ভাল-পরীক্ষিত কোডটি আত্মবিশ্বাসের সাথে পাঠাতে দেবে৷