JUnit হল Java-এর জন্য একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক, যা ইউনিট টেস্টিং, ইনটিগ্রেশন টেস্টিং এবং অন্যান্য ধরণের টেস্টিংয়ের জন্য ব্যবহৃত হয়। JUnit এর মাধ্যমে আপনি কোডের বিভিন্ন অংশ পরীক্ষা করতে পারেন, এবং এর মাধ্যমে ত্রুটি বা এক্সেপশন (Exception) হ্যান্ডলিং পরীক্ষা করা সম্ভব।
Exception Testing হল সেই প্রক্রিয়া যেখানে আপনি নিশ্চিত করেন যে আপনার কোড সঠিকভাবে এক্সেপশন ট্রিগার করছে এবং যথাযথভাবে হ্যান্ডেল করছে। JUnit এর মাধ্যমে Exception Testing করা খুবই সহজ এবং একটি নির্দিষ্ট assertThrows() মেথডের মাধ্যমে এক্সেপশন টেস্ট করা যায়।
১. JUnit Exception Testing এর ধারণা
JUnit এ Exception Testing এর মাধ্যমে আপনি যাচাই করতে পারেন যে আপনার কোড নির্দিষ্ট এক্সেপশন সঠিকভাবে থ্রো করছে কি না। এটি আপনার কোডের নির্দিষ্ট পরিস্থিতি বা লজিকের সঠিকতা পরীক্ষা করতে সহায়ক। যখন আপনার কোড কোনো অবৈধ ইনপুট বা অপর্যাপ্ত অবস্থা পায়, তখন আপনি চাইবেন যে এটি একটি এক্সেপশন থ্রো করুক। JUnit এর সাহায্যে আপনি সেই এক্সেপশন সঠিকভাবে হ্যান্ডেল হচ্ছে কিনা তা নিশ্চিত করতে পারবেন।
২. JUnit এর মাধ্যমে Exception Testing এর উদাহরণ
ধরা যাক, আমাদের একটি ক্লাস রয়েছে, যেখানে একটি divide() মেথড রয়েছে, যা দুটি সংখ্যার ভাগ বের করে। যদি ডিভাইডার শূন্য হয়, তবে এটি একটি ArithmeticException এক্সেপশন থ্রো করবে।
উদাহরণ: ArithmeticException Testing
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 এক্সেপশন থ্রো হচ্ছে কিনা।
উদাহরণ: JUnit Test for Exception
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);
});
}
}
এখানে:
- assertThrows(): এটি একটি JUnit assertion মেথড যা নিশ্চিত করে যে কোনো নির্দিষ্ট এক্সেপশন সঠিকভাবে থ্রো হচ্ছে কি না। প্রথম প্যারামিটার হিসেবে আপনি যে এক্সেপশনটি প্রত্যাশা করছেন তা প্রদান করবেন এবং দ্বিতীয় প্যারামিটার হিসেবে আপনি যে কোডটি পরীক্ষা করতে চান তা ল্যাম্বডা এক্সপ্রেশন আকারে দেবেন।
এই টেস্ট কেসটি নিশ্চিত করবে যে যখন denominator শূন্য হয়, তখন ArithmeticException এক্সেপশন থ্রো হয় এবং তাতে সঠিক বার্তা "Cannot divide by zero" থাকে।
৩. JUnit 5 এর Exception Testing - assertThrows()
JUnit 5 এ assertThrows() মেথড ব্যবহার করা হয় এক্সেপশন টেস্টিংয়ের জন্য। এটি আপনার টেস্ট মেথডে এমন কোডটি র্যাপ করতে ব্যবহৃত হয়, যা একটি এক্সেপশন থ্রো করবে। JUnit 5 এর assertThrows() মেথড একটি এক্সেপশন সঠিকভাবে থ্রো না করলে টেস্ট ফেইল করবে।
উদাহরণ: Custom Exception Testing
ধরা যাক, আমাদের একটি কাস্টম এক্সেপশন 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 এর মাধ্যমে এই কাস্টম এক্সেপশন পরীক্ষা করা হবে।
উদাহরণ: JUnit Test for Custom Exception
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(InvalidAgeException.class, () -> person.setAge(15)): এটি পরীক্ষা করবে যে, যখন বয়স ১৮ এর নিচে দেওয়া হবে, তখন InvalidAgeException সঠিকভাবে থ্রো হবে।
- assertEquals(): এটি পরীক্ষা করবে যে এক্সেপশন বার্তা সঠিকভাবে দেওয়া হচ্ছে কিনা।
৪. Multiple Exceptions Testing
একই টেস্ট মেথডের মধ্যে আপনি একাধিক এক্সেপশনও টেস্ট করতে পারেন, তবে এর জন্য আপনি assertThrows() মেথডের কয়েকটি ইনস্ট্যান্স ব্যবহার করতে পারেন।
উদাহরণ: Multiple Exceptions
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।
উদাহরণ: JUnit Test for Multiple Exceptions
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());
}
}
এখানে, আমরা দুটি এক্সেপশন টেস্ট করছি:
- প্রথমে IllegalArgumentException যখন বয়স নেগেটিভ হবে।
- এরপর InvalidAgeException যখন বয়স ১৮ এর নিচে থাকবে।
সারাংশ
JUnit এর মাধ্যমে Exception Testing কোডে সঠিক এক্সেপশন থ্রো হচ্ছে কি না, তা পরীক্ষা করার একটি গুরুত্বপূর্ণ পদ্ধতি। JUnit 5 এর assertThrows() মেথড ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে এক্সেপশন সঠিকভাবে ট্রিগার হচ্ছে এবং আপনি সেই এক্সেপশন সম্পর্কিত বার্তাও পরীক্ষা করতে পারবেন। এক্সেপশন হ্যান্ডলিং টেস্টিং অ্যাপ্লিকেশন ডেভেলপমেন্টে খুবই গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করে যে কোডটি ভুল ইনপুট বা অবস্থা পরিচালনা করতে সক্ষম।
JUnit হল একটি শক্তিশালী টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামগুলির জন্য ইউনিট টেস্ট লেখা এবং চালানোর জন্য ব্যবহৃত হয়। JUnit এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল exception handling এর জন্য টেস্ট কেস লেখার সুবিধা। আপনি যদি কোনো কোডের মধ্যে একটি নির্দিষ্ট exception আশা করেন, তবে @Test(expected = Exception.class) অ্যানোটেশন ব্যবহার করতে পারেন।
এটি নিশ্চিত করতে সাহায্য করে যে, আপনার টেস্ট করা কোডে কোনো নির্দিষ্ট exception সঠিকভাবে থ্রো হচ্ছে কি না। এই অ্যানোটেশনটি ব্যবহার করে আপনি সুনির্দিষ্ট এক্সেপশন আশা করতে পারেন এবং যদি এটি কোডে তৈরি হয়, তবে টেস্ট সফল হবে। অন্যথায়, টেস্টটি ব্যর্থ হবে।
১. @Test(expected = Exception.class) এর ধারণা
JUnit এর @Test(expected = Exception.class) অ্যানোটেশনটি একটি টেস্ট মেথডে ব্যবহৃত হয় যখন আপনি আশা করছেন যে, ওই মেথডটি একটি নির্দিষ্ট exception থ্রো করবে। এর মাধ্যমে, আপনি টেস্টে এক্সেপশন ঘটলে সেটিকে সফল হিসেবে গণ্য করতে পারেন।
Syntax:
@Test(expected = Exception.class)
public void testMethod() {
// Code that should throw an exception
}
এখানে, expected = Exception.class নির্দেশ করে যে testMethod() মেথডটি Exception থ্রো করবে। যদি মেথডটি সত্যিই এক্সেপশন থ্রো করে, তবে টেস্টটি সফল হবে।
২. উদাহরণ সহ @Test(expected = Exception.class) ব্যবহার
ধরা যাক, আমাদের একটি 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 থ্রো হচ্ছে।
JUnit Test উদাহরণ:
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);
}
}
এখানে:
- testDivideByZero() মেথডে
calculator.divide(10, 0)কল করা হয়েছে, যা ArithmeticException থ্রো করবে, কারণ দ্বিতীয় প্যারামিটার 0। - @Test(expected = ArithmeticException.class) ব্যবহার করা হয়েছে যাতে ArithmeticException থ্রো হলে টেস্ট সফল হবে।
৩. আরেকটি উদাহরণ: String to Integer Conversion
ধরা যাক, একটি convertToInt() মেথড রয়েছে, যা একটি স্ট্রিংকে Integer তে রূপান্তর করে। যদি স্ট্রিংটি একটি বৈধ পূর্ণসংখ্যা না হয়, তবে এটি NumberFormatException থ্রো করবে। আমরা এই এক্সেপশনটি টেস্ট করতে চাই।
কোড উদাহরণ:
public class StringConverter {
// Method to convert String to Integer
public int convertToInt(String str) {
return Integer.parseInt(str);
}
}
JUnit Test উদাহরণ:
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");
}
}
এখানে:
- testConvertToIntInvalidString() মেথডে
converter.convertToInt("abc")কল করা হয়েছে, যা NumberFormatException থ্রো করবে, কারণ "abc" একটি বৈধ পূর্ণসংখ্যা নয়। - @Test(expected = NumberFormatException.class) দ্বারা NumberFormatException এর জন্য টেস্ট সফল হবে।
৪. ข้อจำกัดของ @Test(expected = Exception.class)
- Multiple exceptions: আপনি যদি একাধিক এক্সেপশন পরীক্ষা করতে চান, তবে
expectedএর মাধ্যমে একমাত্র একটি এক্সেপশন নির্ধারণ করা সম্ভব। যদি একাধিক এক্সেপশন পরীক্ষা করতে চান, তবে আপনিtry-catchব্লক ব্যবহার করতে পারেন এবং অ্যাসার্ট করতে পারেন। - No exception: যদি আপনার কোডে কোনো এক্সেপশন থ্রো না হয়, তবে টেস্টটি ব্যর্থ হবে।
উদাহরণ: No exception scenario
@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() এর ব্যবহার
assertThrows() মেথডটি একটি ল্যাম্বডা এক্সপ্রেশন বা Executable গ্রহণ করে যা এক্সেপশন উৎপন্ন করতে পারে এবং এরপর এটি যাচাই করে যে নির্দিষ্ট এক্সেপশনটি আসছে কিনা।
Syntax:
assertThrows(Class<T> expectedType, Executable executable);
- expectedType: যেই এক্সেপশনটি আপনি পরীক্ষা করতে চান, তা
Class<T>টাইপের হতে হবে। - executable: একটি কোড ব্লক (যা ল্যাম্বডা এক্সপ্রেশন বা কোনো মেথড রেফারেন্স হতে পারে) যা এক্সেপশনটি ফেলে।
২. assertThrows() এর মাধ্যমে এক্সেপশন টেস্ট করার উদাহরণ
ধরা যাক, আমাদের একটি ক্লাস Calculator রয়েছে যা দুটি সংখ্যার ভাগ করার কাজ করে, কিন্তু ভাগফল যদি শূন্য দ্বারা করা হয়, তবে এটি একটি ArithmeticException ফেলে।
Calculator.java:
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 এক্সেপশনটি ফেলা হচ্ছে কিনা তা যাচাই করা যায়।
CalculatorTest.java:
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));
}
}
এখানে:
- assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0)); এই লাইনটি পরীক্ষা করছে যে divide(10, 0) কল করলে কি ArithmeticException এক্সেপশনটি ঘটছে কিনা।
- ArithmeticException.class হলো প্রত্যাশিত এক্সেপশন টাইপ এবং () -> calculator.divide(10, 0) হলো কোড ব্লক যা এক্সেপশনটি ফেলে।
৩. assertThrows() ব্যবহার করে কাস্টম এক্সেপশন টেস্ট করা
এখন, যদি আমরা একটি কাস্টম এক্সেপশন তৈরি করি, যেমন InvalidInputException, তবে আমরা সেটাও assertThrows() ব্যবহার করে পরীক্ষা করতে পারি।
InvalidInputException.java:
public class InvalidInputException extends RuntimeException {
public InvalidInputException(String message) {
super(message);
}
}
Calculator.java (আপডেটেড):
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 এক্সেপশন টেস্ট করতে যাচ্ছি।
CalculatorTest.java (আপডেটেড):
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));
}
}
এখানে:
- InvalidInputException.class হলো আমাদের কাস্টম এক্সেপশন টাইপ এবং () -> calculator.divide(10, -2) হলো কোড ব্লক যা কাস্টম এক্সেপশনটি ফেলে।
৪. assertThrows() এর আরো কিছু গুরুত্বপূর্ণ ব্যবহার
৪.১ Error Message Assertion
এছাড়া, আপনি 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: Basic Concepts
JUnit-এ Exception Handling টেস্ট করার জন্য সাধারণভাবে দুটি মেথড ব্যবহৃত হয়:
- ExpectedException Rule (JUnit 4): JUnit 4-এ
ExpectedExceptionরুল ব্যবহার করা হতো, যার মাধ্যমে আপনি একটি নির্দিষ্ট Exception প্রত্যাশা করতে পারতেন। তবে JUnit 5-এ এটি পরিবর্তন হয়েছে এবংassertThrowsব্যবহার করা হয়। - assertThrows (JUnit 5): JUnit 5-এ
assertThrowsমেথড ব্যবহার করে আপনি নির্দিষ্ট একটি Exception এর কার্যকারিতা পরীক্ষা করতে পারেন।
২. JUnit 5: assertThrows Method
JUnit 5 তে assertThrows একটি স্ট্যাটিক মেথড যা একটি নির্দিষ্ট Exception ধারণ করে এবং এটি পরীক্ষা করে যে, কোনো কোড সেগুলিকে সঠিকভাবে থ্রো করছে কি না।
Syntax:
assertThrows(Class<T> expectedType, Executable executable);
এখানে, expectedType হল যে Exception আপনি প্রত্যাশা করছেন, এবং executable হল কোড ব্লক যা সেই Exception থ্রো করতে পারে।
৩. Exception Handling Example with JUnit
ধরা যাক, আমাদের একটি Calculator ক্লাস আছে যা division অপারেশন করে, তবে ArithmeticException ত্রুটি প্রদর্শন করতে পারে যদি ডিভাইডার শূন্য হয়।
Calculator.java
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 Test Case for Exception Handling
এখন, আমরা JUnit 5 ব্যবহার করে এই ArithmeticException টেস্ট করব।
CalculatorTest.java
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
}
}
এখানে দুটি টেস্ট মেথড রয়েছে:
- testDivideByZero: এখানে
assertThrowsব্যবহার করে আমরা যাচাই করছি যে, যখন শূন্য দ্বারা ভাগ করার চেষ্টা করা হবে, তখন ArithmeticException ছোঁড়া হবে এবং তার মেসেজ সঠিক থাকবে। - testDivideValidInput: এটি একটি সাধারণ টেস্ট যেখানে শূন্য নয় এমন একটি সংখ্যা দিয়ে ভাগ করা হচ্ছে। এটি সঠিক ফলাফল প্রদান করবে।
৫. JUnit 4: ExpectedException Rule (Deprecated in JUnit 5)
যদি আপনি JUnit 4 ব্যবহার করেন, তখন ExpectedException রুল ব্যবহার করে Exception Handling টেস্ট করা যেত।
CalculatorTest.java (JUnit 4 Example)
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 টেস্ট করতে চাই সেটি নির্ধারণ করেছি।
৬. Exception Handling Best Practices in JUnit
- Specific Exception Testing: Exception টেস্ট করার সময়, প্রত্যাশিত Exception এর সঠিক ক্লাস এবং মেসেজ পরীক্ষা করুন।
- Descriptive Messages: Exception এর মেসেজ বা কন্টেন্ট পরীক্ষা করা গুরুত্বপূর্ণ। এতে ত্রুটির কারণ আরও পরিষ্কারভাবে বোঝা যায়।
- Test Only Valid Scenarios: এমন কোনো কোড যেখানে Exception ছোঁড়া হতে পারে, সেটি সঠিকভাবে পরীক্ষিত হওয়া উচিত। অন্যথায় আপনার কোড সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যাবে না।
- Use assertThrows for JUnit 5: JUnit 5 এ
assertThrowsব্যবহার করুন, কারণ এটি JUnit 4 এরExpectedExceptionরুলের চেয়ে বেশি সুনির্দিষ্ট এবং পরিষ্কার।
সারাংশ
JUnit ব্যবহার করে Exception Handling টেস্ট করা সহজ এবং কার্যকরী। JUnit 5 তে assertThrows মেথড ব্যবহার করে আপনি সহজেই একটি নির্দিষ্ট Exception পরীক্ষা করতে পারেন এবং এর সঠিক মেসেজ নিশ্চিত করতে পারেন। JUnit 4 এ, ExpectedException রুল ব্যবহার করে আপনি Exception পরীক্ষা করতে পারতেন, তবে JUnit 5 এ এটি আর প্রয়োজনীয় নয়। Exception টেস্টিংয়ের মাধ্যমে আপনি কোডের স্থিতিশীলতা এবং নিরাপত্তা নিশ্চিত করতে পারেন।
Read more