JUnit হল Java-এর জন্য একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক, যা ইউনিট টেস্টিং, ইনটিগ্রেশন টেস্টিং এবং অন্যান্য ধরণের টেস্টিংয়ের জন্য ব্যবহৃত হয়। JUnit এর মাধ্যমে আপনি কোডের বিভিন্ন অংশ পরীক্ষা করতে পারেন, এবং এর মাধ্যমে ত্রুটি বা এক্সেপশন (Exception) হ্যান্ডলিং পরীক্ষা করা সম্ভব।
Exception Testing হল সেই প্রক্রিয়া যেখানে আপনি নিশ্চিত করেন যে আপনার কোড সঠিকভাবে এক্সেপশন ট্রিগার করছে এবং যথাযথভাবে হ্যান্ডেল করছে। JUnit এর মাধ্যমে Exception Testing করা খুবই সহজ এবং একটি নির্দিষ্ট assertThrows() মেথডের মাধ্যমে এক্সেপশন টেস্ট করা যায়।
JUnit এ Exception Testing এর মাধ্যমে আপনি যাচাই করতে পারেন যে আপনার কোড নির্দিষ্ট এক্সেপশন সঠিকভাবে থ্রো করছে কি না। এটি আপনার কোডের নির্দিষ্ট পরিস্থিতি বা লজিকের সঠিকতা পরীক্ষা করতে সহায়ক। যখন আপনার কোড কোনো অবৈধ ইনপুট বা অপর্যাপ্ত অবস্থা পায়, তখন আপনি চাইবেন যে এটি একটি এক্সেপশন থ্রো করুক। JUnit এর সাহায্যে আপনি সেই এক্সেপশন সঠিকভাবে হ্যান্ডেল হচ্ছে কিনা তা নিশ্চিত করতে পারবেন।
ধরা যাক, আমাদের একটি ক্লাস রয়েছে, যেখানে একটি divide() মেথড রয়েছে, যা দুটি সংখ্যার ভাগ বের করে। যদি ডিভাইডার শূন্য হয়, তবে এটি একটি ArithmeticException এক্সেপশন থ্রো করবে।
public class Calculator {
// Method to divide two numbers
public int divide(int numerator, int denominator) {
if (denominator == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return numerator / denominator;
}
}
এখন, আমরা JUnit এর মাধ্যমে পরীক্ষা করব যে denominator শূন্য হলে সঠিকভাবে ArithmeticException এক্সেপশন থ্রো হচ্ছে কিনা।
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
void testDivide_throwsArithmeticException_whenDenominatorIsZero() {
// Arrange
Calculator calculator = new Calculator();
// Act and Assert
assertThrows(ArithmeticException.class, () -> {
calculator.divide(10, 0);
});
}
}
এখানে:
এই টেস্ট কেসটি নিশ্চিত করবে যে যখন denominator শূন্য হয়, তখন ArithmeticException এক্সেপশন থ্রো হয় এবং তাতে সঠিক বার্তা "Cannot divide by zero"
থাকে।
JUnit 5 এ assertThrows() মেথড ব্যবহার করা হয় এক্সেপশন টেস্টিংয়ের জন্য। এটি আপনার টেস্ট মেথডে এমন কোডটি র্যাপ করতে ব্যবহৃত হয়, যা একটি এক্সেপশন থ্রো করবে। JUnit 5 এর assertThrows() মেথড একটি এক্সেপশন সঠিকভাবে থ্রো না করলে টেস্ট ফেইল করবে।
ধরা যাক, আমাদের একটি কাস্টম এক্সেপশন InvalidAgeException রয়েছে, যা তখন থ্রো হবে যখন age ১৮ এর নিচে হবে।
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}
public class Person {
public void setAge(int age) {
if (age < 18) {
throw new InvalidAgeException("Age must be 18 or above");
}
}
}
এখন, JUnit এর মাধ্যমে এই কাস্টম এক্সেপশন পরীক্ষা করা হবে।
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class PersonTest {
@Test
void testSetAge_throwsInvalidAgeException_whenAgeIsUnder18() {
// Arrange
Person person = new Person();
// Act and Assert
InvalidAgeException exception = assertThrows(InvalidAgeException.class, () -> {
person.setAge(15);
});
// Assert the exception message
assertEquals("Age must be 18 or above", exception.getMessage());
}
}
এখানে:
একই টেস্ট মেথডের মধ্যে আপনি একাধিক এক্সেপশনও টেস্ট করতে পারেন, তবে এর জন্য আপনি assertThrows() মেথডের কয়েকটি ইনস্ট্যান্স ব্যবহার করতে পারেন।
public class Person {
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
} else if (age < 18) {
throw new InvalidAgeException("Age must be 18 or above");
}
}
}
এখানে, দুটি এক্সেপশন রয়েছে: IllegalArgumentException এবং InvalidAgeException।
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class PersonTest {
@Test
void testSetAge_throwsException_whenAgeIsInvalid() {
// Arrange
Person person = new Person();
// Act and Assert for IllegalArgumentException
IllegalArgumentException exception1 = assertThrows(IllegalArgumentException.class, () -> {
person.setAge(-1);
});
assertEquals("Age cannot be negative", exception1.getMessage());
// Act and Assert for InvalidAgeException
InvalidAgeException exception2 = assertThrows(InvalidAgeException.class, () -> {
person.setAge(15);
});
assertEquals("Age must be 18 or above", exception2.getMessage());
}
}
এখানে, আমরা দুটি এক্সেপশন টেস্ট করছি:
JUnit এর মাধ্যমে Exception Testing কোডে সঠিক এক্সেপশন থ্রো হচ্ছে কি না, তা পরীক্ষা করার একটি গুরুত্বপূর্ণ পদ্ধতি। JUnit 5 এর assertThrows() মেথড ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে এক্সেপশন সঠিকভাবে ট্রিগার হচ্ছে এবং আপনি সেই এক্সেপশন সম্পর্কিত বার্তাও পরীক্ষা করতে পারবেন। এক্সেপশন হ্যান্ডলিং টেস্টিং অ্যাপ্লিকেশন ডেভেলপমেন্টে খুবই গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করে যে কোডটি ভুল ইনপুট বা অবস্থা পরিচালনা করতে সক্ষম।
JUnit হল একটি শক্তিশালী টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামগুলির জন্য ইউনিট টেস্ট লেখা এবং চালানোর জন্য ব্যবহৃত হয়। JUnit এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল exception handling এর জন্য টেস্ট কেস লেখার সুবিধা। আপনি যদি কোনো কোডের মধ্যে একটি নির্দিষ্ট exception আশা করেন, তবে @Test(expected = Exception.class)
অ্যানোটেশন ব্যবহার করতে পারেন।
এটি নিশ্চিত করতে সাহায্য করে যে, আপনার টেস্ট করা কোডে কোনো নির্দিষ্ট exception সঠিকভাবে থ্রো হচ্ছে কি না। এই অ্যানোটেশনটি ব্যবহার করে আপনি সুনির্দিষ্ট এক্সেপশন আশা করতে পারেন এবং যদি এটি কোডে তৈরি হয়, তবে টেস্ট সফল হবে। অন্যথায়, টেস্টটি ব্যর্থ হবে।
JUnit এর @Test(expected = Exception.class) অ্যানোটেশনটি একটি টেস্ট মেথডে ব্যবহৃত হয় যখন আপনি আশা করছেন যে, ওই মেথডটি একটি নির্দিষ্ট exception থ্রো করবে। এর মাধ্যমে, আপনি টেস্টে এক্সেপশন ঘটলে সেটিকে সফল হিসেবে গণ্য করতে পারেন।
@Test(expected = Exception.class)
public void testMethod() {
// Code that should throw an exception
}
এখানে, expected = Exception.class
নির্দেশ করে যে testMethod() মেথডটি Exception থ্রো করবে। যদি মেথডটি সত্যিই এক্সেপশন থ্রো করে, তবে টেস্টটি সফল হবে।
ধরা যাক, আমাদের একটি divide() মেথড রয়েছে, যা দুইটি সংখ্যা বিভক্ত করার চেষ্টা করে এবং যদি দ্বিতীয় সংখ্যাটি শূন্য হয়, তবে এটি ArithmeticException থ্রো করবে। আমরা টেস্ট করতে চাই যে, শূন্য দ্বারা বিভাজন করার সময় ArithmeticException থ্রো হচ্ছে কি না।
public class Calculator {
// Method to divide two numbers
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return a / b;
}
}
এখন, আমরা এই কোডটি টেস্ট করার জন্য একটি JUnit টেস্ট লিখব, যাতে নিশ্চিত হওয়া যায় যে, শূন্য দ্বারা বিভাজন করলে ArithmeticException থ্রো হচ্ছে।
import org.junit.Test;
public class CalculatorTest {
@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
Calculator calculator = new Calculator();
// This should throw an ArithmeticException because division by zero is not allowed
calculator.divide(10, 0);
}
}
এখানে:
calculator.divide(10, 0)
কল করা হয়েছে, যা ArithmeticException থ্রো করবে, কারণ দ্বিতীয় প্যারামিটার 0।ধরা যাক, একটি convertToInt() মেথড রয়েছে, যা একটি স্ট্রিংকে Integer তে রূপান্তর করে। যদি স্ট্রিংটি একটি বৈধ পূর্ণসংখ্যা না হয়, তবে এটি NumberFormatException থ্রো করবে। আমরা এই এক্সেপশনটি টেস্ট করতে চাই।
public class StringConverter {
// Method to convert String to Integer
public int convertToInt(String str) {
return Integer.parseInt(str);
}
}
import org.junit.Test;
public class StringConverterTest {
@Test(expected = NumberFormatException.class)
public void testConvertToIntInvalidString() {
StringConverter converter = new StringConverter();
// This should throw a NumberFormatException because "abc" is not a valid integer
converter.convertToInt("abc");
}
}
এখানে:
converter.convertToInt("abc")
কল করা হয়েছে, যা NumberFormatException থ্রো করবে, কারণ "abc" একটি বৈধ পূর্ণসংখ্যা নয়।expected
এর মাধ্যমে একমাত্র একটি এক্সেপশন নির্ধারণ করা সম্ভব। যদি একাধিক এক্সেপশন পরীক্ষা করতে চান, তবে আপনি try-catch
ব্লক ব্যবহার করতে পারেন এবং অ্যাসার্ট করতে পারেন।@Test(expected = ArithmeticException.class)
public void testNoException() {
// This code does not throw any exception, so the test will fail
int result = 10 / 2;
}
এখানে, কোডটি কোনো এক্সেপশন থ্রো করবে না, এবং এই কারণে টেস্টটি ব্যর্থ হবে।
JUnit এর @Test(expected = Exception.class) অ্যানোটেশনটি আপনাকে খুব সহজে টেস্ট করতে সাহায্য করে যে, আপনার কোড একটি নির্দিষ্ট exception থ্রো করবে কি না। এটি unit testing-এ বিশেষভাবে সহায়ক, যখন আপনি নিশ্চিত হতে চান যে কোনো নির্দিষ্ট ত্রুটি বা এক্সেপশন সঠিকভাবে ট্রিগার হচ্ছে। এর মাধ্যমে, আপনি সহজেই অ্যাসার্ট করতে পারেন যে আপনার কোড সঠিকভাবে exception handling করছে।
JUnit একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্টিং পরিচালনা করতে ব্যবহৃত হয়। assertThrows() মেথডটি JUnit 5 তে একটি বিশেষ ফিচার হিসেবে আসে যা আপনি যখন কোন এক্সেপশন (Exception) ফেলে থাকে এমন কোড টেস্ট করতে চান, তখন ব্যবহার করা হয়। এটি আপনাকে নির্দিষ্ট এক্সেপশনটি সত্যিই ফেলা হচ্ছে কি না, তা পরীক্ষা করতে সহায়তা করে।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে assertThrows() ব্যবহার করে এক্সেপশন টেস্ট করা যায়।
assertThrows() মেথডটি একটি ল্যাম্বডা এক্সপ্রেশন বা Executable গ্রহণ করে যা এক্সেপশন উৎপন্ন করতে পারে এবং এরপর এটি যাচাই করে যে নির্দিষ্ট এক্সেপশনটি আসছে কিনা।
assertThrows(Class<T> expectedType, Executable executable);
Class<T>
টাইপের হতে হবে।ধরা যাক, আমাদের একটি ক্লাস Calculator রয়েছে যা দুটি সংখ্যার ভাগ করার কাজ করে, কিন্তু ভাগফল যদি শূন্য দ্বারা করা হয়, তবে এটি একটি ArithmeticException ফেলে।
public class Calculator {
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return a / b;
}
}
এখন, আমরা Calculator ক্লাসের divide() মেথডের উপর টেস্ট তৈরি করতে যাচ্ছি, যাতে শূন্য দ্বারা ভাগ করার সময় ArithmeticException এক্সেপশনটি ফেলা হচ্ছে কিনা তা যাচাই করা যায়।
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
public void testDivideByZero() {
Calculator calculator = new Calculator();
// Test for ArithmeticException
assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
}
}
এখানে:
এখন, যদি আমরা একটি কাস্টম এক্সেপশন তৈরি করি, যেমন InvalidInputException, তবে আমরা সেটাও assertThrows() ব্যবহার করে পরীক্ষা করতে পারি।
public class InvalidInputException extends RuntimeException {
public InvalidInputException(String message) {
super(message);
}
}
public class Calculator {
public int divide(int a, int b) {
if (b < 0) {
throw new InvalidInputException("Cannot divide by negative number");
}
return a / b;
}
}
এখন, আমরা InvalidInputException এক্সেপশন টেস্ট করতে যাচ্ছি।
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
public void testDivideByNegative() {
Calculator calculator = new Calculator();
// Test for InvalidInputException
assertThrows(InvalidInputException.class, () -> calculator.divide(10, -2));
}
}
এখানে:
এছাড়া, আপনি assertThrows() এর মাধ্যমে এক্সেপশনের বার্তা যাচাইও করতে পারেন। এই কাজটি করতে আপনি assertThrows() এর পরে getMessage() মেথড ব্যবহার করতে পারেন।
@Test
public void testDivideByZeroErrorMessage() {
Calculator calculator = new Calculator();
ArithmeticException exception = assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
// Verify exception message
assertEquals("Cannot divide by zero", exception.getMessage());
}
এখানে, আমরা নিশ্চিত করছি যে এক্সেপশনটির বার্তা "Cannot divide by zero"।
assertThrows() মেথডটি JUnit 5 তে ব্যবহৃত একটি শক্তিশালী টুল, যা আপনাকে পরীক্ষার সময় বিশেষ ধরনের এক্সেপশন ফেলা হচ্ছে কিনা তা নিশ্চিত করতে সহায়তা করে। এটি সাধারণত Exception Testing এর জন্য ব্যবহৃত হয়, যেখানে আপনার কোড নির্দিষ্ট এক্সেপশনটি ফেলবে কিনা, তা নিশ্চিত করা প্রয়োজন। assertThrows() সহজেই ArithmeticException, InvalidInputException অথবা কাস্টম এক্সেপশন টেস্ট করতে ব্যবহৃত হতে পারে, এবং এর মাধ্যমে আপনি এক্সেপশনের বার্তা এবং ধরণ উভয়ই পরীক্ষা করতে পারেন।
JUnit হল একটি Java ফ্রেমওয়ার্ক যা ইউনিট টেস্টিং করার জন্য ব্যবহৃত হয়। এটি টেস্ট ক্লাস এবং টেস্ট মেথডগুলি তৈরি করতে সাহায্য করে এবং আপনার কোডের বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করে। Exception Handling বা ব্যতিক্রম পরিচালনা অত্যন্ত গুরুত্বপূর্ণ একটি ধারণা, কারণ কখনও কখনও কোডে ত্রুটি (Exception) ঘটতে পারে, এবং এগুলির সঠিকভাবে পরিচালনা করা প্রয়োজন।
JUnit এর মাধ্যমে Exception Handling টেস্ট করা সম্ভব। JUnit 5 তে assertThrows
মেথডের মাধ্যমে Exception এর সঠিক ব্যবস্থাপনা এবং এর সঠিক কার্যকারিতা পরীক্ষা করা যায়।
এই টিউটোরিয়ালে আমরা JUnit এর মাধ্যমে Exception Handling টেস্ট করার একটি বাস্তব উদাহরণ দেখব।
JUnit-এ Exception Handling টেস্ট করার জন্য সাধারণভাবে দুটি মেথড ব্যবহৃত হয়:
ExpectedException
রুল ব্যবহার করা হতো, যার মাধ্যমে আপনি একটি নির্দিষ্ট Exception প্রত্যাশা করতে পারতেন। তবে JUnit 5-এ এটি পরিবর্তন হয়েছে এবং assertThrows
ব্যবহার করা হয়।assertThrows
মেথড ব্যবহার করে আপনি নির্দিষ্ট একটি Exception এর কার্যকারিতা পরীক্ষা করতে পারেন।JUnit 5 তে assertThrows
একটি স্ট্যাটিক মেথড যা একটি নির্দিষ্ট Exception ধারণ করে এবং এটি পরীক্ষা করে যে, কোনো কোড সেগুলিকে সঠিকভাবে থ্রো করছে কি না।
assertThrows(Class<T> expectedType, Executable executable);
এখানে, expectedType
হল যে Exception আপনি প্রত্যাশা করছেন, এবং executable
হল কোড ব্লক যা সেই Exception থ্রো করতে পারে।
ধরা যাক, আমাদের একটি Calculator
ক্লাস আছে যা division অপারেশন করে, তবে ArithmeticException ত্রুটি প্রদর্শন করতে পারে যদি ডিভাইডার শূন্য হয়।
public class Calculator {
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return a / b;
}
}
এখানে, divide
মেথডে শূন্য দ্বারা ভাগ করার চেষ্টা করলে ArithmeticException ছুঁড়ে দেওয়া হয়।
এখন, আমরা JUnit 5 ব্যবহার করে এই ArithmeticException টেস্ট করব।
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test
void testDivideByZero() {
Calculator calculator = new Calculator();
// Assert that ArithmeticException is thrown when dividing by zero
ArithmeticException exception = assertThrows(ArithmeticException.class, () -> {
calculator.divide(10, 0); // Trying to divide by zero
});
// Assert the exception message
assertEquals("Cannot divide by zero", exception.getMessage());
}
@Test
void testDivideValidInput() {
Calculator calculator = new Calculator();
// Valid division test
int result = calculator.divide(10, 2);
assertEquals(5, result); // 10 divided by 2 should return 5
}
}
এখানে দুটি টেস্ট মেথড রয়েছে:
assertThrows
ব্যবহার করে আমরা যাচাই করছি যে, যখন শূন্য দ্বারা ভাগ করার চেষ্টা করা হবে, তখন ArithmeticException ছোঁড়া হবে এবং তার মেসেজ সঠিক থাকবে।যদি আপনি JUnit 4 ব্যবহার করেন, তখন ExpectedException
রুল ব্যবহার করে Exception Handling টেস্ট করা যেত।
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class CalculatorTest {
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
@Test
public void testDivideByZero() {
Calculator calculator = new Calculator();
exceptionRule.expect(ArithmeticException.class);
exceptionRule.expectMessage("Cannot divide by zero");
calculator.divide(10, 0); // Trying to divide by zero
}
}
এখানে, ExpectedException
রুল ব্যবহার করা হয়েছে, যেখানে expect
মেথডের মাধ্যমে আমরা যে Exception টেস্ট করতে চাই সেটি নির্ধারণ করেছি।
assertThrows
ব্যবহার করুন, কারণ এটি JUnit 4 এর ExpectedException
রুলের চেয়ে বেশি সুনির্দিষ্ট এবং পরিষ্কার।JUnit ব্যবহার করে Exception Handling টেস্ট করা সহজ এবং কার্যকরী। JUnit 5 তে assertThrows
মেথড ব্যবহার করে আপনি সহজেই একটি নির্দিষ্ট Exception পরীক্ষা করতে পারেন এবং এর সঠিক মেসেজ নিশ্চিত করতে পারেন। JUnit 4 এ, ExpectedException
রুল ব্যবহার করে আপনি Exception পরীক্ষা করতে পারতেন, তবে JUnit 5 এ এটি আর প্রয়োজনীয় নয়। Exception টেস্টিংয়ের মাধ্যমে আপনি কোডের স্থিতিশীলতা এবং নিরাপত্তা নিশ্চিত করতে পারেন।
Read more