Parameterized Tests

Java Technologies - জেইউনিট (JUnit)
91
91

JUnit হল Java এর জন্য একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্টিং সহজ করে তোলে। Parameterized Tests JUnit-এ এমন একটি বৈশিষ্ট্য যা আপনাকে একই টেস্ট মেথডকে একাধিক ইনপুটের সাথে একাধিকবার চালানোর সুযোগ দেয়। এর মাধ্যমে আপনি একটি টেস্ট মেথডে ভিন্ন ভিন্ন ইনপুট দিয়ে একাধিক টেস্ট চালাতে পারেন, যাতে কোডের ব্যাবহারিকতা এবং ভেরিয়েবল টেস্টিং নিশ্চিত করা যায়।

Parameterized Tests ব্যবহার করে আপনি অনেকগুলো ডাটা সেটের সাথে একই টেস্ট মেথডের কার্যকারিতা পরীক্ষা করতে পারেন, যা কোডের পুনঃব্যবহারযোগ্যতা এবং বিভিন্ন ইনপুটের সাথে টেস্ট চালানোকে সহজ করে তোলে।


১. JUnit Parameterized Test কী?

Parameterized Test JUnit 4 (এবং পরবর্তী সংস্করণে) একটি টেস্ট মেথডকে একাধিক বার চালানোর সুযোগ দেয়, যেখানে প্রতিবার নতুন ডাটা সেট দেওয়া হয়। এটি বিশেষভাবে উপকারী যখন একই ধরনের পরীক্ষণ একাধিক ডাটার সাথে করতে হয়, যেমন ম্যাথেমেটিক্যাল ক্যালকুলেশন, ডাটা ফরম্যাট কনভার্সন ইত্যাদি।

JUnit এর Parameterized Test কনফিগারেশনে, @RunWith(Parameterized.class) অ্যানোটেশন ব্যবহার করা হয় এবং @Parameters অ্যানোটেশন দ্বারা ইনপুট ডেটা সেট করা হয়।


২. JUnit Parameterized Test এর উদাহরণ

২.১ JUnit 4 Parameterized Test Example

এখানে একটি সহজ উদাহরণ দেখা যাবে, যেখানে addition ফাংশনকে বিভিন্ন ইনপুট দিয়ে টেস্ট করা হবে।

Test Class: AdditionTest.java
import org.junit.runner.RunWith;
import org.junit.Test;
import org.junit.runners.Parameterized;
import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class AdditionTest {

    private int number1;
    private int number2;
    private int expectedSum;

    // Constructor
    public AdditionTest(int number1, int number2, int expectedSum) {
        this.number1 = number1;
        this.number2 = number2;
        this.expectedSum = expectedSum;
    }

    // Parameters method to provide data for the test
    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 1, 2, 3 },  // 1 + 2 = 3
            { 2, 3, 5 },  // 2 + 3 = 5
            { 4, 5, 9 },  // 4 + 5 = 9
            { 7, 8, 15 }  // 7 + 8 = 15
        });
    }

    // Test method to test addition
    @Test
    public void testAddition() {
        assertEquals(expectedSum, number1 + number2);
    }
}

এখানে:

  • @RunWith(Parameterized.class): এটি বলে যে টেস্টটি Parameterized কনফিগারেশনের সাথে চলবে।
  • @Parameterized.Parameters: এই অ্যানোটেশনটি ডাটা সেটের জন্য একটি কোলেকশন প্রদান করে, যা টেস্ট মেথডে ইনপুট হিসেবে ব্যবহৃত হবে।
  • Constructor: কনস্ট্রাক্টরের মাধ্যমে ইনপুট ডেটা টেস্ট মেথডে ইনজেক্ট করা হচ্ছে।

২.২ JUnit 5 Parameterized Test Example

JUnit 5 এ ParameterizedTest এবং @ValueSource বা @MethodSource ব্যবহার করা হয়। এখানে JUnit 5 এর সাথে একই addition ফাংশনের টেস্ট দেখানো হয়েছে।

Test Class: AdditionTest.java
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class AdditionTest {

    @ParameterizedTest
    @ValueSource(ints = {1, 2, 4, 7})  // Parameters
    public void testAddition(int number) {
        assertEquals(10, number + 9);  // Testing 9 + parameter
    }
}

এখানে:

  • @ParameterizedTest: JUnit 5 এ @Test এর পরিবর্তে @ParameterizedTest ব্যবহৃত হয়।
  • @ValueSource: এখানে এটি ints ব্যবহার করে একাধিক সংখ্যা সরবরাহ করছে, এবং প্রতিটি সংখ্যা টেস্ট মেথডে দেওয়া হবে।

২.৩ JUnit 5 Method Source Example

@MethodSource ব্যবহার করে একটি কাস্টম ডেটা প্রোভাইডার ফাংশন তৈরি করা যেতে পারে।

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class AdditionTest {

    @ParameterizedTest
    @MethodSource("additionData")  // Custom method for parameters
    public void testAddition(int number1, int number2, int expectedSum) {
        assertEquals(expectedSum, number1 + number2);
    }

    // Custom method to provide data
    static Object[][] additionData() {
        return new Object[][] {
            {1, 2, 3},  // 1 + 2 = 3
            {2, 3, 5},  // 2 + 3 = 5
            {4, 5, 9},  // 4 + 5 = 9
            {7, 8, 15}  // 7 + 8 = 15
        };
    }
}

এখানে:

  • @MethodSource: এটি কাস্টম ডেটা প্রোভাইডার ফাংশন (additionData) ব্যবহার করে।
  • additionData(): এটি একটি মেথড যা ডেটা সরবরাহ করে এবং @MethodSource এর মাধ্যমে টেস্ট মেথডে ডেটা ইনজেক্ট করা হয়।

৩. Parameterized Tests এর সুবিধা

  1. Code Reusability: একই টেস্ট মেথডকে একাধিক ডাটা সেট দিয়ে একাধিকবার চালানো যায়, ফলে কোড পুনরাবৃত্তি কমে যায়।
  2. Comprehensive Testing: একাধিক ইনপুট দিয়ে একই টেস্ট মেথডে পরীক্ষা চালানো যায়, ফলে বিভিন্ন শর্তে কোডের কার্যকারিতা নিশ্চিত করা যায়।
  3. Easy to Implement: JUnit 4 এবং JUnit 5 উভয়ই Parameterized Tests সহজে ইমপ্লিমেন্ট করার সুযোগ দেয়।

সারাংশ

Parameterized Tests JUnit-এ এমন একটি সুবিধা যা আপনাকে একাধিক ইনপুটের সাথে একাধিক টেস্ট চালানোর সুযোগ দেয়। JUnit 4 এবং JUnit 5 উভয়ই Parameterized Test সাপোর্ট করে। JUnit 5-এ @ValueSource এবং @MethodSource অ্যানোটেশন ব্যবহার করে আপনি ডেটা প্রদান করতে পারেন। এটি কোডের পুনঃব্যবহারযোগ্যতা বাড়ায় এবং কোডের ভেরিয়েবল ইনপুটের জন্য সহজে টেস্টিং করা যায়।


Content added By

Parameterized Tests কি এবং কেন প্রয়োজন?

95
95

JUnit হল একটি Java টেস্টিং ফ্রেমওয়ার্ক যা আপনাকে ইউনিট টেস্ট লিখতে, পরিচালনা করতে এবং ফলাফল বিশ্লেষণ করতে সাহায্য করে। Parameterized Tests হল JUnit এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একাধিক ইনপুট এবং আউটপুটের জন্য একই টেস্ট মেথড ব্যবহার করে টেস্ট করার সুবিধা দেয়। এটি বিশেষত যখন একই ধরনের টেস্ট একাধিক ভ্যালুর জন্য চালানো প্রয়োজন, তখন কার্যকরী।

১. Parameterized Tests কি?

Parameterized Tests হল একটি বিশেষ ধরনের টেস্ট যেখানে একটি একক টেস্ট মেথড একাধিক ইনপুটের সাথে রান হয়। এর মাধ্যমে, একই লজিকাল টেস্ট একাধিক ভ্যালুর উপর পরীক্ষা করা যায়। এর ফলে কোডের পুনরাবৃত্তি কমে এবং টেস্টের গঠন আরও পরিষ্কার হয়।

JUnit 4 তে Parameterized Tests ব্যবহারের জন্য @RunWith(Parameterized.class) এবং @Parameters অ্যানোটেশন ব্যবহার করা হয়।


২. Parameterized Tests এর সুবিধা

  1. Code Duplication কমানো: একাধিক ইনপুটের জন্য একই লজিকাল টেস্ট চালানো যায়, যার ফলে কোড পুনরাবৃত্তি এড়ানো যায়।
  2. Test Coverage বৃদ্ধি: একাধিক ভ্যালুর জন্য টেস্ট চালানো যায়, যা আপনার প্রোগ্রামের অন্যান্য অংশও পরীক্ষা করতে সহায়তা করে।
  3. Maintainability: যখন টেস্টে পরিবর্তন প্রয়োজন হয়, তখন একাধিক টেস্ট পরিবর্তন করার প্রয়োজন পড়ে না। শুধু একটি টেস্ট মেথডে পরিবর্তন করে বাকি সব কাজ হয়ে যায়।

৩. Parameterized Test এর উদাহরণ

ধরা যাক, আপনি একটি মেথড পরীক্ষা করতে চান যেটি দুটি সংখ্যা যোগ করে। আমরা এই টেস্টের জন্য parameterized test লিখব।

৩.১ Test Class:

import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class CalculatorTest {

    private int num1;
    private int num2;
    private int expectedSum;

    // Constructor to initialize the test parameters
    public CalculatorTest(int num1, int num2, int expectedSum) {
        this.num1 = num1;
        this.num2 = num2;
        this.expectedSum = expectedSum;
    }

    // Parameters: providing different sets of values to test
    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 1, 2, 3 },  // Test case 1: 1 + 2 = 3
            { 3, 4, 7 },  // Test case 2: 3 + 4 = 7
            { -1, 1, 0 }, // Test case 3: -1 + 1 = 0
            { -5, -5, -10 } // Test case 4: -5 + -5 = -10
        });
    }

    // Test method
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        assertEquals(expectedSum, calculator.add(num1, num2));
    }
}

৩.২ Calculator Class:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

৩.৩ ব্যাখ্যা:

  • @RunWith(Parameterized.class): এটি JUnit কে বলে যে এই ক্লাসটি Parameterized Test হবে এবং একাধিক ইনপুটের জন্য একই টেস্ট মেথড চালানো হবে।
  • @Parameters: এই অ্যানোটেশনটি একটি স্ট্যাটিক মেথডের মাধ্যমে ইনপুট ডেটা প্রদান করে, যা একাধিক টেস্ট রানের জন্য ব্যবহৃত হয়। এখানে Arrays.asList() এর মাধ্যমে চারটি টেস্ট কেস প্রদান করা হয়েছে।
  • Constructor: এই কনস্ট্রাক্টরের মাধ্যমে ইনপুট ডেটা (যেমন, দুইটি সংখ্যা এবং তাদের যোগফল) টেস্ট মেথডে পাঠানো হয়।

এখানে, testAdd() মেথডটি প্রতি ইনপুট সেটের জন্য চলে এবং প্রত্যাশিত যোগফল পরীক্ষা করে।


৪. Parameterized Test কিভাবে কাজ করে?

  1. @Parameters অ্যাডানোটেশন একটি স্ট্যাটিক মেথডে ইনপুট ডেটা প্রদান করে যা টেস্ট কেসের জন্য কাজ করবে।
  2. প্রতি টেস্ট রান হবে এবং testAdd() মেথডে ইনপুট প্যারামিটার পাঠানো হবে।
  3. প্রত্যেকটি ইনপুটের জন্য, Calculator ক্লাসের add() মেথডটি চালানো হবে এবং ফলাফল প্রত্যাশিত ফলাফলের সাথে তুলনা করা হবে।

৫. Parameterized Test এর সুবিধা

  1. Code Duplication কমানো: আপনি একাধিক ইনপুট এবং প্রত্যাশিত আউটপুটের জন্য একই টেস্ট মেথড ব্যবহার করতে পারেন, ফলে কোডের পুনরাবৃত্তি কমে যায়।
  2. Testing Various Scenarios: একাধিক ভ্যালু দিয়ে একটিই টেস্ট কেস চালানো যায়, যা আপনার কোডের স্টেবিলিটি এবং বিভিন্ন পরিস্থিতি পরীক্ষা করতে সহায়তা করে।
  3. Improved Readability: একাধিক টেস্ট কেস তৈরি না করে, একটি টেস্ট মেথডে ভিন্ন ভিন্ন ইনপুট দিয়ে আপনি কোডের পাঠযোগ্যতা বজায় রাখতে পারেন।

৬. Parameterized Tests এর ব্যবহার কৌশল

  1. Large Dataset Testing: যদি আপনার সিস্টেমে বড় ডেটাসেট থাকে, তবে আপনি সেই ডেটাসেটের ওপর একাধিক টেস্ট চালাতে পারবেন।
  2. Performance Testing: একাধিক কন্ডিশনে পারফরম্যান্স টেস্ট করতে পারেন।
  3. Boundary Testing: ইনপুটের বিভিন্ন সীমা (Boundary) পরীক্ষা করতে পারেন যাতে সিস্টেমটি সীমার মধ্যে সঠিকভাবে কাজ করে।

সারাংশ

Parameterized Tests JUnit এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একাধিক ইনপুটের জন্য একই টেস্ট মেথড ব্যবহার করতে সহায়তা করে। এটি কোড পুনরাবৃত্তি কমায়, টেস্ট কভারেজ বৃদ্ধি করে এবং পারফরম্যান্স উন্নত করতে সহায়ক। JUnit এর @RunWith(Parameterized.class) এবং @Parameters অ্যানোটেশন ব্যবহার করে আপনি সহজেই প্যারামিটারাইজড টেস্ট লিখতে পারবেন এবং আপনার কোডের বিভিন্ন পরিস্থিতি পরীক্ষা করতে পারবেন।


Content added By

@ParameterizedTest এবং @ValueSource এনোটেশন এর ব্যবহার

68
68

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 এর শক্তিশালী ফিচার যা টেস্টিং প্রক্রিয়াকে আরও কার্যকরী এবং স্কেলেবল করে তোলে।


Content added By

@MethodSource এবং @CsvSource এর মাধ্যমে Complex Test Data যোগ করা

102
102

JUnit হল একটি জনপ্রিয় টেস্ট ফ্রেমওয়ার্ক যা Java কোডের ইউনিট টেস্ট লেখার জন্য ব্যবহৃত হয়। এটি কোডের নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করতে সহায়তা করে। JUnit 5 এর সাথে, আপনি টেস্ট কেসে complex test data যোগ করতে @MethodSource এবং @CsvSource অ্যানোটেশন ব্যবহার করতে পারেন। এই অ্যানোটেশনগুলির মাধ্যমে আপনি টেস্টের জন্য বিভিন্ন ধরনের ডাটা প্রোভাইড করতে পারেন, যা টেস্টিং প্রক্রিয়াকে আরও শক্তিশালী এবং নমনীয় করে তোলে।

এই টিউটোরিয়ালে, আমরা @MethodSource এবং @CsvSource অ্যানোটেশন ব্যবহার করে কিভাবে complex test data যোগ করা যায়, তা দেখব।


১. @MethodSource অ্যানোটেশন

@MethodSource অ্যানোটেশন ব্যবহার করে আপনি টেস্টের জন্য ডাটা প্রোভাইড করতে পারেন একটি মেথড থেকে, যা টেস্টের জন্য প্রোপার ডাটা রিটার্ন করবে। এটি ডাইনামিক ডাটা সোর্স তৈরির জন্য উপকারী, যেখানে আপনি বিভিন্ন টেস্ট কেসের জন্য ভিন্ন ভিন্ন ডাটা ব্যবহার করতে পারেন।

উদাহরণ: @MethodSource

ধরা যাক, আমাদের একটি Calculator ক্লাস আছে এবং আমরা এটিতে কিছু মেথড টেস্ট করতে চাই।

Calculator.java:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

CalculatorTest.java:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.MethodSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.stream.Stream;

public class CalculatorTest {

    // @MethodSource for providing test data
    @Test
    @MethodSource("provideDataForAddition")
    public void testAddition(int a, int b, int expected) {
        Calculator calculator = new Calculator();
        int result = calculator.add(a, b);
        assertEquals(expected, result);
    }

    // Method providing test data
    private static Stream<org.junit.jupiter.params.provider.Arguments> provideDataForAddition() {
        return Stream.of(
            org.junit.jupiter.params.provider.Arguments.arguments(1, 2, 3),
            org.junit.jupiter.params.provider.Arguments.arguments(5, 10, 15),
            org.junit.jupiter.params.provider.Arguments.arguments(0, 0, 0)
        );
    }
}

এখানে, @MethodSource অ্যানোটেশন testAddition মেথডে ব্যবহার করা হয়েছে এবং provideDataForAddition() মেথডটি ডাটা প্রোভাইড করছে। এইভাবে, একাধিক ডাটা সেট থেকে টেস্ট চালানো সম্ভব হচ্ছে।


২. @CsvSource অ্যানোটেশন

@CsvSource অ্যানোটেশন ব্যবহার করে আপনি টেস্টের জন্য CSV ফরম্যাটে ডাটা প্রোভাইড করতে পারেন। এটি বিশেষভাবে দরকারী যখন আপনি একাধিক ডাটা ভ্যালু থেকে টেস্ট করতে চান।

উদাহরণ: @CsvSource

ধরা যাক, আমাদের একটি StringUtility ক্লাস আছে যা দুটি স্ট্রিংয়ের মধ্যে যোগফল বের করার কাজ করে।

StringUtility.java:

public class StringUtility {
    public String concatenate(String str1, String str2) {
        return str1 + str2;
    }
}

StringUtilityTest.java:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class StringUtilityTest {

    // @CsvSource for providing complex test data
    @ParameterizedTest
    @CsvSource({
        "'Hello', 'World', 'HelloWorld'",
        "'Java', 'UnitTest', 'JavaUnitTest'",
        "'JUnit', '5', 'JUnit5'"
    })
    public void testConcatenate(String str1, String str2, String expected) {
        StringUtility utility = new StringUtility();
        String result = utility.concatenate(str1, str2);
        assertEquals(expected, result);
    }
}

এখানে, @CsvSource অ্যানোটেশন ব্যবহার করে আপনি একাধিক String ইনপুট এবং তাদের প্রত্যাশিত আউটপুট দিয়ে টেস্ট কেসটি চালাচ্ছেন। CSV ফরম্যাটে ডাটা প্রদান করা হয়েছে যেখানে কমা দিয়ে ইনপুট এবং আউটপুট পৃথক করা হয়েছে।


৩. @CsvSource এবং @MethodSource এর মধ্যে পার্থক্য

Feature@MethodSource@CsvSource
Data Source Typeএকটি মেথড থেকে ডাটা প্রোভাইড করা হয়CSV স্ট্রিং থেকে ডাটা প্রোভাইড করা হয়
Usageসাধারণত বড় বা কাস্টম ডাটা সোর্সের জন্য ব্যবহার করা হয়ছোট ও সাধারণ ডাটা সোর্সের জন্য সহজতর ব্যবহৃত হয়
Data Formatমেথড আর্গুমেন্ট এবং আর্গুমেন্টের মাধ্যমে ডাটা প্রদানCSV স্ট্রিং (কমা দ্বারা পৃথক)
Complexityকাস্টম লজিক ব্যবহার করা যায়সাধারণ ডাটা ম্যানিপুলেশন

৪. Test Data with Multiple Arguments

ধরা যাক, আমাদের দুটি ভিন্ন ইনপুট প্যারামিটার দিয়ে টেস্ট করতে হবে এবং প্রত্যাশিত আউটপুট সুনির্দিষ্ট করতে হবে। এই ক্ষেত্রে @CsvSource অ্যানোটেশন একাধিক ইনপুট প্যারামিটার এবং তাদের প্রত্যাশিত ফলাফল একটি সহজ উপায়ে প্রোভাইড করতে সহায়তা করে।

উদাহরণ: Multiple Arguments with @CsvSource

@ParameterizedTest
@CsvSource({
    "2, 3, 5",
    "5, 10, 15",
    "0, 0, 0"
})
public void testAddition(int a, int b, int expected) {
    Calculator calculator = new Calculator();
    assertEquals(expected, calculator.add(a, b));
}

এখানে, @CsvSource অ্যানোটেশন তিনটি ভিন্ন ইনপুট (অ্যাডিশন টেস্ট) থেকে টেস্ট চালাবে।


সারাংশ

JUnit টেস্টিং ফ্রেমওয়ার্কে @MethodSource এবং @CsvSource অ্যানোটেশন ব্যবহার করে complex test data সহজে যোগ করা যায়। @MethodSource টেস্ট ডেটা একটি মেথড থেকে এনে টেস্ট করতে সহায়তা করে, যেখানে @CsvSource সরাসরি CSV ফরম্যাটে ডাটা প্রদান করে। উভয় অ্যানোটেশনই JUnit 5 এর প্যারামিটারাইজড টেস্টিংয়ের জন্য অত্যন্ত কার্যকরী এবং নমনীয়ভাবে একাধিক ডাটা প্যারামিটার দিয়ে টেস্ট সম্পাদন করতে সহায়তা করে।


Content added By

Practical উদাহরণ: Parameterized Test এর মাধ্যমে Multiple Input Values পরীক্ষা করা

65
65

JUnit একটি জনপ্রিয় টেস্ট ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ইউনিট টেস্ট তৈরি এবং চালাতে ব্যবহৃত হয়। JUnit এর Parameterized Test একটি শক্তিশালী ফিচার যা আপনাকে একাধিক ইনপুট ভ্যালু দিয়ে একাধিক টেস্ট কেস চালানোর সুযোগ দেয়, এবং একই টেস্ট মেথডের মাধ্যমে একাধিক ডেটা পরীক্ষা করা যায়।

Parameterized Test-এর মাধ্যমে, আপনি একাধিক ভ্যালু দিয়ে টেস্ট চালাতে পারেন, যেটি বিশেষভাবে কার্যকর যখন আপনাকে একই টেস্টে বিভিন্ন ইনপুট দিয়ে একই লজিক পরীক্ষা করতে হয়।

এই টিউটোরিয়ালে, আমরা JUnit Parameterized Test এর সাহায্যে Multiple Input Values পরীক্ষা করার একটি উদাহরণ দেখাবো।


১. JUnit Parameterized Test কিভাবে কাজ করে?

JUnit Parameterized Test একটি স্পেশাল অ্যানোটেশন ব্যবহার করে, যেমন @RunWith(Parameterized.class) এবং @Parameters@RunWith(Parameterized.class) অ্যানোটেশন দিয়ে আমরা JUnit-কে জানিয়ে দেই যে, এই টেস্ট ক্লাসটি প্যারামিটারাইজড টেস্ট হিসেবে চলবে এবং @Parameters অ্যানোটেশন দ্বারা প্যারামিটারাইজড ইনপুট দেওয়া হয়।

২. JUnit Parameterized Test এর উদাহরণ

ধরা যাক, আমাদের একটি সিম্পল Calculator ক্লাস রয়েছে যা দুটি নাম্বারের যোগফল হিসাব করে:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

এখন, আমরা Calculator ক্লাসের add মেথডটি বিভিন্ন ইনপুট দিয়ে পরীক্ষা করতে চাই। আমরা JUnit Parameterized Test ব্যবহার করে একাধিক ইনপুটের মাধ্যমে এই মেথডটি পরীক্ষা করবো।

২.১ JUnit Parameterized Test Class Example

import org.junit.runner.RunWith;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class CalculatorTest {

    private int input1;
    private int input2;
    private int expectedResult;

    private Calculator calculator = new Calculator();

    // Constructor to initialize the input parameters
    public CalculatorTest(int input1, int input2, int expectedResult) {
        this.input1 = input1;
        this.input2 = input2;
        this.expectedResult = expectedResult;
    }

    // Test method
    @Test
    public void testAdd() {
        assertEquals(expectedResult, calculator.add(input1, input2));
    }

    // Parameters: Test cases with different inputs
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 1, 1, 2 },    // Test case 1
            { 2, 3, 5 },    // Test case 2
            { 5, 5, 10 },   // Test case 3
            { -1, -1, -2 }  // Test case 4
        });
    }
}

২.২ ব্যাখ্যা:

  • @RunWith(Parameterized.class): এটি নির্দেশ করে যে এই টেস্ট ক্লাসটি প্যারামিটারাইজড টেস্ট হিসেবে চলবে।
  • @Parameters: এই অ্যানোটেশন প্যারামিটারযুক্ত ইনপুট সরবরাহ করে। এটি একটি কলেকশন (যেমন Arrays.asList) প্রদান করে, যাতে প্রত্যেক টেস্টের জন্য ইনপুট প্রদান করা হয়।
  • Constructor: প্যারামিটারized টেস্টের জন্য, আমাদের একটি কনস্ট্রাকটর তৈরি করতে হয় যা ইনপুট ভ্যালু গ্রহণ করে।
  • testAdd(): এটি মূল টেস্ট মেথড, যা Calculator ক্লাসের add() মেথডটিকে টেস্ট করে।

৩. JUnit Parameterized Test চালানো

এখন আপনি যখন এই টেস্ট ক্লাসটি চালাবেন, JUnit প্রতিটি প্যারামিটারাইজড ইনপুটের জন্য add মেথডটি পরীক্ষা করবে এবং প্রত্যাশিত ফলাফল চেক করবে।

এখানে চারটি আলাদা টেস্ট কেস থাকবে, যেগুলি একে একে চালানো হবে:

  • Test case 1: 1 + 1 = 2
  • Test case 2: 2 + 3 = 5
  • Test case 3: 5 + 5 = 10
  • Test case 4: -1 + -1 = -2

৩.১ Test Output Example:

Test run started
Test case 1: Passed
Test case 2: Passed
Test case 3: Passed
Test case 4: Passed
Test run finished

এখানে, প্রত্যেকটি ইনপুটের জন্য add মেথডটি পরীক্ষা করা হয়েছে এবং প্রত্যাশিত ফলাফল যথাযথভাবে পাওয়া গেছে।


৪. JUnit Parameterized Test এর সুবিধা

  1. Code Reusability: একই টেস্ট মেথডকে বিভিন্ন ইনপুট দিয়ে একাধিকবার চালানো যায়, ফলে কোড পুনরাবৃত্তি কমে।
  2. Simplified Test Cases: একাধিক ইনপুটের জন্য আলাদা টেস্ট মেথড তৈরি করার পরিবর্তে, একটি সাধারণ টেস্ট মেথডের মাধ্যমে সব ইনপুট পরীক্ষা করা যায়।
  3. Efficient Testing: বিভিন্ন ধরনের ইনপুট পরীক্ষা করা দ্রুত হয়ে ওঠে এবং একযোগে সবগুলো টেস্ট করা যায়।

৫. Conclusion

JUnit Parameterized Test একটি শক্তিশালী টুল যা আপনাকে একই টেস্ট মেথডের মাধ্যমে বিভিন্ন ইনপুট পরীক্ষা করতে সাহায্য করে। এটি কোডের পুনরাবৃত্তি কমায় এবং একটি সাধারণভাবে একাধিক টেস্ট কেস পরিচালনা করার সুযোগ দেয়। বিভিন্ন ধরনের ইনপুট ভ্যালুর সাথে টেস্ট চালানো, JUnit টেস্টিং প্রক্রিয়াকে আরও কার্যকরী এবং নির্ভুল করে তোলে।


Content added By
Promotion