(এটি প্র্যাকটিসিং রেইলস থেকে একটি ছোট এক্সার্পট। প্রথম চ্যাপ্টার ফ্রি পেতে এখানে সাইন আপ করুন!)
তো, আপনি একটি নতুন অ্যাপ্লিকেশনে কাজ করছেন, এবং রেইলস আপনার জন্য একটি টেস্ট জেনারেট করলো:
require 'test_helper' class BugTest < ActiveSupport::TestCase # test "the truth" do # assert true # end end
আপনি আনকমেন্ট করলেন, একটা নাম ভাবলেন, এবং আপনি আপনার টেস্ট লিখতে প্রস্তুত, ঠিক না? কিন্তু তারপর কী? আপনি প্রথমে কী লিখবেন? আপনার টেস্ট কোড কেমন দেখাবে?
আপনি যদি একটি সিম্পল প্যাটার্ন ফলো করেন, সেই স্টাবড আউট লাইনগুলোকে ক্লিয়ার, ভালো স্ট্রাকচার্ড টেস্ট কেসে রূপান্তর করতে পারবেন।
থ্রি-ফেজ টেস্ট প্যাটার্ন
আপনার টেস্ট কেসগুলো তিনটি ফেজে কাজ করা উচিত:
- প্রথমে, আপনি কিছু সেট আপ করুন ("Arrange")
- তারপর, আপনি কিছু করুন ("Act")
- তারপর, নিশ্চিত করুন যে আপনি যা এক্সপেক্ট করলেন সেটা আসলেই হয়েছে। ("Assert")
উদাহরণস্বরূপ, কল্পনা করুন আপনি রুবিতে একটি অ্যারের মেথড টেস্ট করছেন। এই প্যাটার্ন ফলো করলে, আপনার টেস্ট এমন দেখতে পারে:
test "Array#sort will sort an array of numbers" do # arrange unsorted_array = [7, 4, 2, 3] # act sorted_array = unsorted_array.sort # assert assert_equal [2, 3, 4, 7], sorted_array end
সহজ। তবে টেস্টের প্রতিটি অংশের একটি জায়গা আছে, এবং টেস্টের প্রতিটি স্টেজ প্রায় আপনাকে বলে দেয় কীভাবে লিখবেন।
কখনো কখনো আপনাকে Arrange ফেজ লাগবে না, অথবা Act এবং Assert ফেজ একসাথে থাকবে। কিন্তু টেস্ট লিখার সময় তিনটি ফেজ চিন্তা করা সাহায্য করে।
Assert ফেজের গটচা
Assert ফেজের একটা ট্রিক আছে: আপনি Act ফেজে যে লজিক ব্যবহার করেছেন সেটা Assert ফেজে ব্যবহার করবেন না। আপনাকে সবসময় একই জবাব পাওয়ার জন্য দুটি পথ নিতে হবে। অন্যথায়, আপনি যে কোডটি কল করছেন সেটার বাগ খুঁজে পাবেন না, কারণ সেটা Assert ফেজে আবার কল হচ্ছে।
উদাহরণস্বরূপ, আপনি যদি কিছু ম্যাথ করেন:
test "average returns the average of a set of numbers" do # arrange numbers = [1, 2, 3, 4] # act average = numbers.average # assert # এটি খারাপ assert_equal [1, 2, 3, 4].average, average # এটি ভালো assert_equal 2.5, average end
[1, 2, 3, 4].average আবার Assert ফেজে কল করা খারাপ, কারণ average অলমেस्ट কিছুই রিটার্ন করলে সেটা পাস করবে।
এখানে এটা স্পষ্ট। কিন্তু জিনিসগুলো জটিল হলে ও, নিশ্চিত করুন আপনি একই কোড দুবার রান করছেন না। অন্যথায় আপনি শুধু ভেরিফাই করছেন যে আপনার মেথড কল হয়েছে, না যে সেটা আপনার আশা অনুযায়ী কাজ করেছে।
সাধারণত, দ্বিতীয় পথে জবাব পাওয়ার সবচেয়ে সহজ উপায় হচ্ছে হাতে ক্যালকুলেট করে হার্ডকোড করা। এটা ব্রিটল হতে পারে, কিন্তু আপনার টেস্ট আপনার অজান্তে ভাঙতে দেওয়ার চেয়ে ভালো।
কেন তিন ফেজ?
আপনি যদি আপনার টেস্টগুলো তিন ফেজে ভাগ করেন, তবে আপনার কাছে সিম্পলার প্রশ্ন থাকে। "এই টেস্ট কীভাবে লিখব?" বদলে, আপনি প্রতিটি ফেজে ফোকাস করতে পারেন: "এই টেস্ট কীভাবে সেট আপ করব?", "আমি কী টেস্ট করছি?", "জবাব কেমন দেখাব?"
এই প্রশ্নগুলোরও সহজ জবাব নাও হতে পারে, তবে পুরো টেস্ট একসাথে চিন্তা করার চেয়ে জবাবগুলো অনেক সহজ হবে। এবং আপনি যদি লাকি হন, তবে রিলেটেড টেস্টগুলোর মধ্যে ফেজগুলো শেয়ার করতে পারেন, যাতে আপনার পরবর্তী টেস্ট লিখা অনেক কম পেইনফুল হয়।