JUnit হল একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্ট তৈরি এবং পরিচালনার জন্য ব্যবহৃত হয়। Custom Matchers হল এমন একটি বৈশিষ্ট্য যা আপনাকে JUnit টেস্টিংয়ে আরও নমনীয়তা এবং কাস্টমাইজেশন প্রদান করে। এটি একটি কাস্টম লজিক ব্যবহার করতে সাহায্য করে যা ডিফল্ট Matcher এর মাধ্যমে সম্ভব নয়।
এই টিউটোরিয়ালে আমরা আলোচনা করব Custom Matchers এর ব্যবহার, এর প্রয়োজনীয়তা এবং কিভাবে এটি JUnit টেস্টে প্রয়োগ করা যেতে পারে।
১. Custom Matchers কি?
Matchers হল JUnit বা Hamcrest এর একটি বৈশিষ্ট্য যা নির্দিষ্ট শর্ত যাচাই করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি যদি চান যে আপনার টেস্টে কোনো ভ্যালু positive বা negative হতে হবে, তাহলে আপনি Matchers ব্যবহার করে সেই শর্তটি যাচাই করতে পারেন।
Custom Matchers হল কাস্টম লজিক বা কন্ডিশন যা আপনি নিজের প্রয়োজন অনুযায়ী তৈরি করতে পারেন। এগুলি ব্যবহারকারীর নির্দিষ্ট প্রয়োজন অনুসারে কাস্টম যাচাইকরণ লজিক প্রয়োগ করতে সক্ষম।
Custom Matcher উদাহরণ:
ধরা যাক, আপনি একটি কাস্টম Matcher তৈরি করতে চান যা String এর মধ্যে কোনো নির্দিষ্ট সাবস্ট্রিং খুঁজে পাবে।
২. Custom Matchers কেন প্রয়োজন?
Custom Matchers এর প্রয়োজন পড়তে পারে যখন:
- Default Matchers আপনার টেস্টের জন্য পর্যাপ্ত নয় বা তারা আপনার প্রয়োজনের সাথে পুরোপুরি মিলে না।
- আপনি complex বা specific conditions যাচাই করতে চান যা সাধারণ Hamcrest বা JUnit Matchers দিয়ে সম্ভব নয়।
- Reusable conditions তৈরি করতে চান যেগুলি একাধিক টেস্টে ব্যবহৃত হতে পারে।
উদাহরণ: Complex Condition Matching
ধরা যাক, আপনার টেস্টে আপনি চান যে একটি লিস্টের মধ্যে শুধু এমন মান থাকতে হবে যা নির্দিষ্ট রেঞ্জের মধ্যে রয়েছে। এই ধরনের কাস্টম শর্ত যাচাই করতে Custom Matcher তৈরি করতে হবে।
৩. Custom Matcher তৈরি করা (Hamcrest)
Hamcrest একটি জনপ্রিয় লাইব্রেরি যা JUnit এর সাথে ব্যবহার করা হয়। এটি Matcher তৈরি এবং টেস্টের শর্ত যাচাই করার জন্য ব্যবহৃত হয়। নিচে একটি উদাহরণ দেয়া হলো যেখানে আমরা একটি কাস্টম Matcher তৈরি করব।
উদাহরণ: Custom Matcher তৈরি করা
Step 1: Hamcrest Dependency যুক্ত করা (Maven)
<dependencies>
<!-- Hamcrest Dependency -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Step 2: Custom Matcher তৈরি করা
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class StringContainsMatcher extends TypeSafeMatcher<String> {
private final String substring;
public StringContainsMatcher(String substring) {
this.substring = substring;
}
@Override
protected boolean matchesSafely(String item) {
return item.contains(substring);
}
@Override
public void describeTo(Description description) {
description.appendText("a string containing ").appendValue(substring);
}
public static Matcher<String> containsSubstring(String substring) {
return new StringContainsMatcher(substring);
}
}
এখানে, StringContainsMatcher একটি কাস্টম Matcher যা একটি স্ট্রিংয়ে নির্দিষ্ট সাবস্ট্রিং রয়েছে কিনা তা যাচাই করবে।
Step 3: JUnit টেস্টে Custom Matcher ব্যবহার করা
import org.junit.Test;
import static org.junit.Assert.assertThat;
public class CustomMatcherTest {
@Test
public void testStringContainsSubstring() {
String input = "Hello, world!";
assertThat(input, StringContainsMatcher.containsSubstring("world"));
}
}
এখানে, assertThat দিয়ে input স্ট্রিংটিকে যাচাই করা হয়েছে এবং containsSubstring কাস্টম Matcher ব্যবহার করে চেক করা হয়েছে যে স্ট্রিংটি "world" সাবস্ট্রিংটি ধারণ করে কিনা।
৪. Custom Matcher ব্যবহার করার সুবিধা
- Reusability: কাস্টম Matcher তৈরি করার মাধ্যমে আপনি একাধিক টেস্টে একই লজিক ব্যবহার করতে পারেন।
- Complex Conditions: JUnit বা Hamcrest এর ডিফল্ট Matchers দ্বারা যে শর্ত যাচাই করা সম্ভব নয়, তা কাস্টম Matcher দিয়ে যাচাই করা যায়।
- Clean Code: আপনার টেস্ট কোড ক্লিন এবং সহজবোধ্য হয় কারণ আপনি কাস্টম লজিক আলাদা করে রাখছেন, যা কোডের পুনরাবৃত্তি কমাতে সাহায্য করে।
৫. Custom Matcher এর অন্যান্য উদাহরণ
উদাহরণ: Collection Size Matcher
যদি আপনি একটি Collection এর সাইজ যাচাই করতে চান, তবে আপনি একটি কাস্টম Matcher তৈরি করতে পারেন যা নির্দিষ্ট সাইজের সংগ্রহের সাথে মিলে।
public class CollectionSizeMatcher extends TypeSafeMatcher<Collection<?>> {
private final int expectedSize;
public CollectionSizeMatcher(int expectedSize) {
this.expectedSize = expectedSize;
}
@Override
protected boolean matchesSafely(Collection<?> collection) {
return collection.size() == expectedSize;
}
@Override
public void describeTo(Description description) {
description.appendText("a collection of size ").appendValue(expectedSize);
}
public static Matcher<Collection<?>> hasSize(int size) {
return new CollectionSizeMatcher(size);
}
}
JUnit Test:
@Test
public void testCollectionSize() {
Collection<String> collection = Arrays.asList("A", "B", "C");
assertThat(collection, CollectionSizeMatcher.hasSize(3));
}
৬. JUnit 5 এবং Custom Matcher
JUnit 5 তে assertions এর কিছু নতুন বৈশিষ্ট্য রয়েছে, এবং আপনি Custom Matchers ব্যবহার করে আরও কার্যকরী এবং শক্তিশালী Assertions তৈরি করতে পারেন।
উদাহরণ: JUnit 5 এ Custom Matcher ব্যবহার
JUnit 5 তে assertAll এবং assertThat এর মাধ্যমে আপনি একাধিক কাস্টম Matcher ব্যবহার করতে পারেন।
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
@Test
void testCustomMatcherWithJUnit5() {
assertThat("Hello, JUnit!", containsSubstring("JUnit"));
}
সারাংশ
Custom Matchers JUnit টেস্টিংয়ের একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে বিশেষ লজিক এবং শর্ত যাচাই করতে সহায়তা করে। Hamcrest এর মাধ্যমে Custom Matchers তৈরি করতে পারেন যা JUnit টেস্টে ব্যবহার করা যায়। এর মাধ্যমে আপনি complex conditions, reusability, এবং clean code নিশ্চিত করতে পারেন। এটি আপনার টেস্ট কোডের দক্ষতা এবং গুণগত মান উন্নত করতে সহায়ক হয়।
Read more