JUnit 5 হল JUnit-এর পরবর্তী প্রজন্ম। লক্ষ্য হল JVM-এ ডেভেলপার-সাইড টেস্টিং-এর জন্য একটি আপ-টু-ডেট ফাউন্ডেশন তৈরি করা। এতে জাভা ৮ এবং তার উপরে ফোকাস করা হয়েছে, সেইসাথে টেস্টিং-এর বিভিন্ন শৈলী সক্ষম করা হয়েছে।
আপনি Maven এবং Gradle দুটোই ব্যবহার করতে পারেন।
যদি আপনি Maven ব্যবহার করেন, তবে আপনার pom.xml ফাইলে নিচের ডিপেন্ডেন্সিগুলো যোগ করতে হবে:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
JUnit 5 অ্যানোটেশন
আপনি লক্ষ্য করবেন যে JUnit 5-এ, সবচেয়ে স্পষ্ট পরিবর্তনগুলো থেকে একটি হল: টেস্ট ক্লাস এবং মেথডগুলোকে পাবলিক হতে হবে না।
এখন, সবচেয়ে সাধারণ JUnit 5 অ্যানোটেশনগুলো দেখি।
@Test
এই অ্যানোটেশনটি নির্দেশ করে যে একটি মেথড হল একটি টেস্ট মেথড। দ্রষ্টব্য: এই অ্যানোটেশন কোনো অ্যাট্রিবিউট নেয় না।
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class JUnit5Test {
@Test
void helloJUnit5() {
assertEquals(10, 5 + 5);
}
}
@ParameterizedTest
প্যারামিটারাইজড টেস্ট একই টেস্টকে বিভিন্ন আর্গুমেন্টসের সাথে একাধিক বার চালাতে দেয়। সেগুলো রেগুলার @Test মেথডের মতো ঘোষণা করা হয় কিন্তু @ParameterizedTest অ্যানোটেশন ব্যবহার করে।
এছাড়াও, আপনাকে কমপক্ষে একটি সোর্স ঘোষণা করতে হবে যা প্রতিটি আহ্বানের জন্য আর্গুমেন্টস প্রদান করবে এবং তারপর টেস্ট মেথডে আর্গুমেন্টস কনজিউম করতে হবে।
উদাহরণস্বরূপ, নিচের উদাহরণটি একটি প্যারামিটারাইজড টেস্ট দেখায় যা @ValueSource অ্যানোটেশন ব্যবহার করে স্ট্রিং অ্যারে আর্গুমেন্টস সোর্স হিসেবে নির্দিষ্ট করে।
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;
class JUnit5Test {
@ParameterizedTest
@ValueSource(strings = { "cali", "bali", "dani" })
void endsWithI(String str) {
assertTrue(str.endsWith("i"));
}
}
@RepeatedTest
JUnit 5-এ একটি টেস্ট নির্দিষ্ট সংখ্যক বার রিপিট করার ক্ষমতা আছে, শুধু @RepeatedTest অ্যানোটেশন দিয়ে মেথডটিকে অ্যানোটেট করে এবং মোট রিপিটের সংখ্যা নির্দিষ্ট করে।
একটি রিপিটেড টেস্টের প্রতিটি আহ্বান একটি রেগুলার @Test মেথডের এক্সিকিউশনের মতো আচরণ করে।
এটি Selenium-এ UI টেস্টিং-এর জন্য বিশেষভাবে উপকারী।
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.TestInfo;
import static org.junit.jupiter.api.Assertions.assertEquals;
class JUnit5Test {
@RepeatedTest(value = 5, name = "{displayName} {currentRepetition}/{totalRepetitions}")
@DisplayName("RepeatingTest")
void customDisplayName(RepetitionInfo repInfo, TestInfo testInfo) {
int i = 3;
System.out.println(testInfo.getDisplayName() + "-->" + repInfo.getCurrentRepetition());
assertEquals(repInfo.getCurrentRepetition(), i);
}
}

টেস্ট রেজাল্ট থেকে দেখা যাচ্ছে, যখন i==3, টেস্ট পাস করে, অন্যথায় ফেইল করে।
@DisplayName
টেস্ট ক্লাস এবং টেস্ট মেথড কাস্টম ডিসপ্লে নাম ঘোষণা করতে পারে যা টেস্ট রানার এবং টেস্ট রিপোর্টে দেখাবে।
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
@DisplayName("DisplayName Demo")
class JUnit5Test {
@Test
@DisplayName("Custom test name")
void testWithDisplayName() { }
@Test
@DisplayName("Print test name")
void printDisplayName(TestInfo testInfo) {
System.out.println(testInfo.getDisplayName());
}
}
@BeforeEach
@BeforeEach অ্যানোটেশন নির্দেশ করে যে অ্যানোটেট করা মেথডটি প্রতিটি টেস্ট মেথডের আগে এক্সিকিউট হবে, JUnit 4-এর @Before-এর অনুরূপ।
import org.junit.jupiter.api.*;
class JUnit5Test {
@BeforeEach
void init(TestInfo testInfo) {
String callingTest = testInfo.getTestMethod().get().getName();
System.out.println(callingTest);
}
@Test
void firstTest() { System.out.println(1); }
@Test
void secondTest() { System.out.println(2); }
}
আউটপুট:
firstTest
1
secondTest
2
@AfterEach
এই অ্যানোটেশন নির্দেশ করে যে অ্যানোটেট করা মেথডটি প্রতিটি টেস্ট মেথডের পরে এক্সিকিউট হবে, JUnit 4-এর @After-এর অনুরূপ। উদাহরণস্বরূপ, যদি টেস্টগুলোকে প্রতিটি টেস্টের পরে একটি প্রপার্টি রিসেট করতে হয়, তবে আমরা @AfterEach দিয়ে একটি মেথড অ্যানোটেট করতে পারি।
import org.junit.jupiter.api.*;
class JUnit5Test {
@Test
void firstTest() { System.out.println(1); }
@Test
void secondTest() { System.out.println(2); }
@AfterEach
void after(TestInfo testInfo) {
String callingTest = testInfo.getTestMethod().get().getName();
System.out.println(callingTest);
}
}
আউটপুট:
1
firstTest
2
secondTest
@BeforeAll
এই অ্যানোটেশন একটি মেথডকে সব টেস্টের আগে এক্সিকিউট করে। এটি JUnit 4-এর @BeforeClass-এর অনুরূপ। @BeforeAll অ্যানোটেশন সাধারণত টেস্টের জন্য বিভিন্ন জিনিস ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
import org.junit.jupiter.api.*;
class JUnit5Test {
@BeforeAll
static void init() {
System.out.println("Only run once before all tests");
}
@Test
void firstTest() { System.out.println(1); }
@Test
void secondTest() { System.out.println(2); }
}
আউটপুট:
Only run once before all tests
1
2
@AfterAll
@AfterAll অ্যানোটেশন অ্যানোটেট করা মেথডকে শুধু সব টেস্ট এক্সিকিউট হওয়ার পর এক্সিকিউট করতে ব্যবহৃত হয়। এটি JUnit 4-এর @AfterClass-এর অনুরূপ। আমরা এই অ্যানোটেশনটি সব টেস্টের শেষে প্রসেসগুলো টিয়ার ডাউন বা টার্মিনেট করতে ব্যবহার করি।
import org.junit.jupiter.api.*;
class JUnit5Test {
@Test
void firstTest() { System.out.println(1); }
@Test
void secondTest() { System.out.println(2); }
@AfterAll
static void after() {
System.out.println("Only run once after all tests");
}
}
আউটপুট:
1
2
Only run once after all tests
@Tag
আমরা এই অ্যানোটেশনটি ব্যবহার করে ক্লাস বা মেথড লেভেলে টেস্ট ফিল্টার করার জন্য ট্যাগ ঘোষণা করতে পারি।
@Tag অ্যানোটেশনটি উপযোগী যখন আমরা নির্বাচিত টেস্ট সহ একটি টেস্ট প্যাক তৈরি করতে চাই।
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@Tag("smoke")
class JUnit5Test {
@Test
@Tag("login")
void validLoginTest() { }
@Test
@Tag("search")
void searchTest() { }
}
@Disabled
@Disabled অ্যানোটেশন ক্লাস বা মেথড লেভেলে টেস্ট ডিজেবল বা স্কিপ করতে ব্যবহৃত হয়। এটি JUnit 4-এর @Ignore-এর অনুরূপ।
যখন ক্লাস লেভেলে ঘোষণা করা হয়, সব @Test মেথড স্কিপ হয়। যখন মেথড লেভেলে @Disabled ব্যবহার করা হয়, শুধু অ্যানোটেট করা মেথডটি ডিজেবল হয়।
উদাহরণ: @Disabled টেস্ট ক্লাস ডিজেবল করতে:
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@Disabled
class DisabledClassDemo {
@Test
void testWillBeSkipped() { }
}
উদাহরণ: @Disabled অ্যানোটেশন টেস্ট মেথড ডিজেবল করতে:
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledTestsDemo {
@Disabled
@Test
void testWillBeSkipped() { }
@Test
void testWillBeExecuted() { }
}