JUnit হল Java টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্ট তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। JUnit 5 এর নতুন বৈশিষ্ট্যগুলির মধ্যে একটি হল Parameterized Tests, যা আপনাকে একটি টেস্ট মেথডে একাধিক ইনপুট প্রদান করার সুযোগ দেয়, ফলে একাধিক ডেটা নিয়ে একাধিক টেস্ট চালানো সহজ হয়। এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টিং ক্ষমতা বৃদ্ধি পায়।
এই টিউটোরিয়ালে আমরা @ParameterizedTest এবং @ValueSource এনোটেশন নিয়ে আলোচনা করব, যেগুলি JUnit 5 এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য।
১. @ParameterizedTest এনোটেশন
@ParameterizedTest এনোটেশন ব্যবহার করে আপনি একটি টেস্ট মেথডে একাধিক ইনপুট প্রদান করতে পারেন। এটি বিভিন্ন ডেটার উপর টেস্ট করার জন্য একক টেস্ট মেথডকে পুনরায় চালানোর সুযোগ দেয়। এর মাধ্যমে একই লজিক একাধিক ভিন্ন ইনপুটের জন্য পরীক্ষা করা সম্ভব।
@ParameterizedTest এর উদাহরণ
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class CalculatorTest {
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
void testAddition(int number) {
Calculator calculator = new Calculator();
int result = calculator.add(number, 2);
assertEquals(number + 2, result);
}
}
এখানে, @ParameterizedTest ব্যবহার করে testAddition মেথডের মাধ্যমে একাধিক ইনপুট (১ থেকে ৫) প্রদান করা হয়েছে। প্রতিটি ইনপুটের জন্য টেস্ট চলবে এবং সঠিক ফলাফল যাচাই করা হবে।
২. @ValueSource এনোটেশন
@ValueSource এনোটেশন দ্বারা আপনি টেস্ট মেথডে একাধিক ইনপুট সরবরাহ করতে পারেন। এটি বিভিন্ন প্রকার ডেটা যেমন int, String, boolean, ইত্যাদি নিয়ে কাজ করতে পারে।
@ValueSource এর উদাহরণ
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class StringUtilsTest {
@ParameterizedTest
@ValueSource(strings = {"apple", "banana", "cherry"})
void testStringLength(String fruit) {
assertTrue(fruit.length() > 3);
}
}
এখানে, @ValueSource(strings = {...}) ব্যবহার করে testStringLength মেথডে তিনটি ভিন্ন স্ট্রিং (apple, banana, cherry) প্রদান করা হয়েছে এবং যাচাই করা হচ্ছে যে প্রত্যেকটি স্ট্রিংয়ের দৈর্ঘ্য ৩ এর বেশি।
৩. @ValueSource এবং অন্যান্য সাপোর্টেড ডেটা টাইপ
@ValueSource এনোটেশন বিভিন্ন ডেটা টাইপ সাপোর্ট করে, যেমন:
- ints: ইনটিজার ধরনের ইনপুট
- strings: স্ট্রিং ধরনের ইনপুট
- doubles: ডাবল ধরনের ইনপুট
- booleans: বুলিয়ান ধরনের ইনপুট
উদাহরণ: বিভিন্ন ডেটা টাইপ
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testEvenNumbers(int number) {
assertTrue(number % 2 == 0);
}
@ParameterizedTest
@ValueSource(doubles = {1.0, 2.5, 3.0})
void testPositiveNumbers(double number) {
assertTrue(number > 0);
}
@ParameterizedTest
@ValueSource(booleans = {true, false})
void testBooleanValues(boolean value) {
assertNotNull(value);
}
এখানে, @ValueSource এর মাধ্যমে int, double, এবং boolean ধরনের ইনপুট টেস্ট করা হয়েছে।
৪. @CsvSource: মাল্টিপল ইনপুটের জন্য
যদি আপনাকে একাধিক ভ্যালুতে টেস্ট করতে হয়, যেমন String এবং int একসাথে, তবে @CsvSource ব্যবহার করা যেতে পারে। এটি একাধিক ইনপুট কপি করে একটি সিঙ্গল টেস্ট মেথডে প্রদান করতে সহায়তা করে।
উদাহরণ: @CsvSource
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class CalculatorTest {
@ParameterizedTest
@CsvSource({"apple, 5", "banana, 6", "cherry, 7"})
void testFruitLength(String fruit, int length) {
assertEquals(length, fruit.length());
}
}
এখানে, @CsvSource ব্যবহার করে String এবং int দুইটি ইনপুট প্রদান করা হচ্ছে।
৫. @MethodSource: কাস্টম ইনপুট প্রদান
@MethodSource ব্যবহার করে আপনি একটি কাস্টম মেথড থেকে ইনপুট সংগ্রহ করতে পারেন, যা ডেটা প্রদান করবে। এটি বিশেষ করে যখন আপনাকে ডাইনামিক ডেটা প্রয়োজন হয়।
উদাহরণ: @MethodSource
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
public class CalculatorTest {
@ParameterizedTest
@MethodSource("provideNumbers")
void testAddition(int number, int expected) {
Calculator calculator = new Calculator();
assertEquals(expected, calculator.add(number, 2));
}
static Stream<org.junit.jupiter.params.provider.Arguments> provideNumbers() {
return Stream.of(
org.junit.jupiter.params.provider.Arguments.of(1, 3),
org.junit.jupiter.params.provider.Arguments.of(2, 4),
org.junit.jupiter.params.provider.Arguments.of(3, 5)
);
}
}
এখানে, @MethodSource এনোটেশন ব্যবহার করে provideNumbers মেথড থেকে ডেটা নেওয়া হচ্ছে। Stream ব্যবহার করে কাস্টম ডেটা প্রদান করা হচ্ছে।
৬. Parameterized Test এর সুবিধা
- Code Reusability: একই টেস্ট মেথডে বিভিন্ন ইনপুট দিয়ে একাধিক টেস্ট চালানো যায়।
- Data-Driven Testing: বিভিন্ন ধরনের ডেটার জন্য একই টেস্ট মেথড ব্যবহার করা সম্ভব হয়।
- Clearer Tests: একাধিক টেস্টের জন্য একটি টেস্ট মেথড ব্যবহার করলে কোড আরও ক্লিয়ার এবং সংক্ষিপ্ত হয়।
সারাংশ
JUnit 5 এ @ParameterizedTest এবং @ValueSource এনোটেশন ব্যবহারের মাধ্যমে আমরা একাধিক ইনপুটের জন্য একটি টেস্ট মেথড চালাতে পারি। এটি ডেটা ড্রিভেন টেস্টিংকে সহজতর করে এবং @ValueSource এবং @MethodSource এর মাধ্যমে ডেটার বিভিন্ন ধরন প্রক্রিয়া করা যায়। এছাড়া, @CsvSource বা @MethodSource ব্যবহার করে কাস্টম ডেটা প্রদান করতে পারা যায়।
এগুলো JUnit 5 এর শক্তিশালী ফিচার যা টেস্টিং প্রক্রিয়াকে আরও কার্যকরী এবং স্কেলেবল করে তোলে।
Read more