JUnit হলো একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্টিং পরিচালনা করতে ব্যবহৃত হয়। JUnit পরীক্ষার জন্য একটি নির্দিষ্ট লাইফসাইকেল ব্যবহার করে, যা বিভিন্ন টেস্ট মেথডের আগে এবং পরে কিছু নির্দিষ্ট কাজ সম্পাদন করতে সহায়তা করে। কখনও কখনও, আপনাকে টেস্ট লাইফসাইকেলের মধ্যে কাস্টম ইভেন্ট যুক্ত করতে হতে পারে, যেমন টেস্টের আগে বা পরে বিশেষ কিছু কাজ সম্পন্ন করার জন্য।
এই টিউটোরিয়ালে, আমরা JUnit এ কাস্টম টেস্ট লাইফসাইকেল ইভেন্ট যোগ করার পদ্ধতি আলোচনা করব, যা আপনাকে টেস্ট এক্সিকিউশন কাস্টমাইজ করতে সহায়তা করবে।
১. JUnit টেস্ট লাইফসাইকেল
JUnit টেস্ট লাইফসাইকেল একটি নির্দিষ্ট সিকোয়েন্স অনুসরণ করে, যার মাধ্যমে প্রতিটি টেস্ট রান হওয়ার আগে এবং পরে কিছু বিশেষ কোড এক্সিকিউট করা যায়। এর মধ্যে কিছু গুরুত্বপূর্ণ মেথড রয়েছে:
- @BeforeAll: টেস্ট ক্লাসের প্রথমে একবার এক্সিকিউট হয়।
- @BeforeEach: প্রতিটি টেস্ট মেথডের আগে এক্সিকিউট হয়।
- @Test: টেস্ট মেথড যেখানে টেস্টের কার্যক্রম চলে।
- @AfterEach: প্রতিটি টেস্ট মেথডের পরে এক্সিকিউট হয়।
- @AfterAll: টেস্ট ক্লাসের শেষে একবার এক্সিকিউট হয়।
২. Custom Test Lifecycle Events
JUnit 5 থেকে আপনি Test Lifecycle কাস্টমাইজ করতে পারবেন এবং @BeforeEach, @AfterEach সহ কাস্টম প্রক্রিয়া যোগ করতে পারবেন। এতে আপনি টেস্ট চলাকালীন কোনো নির্দিষ্ট কার্যক্রম চালাতে পারবেন, যেমন টেস্টের আগে কোনো ফাইল তৈরি করা বা টেস্ট শেষে কোনো ক্লিনআপ করা।
২.১ @BeforeEach এবং @AfterEach ব্যবহার করা
@BeforeEach এবং @AfterEach টেস্ট মেথডের আগে এবং পরে কোড চালানোর জন্য ব্যবহৃত হয়। এখানে, আমরা একটি টেস্টের আগে এবং পরে কাস্টম কার্যক্রম দেখাবো।
উদাহরণ:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
public class CustomLifecycleTest {
@BeforeEach
public void setUp() {
System.out.println("This is executed before each test method");
}
@AfterEach
public void tearDown() {
System.out.println("This is executed after each test method");
}
@Test
public void testMethod1() {
System.out.println("Running test method 1");
}
@Test
public void testMethod2() {
System.out.println("Running test method 2");
}
}
আউটপুট:
This is executed before each test method
Running test method 1
This is executed after each test method
This is executed before each test method
Running test method 2
This is executed after each test method
এখানে, setUp() মেথড প্রতিটি টেস্ট মেথডের আগে চালানো হচ্ছে এবং tearDown() প্রতিটি টেস্ট মেথডের পরে।
৩. @BeforeAll এবং @AfterAll ব্যবহার করা
@BeforeAll এবং @AfterAll টেস্ট ক্লাসের আগে এবং পরে একবার চালানোর জন্য ব্যবহৃত হয়। এরা সাধারণত static মেথডে ব্যবহার করা হয়।
উদাহরণ:
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
public class CustomLifecycleTest {
@BeforeAll
public static void initAll() {
System.out.println("This is executed once before all test methods");
}
@AfterAll
public static void cleanUpAll() {
System.out.println("This is executed once after all test methods");
}
@Test
public void testMethod1() {
System.out.println("Running test method 1");
}
@Test
public void testMethod2() {
System.out.println("Running test method 2");
}
}
আউটপুট:
This is executed once before all test methods
Running test method 1
Running test method 2
This is executed once after all test methods
এখানে, initAll() শুধুমাত্র একবার টেস্ট ক্লাসের আগে চালানো হয়, এবং cleanUpAll() শুধুমাত্র একবার টেস্ট ক্লাসের পরে চালানো হয়।
৪. @TestInstance এবং Custom Test Lifecycle
JUnit 5 তে @TestInstance অ্যানোটেশন ব্যবহারের মাধ্যমে টেস্ট ক্লাসের জীবিত অবস্থা কাস্টমাইজ করা যায়। যদি আপনি চান যে টেস্ট ক্লাসের ইনস্ট্যান্স একবার তৈরি করা হোক এবং সমস্ত টেস্ট মেথডের জন্য একই ইনস্ট্যান্স ব্যবহার করা হোক, তাহলে আপনি @TestInstance(Lifecycle.PER_CLASS) ব্যবহার করতে পারেন।
উদাহরণ:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class CustomLifecycleTest {
@BeforeEach
public void setUp() {
System.out.println("This is executed before each test method");
}
@Test
public void testMethod1() {
System.out.println("Running test method 1");
}
@Test
public void testMethod2() {
System.out.println("Running test method 2");
}
}
এখানে, @TestInstance(Lifecycle.PER_CLASS) ব্যবহার করা হলে, টেস্ট ক্লাসের একটি ইনস্ট্যান্স ব্যবহার হবে এবং প্রতিটি টেস্ট মেথডে নতুন ইনস্ট্যান্স তৈরি হবে না।
৫. @ExtendWith এবং Custom Extensions
JUnit 5 @ExtendWith অ্যানোটেশন দিয়ে কাস্টম টেস্ট লাইফসাইকেল ইভেন্ট যুক্ত করতে আপনাকে Extension ব্যবহার করতে হবে। Extension এর মাধ্যমে আপনি টেস্ট মেথডের আগে এবং পরে কাস্টম প্রক্রিয়া সম্পাদন করতে পারেন।
উদাহরণ:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MyCustomExtension.class)
public class CustomExtensionTest {
@Test
void testWithCustomExtension() {
System.out.println("Running test with custom extension");
}
}
এখানে, MyCustomExtension একটি কাস্টম JUnit Extension হবে যা টেস্ট লাইফসাইকেল কাস্টমাইজ করবে।
সারাংশ
JUnit 5 তে কাস্টম টেস্ট লাইফসাইকেল ইভেন্ট যোগ করা খুবই সহজ। আপনি @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @TestInstance এবং @ExtendWith এর মাধ্যমে টেস্টের আগে, পরে এবং টেস্ট ক্লাসের স্তরে কাস্টম কার্যক্রম পরিচালনা করতে পারেন। এটি আপনাকে টেস্ট এক্সিকিউশন কাস্টমাইজ এবং টেস্ট সেটআপ বা টিয়ারডাউন করতে সাহায্য করবে, যার মাধ্যমে আপনার টেস্টিং প্রক্রিয়া আরও শক্তিশালী ও দক্ষ হবে।
Read more