Hamcrest হল একটি শক্তিশালী লাইব্রেরি যা JUnit টেস্টিং ফ্রেমওয়ার্কের সাথে একত্রে ব্যবহার করা হয়। এটি বিভিন্ন Matcher সরবরাহ করে যা আপনাকে টেস্টের মধ্যে জটিল সমতা, অবস্থা পরীক্ষা করতে সাহায্য করে। তবে, কখনও কখনও আপনাকে custom matcher তৈরি করতে হতে পারে যখন আপনি নির্দিষ্ট কিছু কাস্টম যাচাইকরণ বা লজিক প্রয়োগ করতে চান।
এই টিউটোরিয়ালে, আমরা Hamcrest লাইব্রেরি ব্যবহার করে Custom Matcher তৈরি করার পদ্ধতি আলোচনা করব।
১. Hamcrest Library Overview
Hamcrest হল একটি matcher library যা মূলত JUnit এর সাথে ব্যবহৃত হয়। এটি সহজ এবং স্বাভাবিক ভাষায় asserts বা checks তৈরি করার জন্য ডিজাইন করা হয়েছে। Hamcrest মাচাররা কিছু সাধারণ matchers যেমন is(), equalTo(), not(), greaterThan(), lessThan() ইত্যাদি সরবরাহ করে, তবে কখনও কখনও ডেভেলপারদের নিজের কাস্টম মাচার তৈরি করার প্রয়োজন হতে পারে।
২. Custom Matcher তৈরির প্রয়োজনীয়তা
কখনও কখনও, আপনার টেস্টে এমন কিছু লজিক থাকতে পারে যা Hamcrest এর ডিফল্ট matchers দিয়ে পরীক্ষা করা সম্ভব নয়। এ ধরনের পরিস্থিতিতে, Custom Matcher ব্যবহার করা হয় যা টেস্টের মধ্যে নির্দিষ্ট শর্ত বা নিয়ম পরীক্ষা করতে সহায়তা করে।
যেমন:
- যদি আপনি একটি অদ্ভুত শর্ত (অথবা অস্বাভাবিক যাচাইকরণ) বা কিছু ভ্যালিডেশন করতে চান, যেটি Hamcrest এর প্রাক-নির্ধারিত matchers দ্বারা সম্ভব নয়।
- আপনি যদি আপনার কাস্টম অ্যাসারশন বা লজিক তৈরি করতে চান।
৩. Custom Matcher তৈরি করার পদ্ধতি
Hamcrest লাইব্রেরিতে কাস্টম matcher তৈরি করতে হলে, আপনাকে Matcher ক্লাসটি ইমপ্লিমেন্ট করতে হবে এবং সেই অনুযায়ী মেথডগুলো তৈরি করতে হবে। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে একটি কাস্টম matcher তৈরি করা হচ্ছে যা একটি সংখ্যাকে সঠিকভাবে চেক করবে।
৩.১ Custom Matcher এর উদাহরণ:
ধরা যাক, আপনি একটি Custom Matcher তৈরি করতে চান যা একটি নির্দিষ্ট গুণমানের সাথে সংখ্যাকে যাচাই করবে। উদাহরণস্বরূপ, যদি সংখ্যাটি ১০ এর বেশি হয় এবং তার সাথে একটি নির্দিষ্ট সীমা পূরণ হয়, তবে এটি match হবে।
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class GreaterThanTenMatcher extends TypeSafeMatcher<Integer> {
@Override
public void describeTo(Description description) {
description.appendText("a number greater than 10");
}
@Override
protected boolean matchesSafely(Integer item) {
return item > 10;
}
public static Matcher<Integer> greaterThanTen() {
return new GreaterThanTenMatcher();
}
}
এখানে, GreaterThanTenMatcher একটি কাস্টম matcher যা matchesSafely() মেথডে লজিক দিয়ে সংখ্যাটি ১০ এর বেশি কিনা পরীক্ষা করে। describeTo() মেথডটি ব্যর্থ হলে টেস্টের ব্যাখ্যা তৈরি করতে ব্যবহৃত হয়।
৩.২ Custom Matcher ব্যবহার করা
আপনি যখন আপনার কাস্টম matcher তৈরি করবেন, তখন এটি টেস্টে assertThat() এর সাথে ব্যবহার করতে পারবেন।
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
public class GreaterThanTenMatcherTest {
@Test
public void testGreaterThanTen() {
assertThat(15, GreaterThanTenMatcher.greaterThanTen()); // Test passes
assertThat(5, GreaterThanTenMatcher.greaterThanTen()); // Test fails
}
}
এখানে, assertThat() ব্যবহার করা হয়েছে যা GreaterThanTenMatcher.greaterThanTen() matcher এর মাধ্যমে সংখ্যাটিকে যাচাই করছে।
৪. Custom Matcher তৈরি করার আরেকটি উদাহরণ
ধরা যাক, আপনি একটি String যাচাই করতে চান যে এটি নির্দিষ্ট প্রিফিক্স দিয়ে শুরু হয় কিনা। এটির জন্য একটি কাস্টম matcher তৈরি করা যায়।
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class StartsWithMatcher extends TypeSafeMatcher<String> {
private final String prefix;
public StartsWithMatcher(String prefix) {
this.prefix = prefix;
}
@Override
protected boolean matchesSafely(String item) {
return item.startsWith(prefix);
}
@Override
public void describeTo(Description description) {
description.appendText("a string starting with ").appendValue(prefix);
}
public static Matcher<String> startsWith(String prefix) {
return new StartsWithMatcher(prefix);
}
}
এখানে, startsWith() মেথডের মাধ্যমে আপনি String এর প্রিফিক্স চেক করতে পারেন। এটি String শুরু হয় কি না তা যাচাই করবে।
৪.১ Custom String Matcher ব্যবহার করা
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
public class StartsWithMatcherTest {
@Test
public void testStartsWith() {
assertThat("Hello World", StartsWithMatcher.startsWith("Hello")); // Test passes
assertThat("Hello World", StartsWithMatcher.startsWith("Hi")); // Test fails
}
}
এখানে, StartsWithMatcher কাস্টম matcher এর মাধ্যমে আপনি টেস্টের মধ্যে যাচাই করছেন যে স্ট্রিংটি "Hello" দিয়ে শুরু হয় কিনা।
৫. Hamcrest Matcher তৈরির সুবিধা
- Reusable and Readable: কাস্টম মাচাররা টেস্ট কোডকে আরও সহজ এবং রিডেবল করে তোলে।
- Code Maintainability: আপনি একবার কাস্টম মাচার তৈরি করলে তা একাধিক টেস্ট কেসে ব্যবহার করতে পারেন, যা কোড রিড্যাবিলিটি এবং মেইনটেন্যান্স উন্নত করে।
- Flexibility: কাস্টম মাচাররা খুবই ফ্লেক্সিবল এবং আপনি আপনার টেস্টে বিশেষ শর্ত বা লজিক প্রয়োগ করতে পারবেন।
- Composability: কাস্টম মাচাররা অন্যান্য Hamcrest matchers এর সাথে কম্বাইন করে আরও জটিল লজিক তৈরি করতে পারে।
সারাংশ
Hamcrest লাইব্রেরি দিয়ে কাস্টম matcher তৈরি করা JUnit টেস্টিংয়ের জন্য একটি শক্তিশালী পদ্ধতি। এটি আপনাকে জটিল শর্তগুলো সহজভাবে যাচাই করতে সহায়তা করে, এবং আপনার টেস্টগুলোকে আরও সহজ, রিডেবল এবং মেইনটেইনেবল করে তোলে। TypeSafeMatcher ইন্টারফেস ব্যবহার করে, আপনি সহজেই কাস্টম matcher তৈরি করতে পারেন এবং এগুলোকে আপনার টেস্ট কেসে প্রয়োগ করতে পারেন।
Read more