JUnit হল একটি জনপ্রিয় ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্টিংয়ের জন্য ব্যবহৃত হয়। তবে, কখনও কখনও আপনি আপনার নিজস্ব অ্যানোটেশন তৈরি করতে চান যা টেস্টিং বা টেস্ট রেজাল্ট সম্পর্কিত কিছু কাস্টম কার্যক্রম পরিচালনা করতে পারে। @interface এর মাধ্যমে আপনি Custom Annotation তৈরি করতে পারেন যা টেস্ট ফাংশন বা ক্লাসে বিশেষ কাজ করতে ব্যবহৃত হবে।
এই গাইডে, আমরা দেখব কীভাবে JUnit এ @interface দিয়ে একটি কাস্টম অ্যানোটেশন তৈরি করা যায় এবং কিভাবে এটি ব্যবহার করা যেতে পারে।
১. @interface দিয়ে Custom Annotation তৈরি করা
Java-তে, কাস্টম অ্যানোটেশন তৈরি করতে @interface ব্যবহৃত হয়। এটি একটি বিশেষ ধরনের annotation type যা কোনো ক্লাস বা মেথডের সাথে সংযুক্ত করা যেতে পারে।
উদাহরণ: Custom Annotation
ধরা যাক, আমাদের একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে যা টেস্ট শুরু হওয়া এবং শেষ হওয়ার সময় লগ করতে সাহায্য করবে।
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) // This annotation can be used on methods
@Retention(RetentionPolicy.RUNTIME) // The annotation will be available at runtime
public @interface LogExecutionTime {
}
এখানে, @LogExecutionTime একটি কাস্টম অ্যানোটেশন তৈরি করা হয়েছে, যা ElementType.METHOD নির্দেশ করে যে এটি শুধুমাত্র মেথডে ব্যবহার করা যাবে এবং RetentionPolicy.RUNTIME নির্দেশ করে যে এটি রানটাইমে রিফ্লেকশন দ্বারা অ্যাক্সেসযোগ্য হবে।
২. Custom Annotation এর ব্যবহার
কাস্টম অ্যানোটেশন তৈরি করার পরে, এটি টেস্ট মেথডে ব্যবহার করতে হবে। উদাহরণস্বরূপ, একটি টেস্ট মেথডে এই অ্যানোটেশনটি প্রয়োগ করা যেতে পারে যাতে টেস্ট শুরু হওয়ার এবং শেষ হওয়ার সময় লগ করা হয়।
উদাহরণ: Custom Annotation ব্যবহার করা
import org.junit.jupiter.api.Test;
public class MyTest {
@Test
@LogExecutionTime // Applying the custom annotation
public void testMethod() {
// Test logic
System.out.println("Test method executed");
}
}
এখানে, @LogExecutionTime অ্যানোটেশনটি testMethod মেথডে প্রয়োগ করা হয়েছে।
৩. Custom Annotation Process করা
এখন, আমাদের Custom Annotation এর কার্যকারিতা দেখতে হলে একটি Test Execution Listener তৈরি করতে হবে, যা JUnit টেস্ট রান করার সময় অ্যানোটেশনটি প্রসেস করবে। এখানে আমরা JUnit এর TestExecutionListener ব্যবহার করতে পারি, যা JUnit টেস্টের শুরু এবং শেষ হওয়ার সময় কিছু বিশেষ কাজ করবে।
উদাহরণ: Custom Annotation Process করার জন্য Listener
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
public class LogExecutionTimeExtension implements BeforeTestExecutionCallback {
@Override
public void beforeTestExecution(ExtensionContext context) throws Exception {
if (context.getRequiredTestMethod().isAnnotationPresent(LogExecutionTime.class)) {
// Log the start time before executing the test
System.out.println("Test execution started at: " + System.currentTimeMillis());
}
}
}
এখানে, beforeTestExecution মেথডটি LogExecutionTime অ্যানোটেশনটি পরীক্ষা করে এবং যদি এটি থাকে, তবে টেস্ট রান হওয়ার আগে লগ শুরু হয়।
৪. JUnit 5 এ Extension Register করা
এখন, আমাদের JUnit 5 টেস্টে Extension যুক্ত করতে হবে, যাতে @LogExecutionTime অ্যানোটেশনটি প্রসেস হয়।
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(LogExecutionTimeExtension.class) // Registering the extension
public class MyTest {
@Test
@LogExecutionTime // Custom annotation to log execution time
public void testMethod() {
// Test logic
System.out.println("Test method executed");
}
}
এখানে, @ExtendWith(LogExecutionTimeExtension.class) অ্যানোটেশনটি JUnit 5 টেস্টে LogExecutionTimeExtension ক্লাসটিকে রেজিস্টার করে, যা @LogExecutionTime অ্যানোটেশন প্রসেস করে।
৫. Custom Annotation দিয়ে Test Method Execution Time Log করা
এখন, আমরা @LogExecutionTime অ্যানোটেশন দিয়ে টেস্ট মেথডের এক্সিকিউশন টাইম লগ করতে পারব। সম্পূর্ণ উদাহরণটি নিম্নরূপ হবে:
উদাহরণ: Complete Code
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) // This annotation can be used on methods
@Retention(RetentionPolicy.RUNTIME) // The annotation will be available at runtime
public @interface LogExecutionTime {
}
public class LogExecutionTimeExtension implements BeforeTestExecutionCallback {
@Override
public void beforeTestExecution(ExtensionContext context) throws Exception {
if (context.getRequiredTestMethod().isAnnotationPresent(LogExecutionTime.class)) {
// Log the start time before executing the test
System.out.println("Test execution started at: " + System.currentTimeMillis());
}
}
}
@ExtendWith(LogExecutionTimeExtension.class) // Registering the extension
public class MyTest {
@Test
@LogExecutionTime // Custom annotation to log execution time
public void testMethod() {
// Simulating test logic
System.out.println("Test method executed");
}
}
এখানে, @LogExecutionTime অ্যানোটেশনটি ব্যবহার করা হয়েছে, এবং LogExecutionTimeExtension ক্লাসটি এই অ্যানোটেশনটি প্রসেস করবে এবং টেস্ট শুরু হওয়ার সময় লগ করবে।
৬. উপসংহার
JUnit টেস্টে কাস্টম অ্যানোটেশন ব্যবহার করতে, প্রথমে @interface দিয়ে একটি কাস্টম অ্যানোটেশন তৈরি করতে হয়। এরপর, একটি TestExecutionListener বা JUnit Extension ব্যবহার করে কাস্টম অ্যানোটেশনটি প্রসেস করা হয়। এটি আপনাকে টেস্টের কার্যকারিতা আরও কাস্টমাইজড এবং সহজভাবে পরিচালনা করতে সহায়তা করে। যেমন, @LogExecutionTime অ্যানোটেশনটি ব্যবহার করে টেস্টের এক্সিকিউশন টাইম লগ করা হয়েছে, যা পরীক্ষার সময় পরিচালনা করা হয়।
Read more