JUnit: এটি কী, মূল ধারণা এবং এটি কীভাবে কাজ করে

লেখক: IT Sectr প্রকাশিত: 2026-04-08 পড়ার সময়: 8 মিনিট

JUnit হল Java এবং Kotlin ইকোসিস্টেমে ইউনিট টেস্টিংয়ের জন্য একটি স্ট্যান্ডার্ড ফ্রেমওয়ার্ক, যা Android ডেভেলপমেন্টে বিচ্ছিন্ন কম্পোনেন্টের স্তরে বিজনেস লজিক যাচাই করতে ব্যবহৃত হয়। ফ্রেমওয়ার্কটি অ্যানোটেশন, অ্যাসার্শন মেথড এবং Test Runner-এর একটি সেট প্রদান করে যা স্বয়ংক্রিয়ভাবে টেস্ট শনাক্তকরণ এবং সম্পাদন করে। JUnit.org-এর মতে, লাইব্রেরিটি JVM ইকোসিস্টেমে ইউনিট টেস্টিংয়ের জন্য সবচেয়ে জনপ্রিয় সমাধান হিসাবে রয়ে গেছে: 70%-এরও বেশি Java প্রজেক্ট যেকোনো সংস্করণে JUnit ব্যবহার করে।

মূল পয়েন্ট

  • JUnit Java এবং Kotlin কোডের ইউনিট টেস্টিংয়ের জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক।
  • অ্যানোটেশন — @Test, @BeforeEach, @BeforeAll টেস্ট ক্লাসের লাইফসাইকেল পরিচালনা করে।
  • অ্যাসার্শন — assertEquals, assertTrue, assertThrows প্রত্যাশিত এক্সিকিউশন ফলাফল যাচাই করে।
  • প্যারামিটারাইজড টেস্ট — একই টেস্টকে বিভিন্ন ইনপুট ডেটা সেটের সাথে চালানোর অনুমতি দেয়।
  • Test Runner — JUnit ইনফ্রাস্ট্রাকচার স্বয়ংক্রিয়ভাবে প্রজেক্টের সমস্ত টেস্ট খুঁজে ও চালায়।

JUnit কী?

JUnit হল Java এবং Kotlin-এ পুনরাবৃত্তিযোগ্য ইউনিট টেস্ট লেখা এবং চালানোর জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক। এটি xUnit ইকোসিস্টেমের অংশ — Kent Beck এবং Erich Gamma-এর আর্কিটেকচারের উপর ভিত্তি করে ফ্রেমওয়ার্কের একটি পরিবার — এবং Android Studio এবং IntelliJ IDEA-তে স্ট্যান্ডার্ড টেস্টিং টুল।

JUnit-এর প্রধান কাজ হল কোডের একটি ছোট অংশ (মেথড, ক্লাস) আলাদা করা এবং নিয়ন্ত্রিত অবস্থায় এর আচরণ যাচাই করা। টেস্টগুলি অ্যানোটেশন সহ সাধারণ Java/Kotlin ক্লাস হিসাবে লেখা হয়, এবং ফ্রেমওয়ার্ক টেস্ট শনাক্তকরণ, লাইফসাইকেল পরিচালনা এবং এক্সিকিউশন পরিসংখ্যান সংগ্রহ করে।

JUnit-এর প্রথম সংস্করণ 1997-এ আবির্ভূত হয় এবং Test-Driven Development (TDD) অনুশীলনকে জনপ্রিয় করে ডেভেলপমেন্ট পদ্ধতিকে আমূল পরিবর্তন করে। আজ, JUnit 5 (Jupiter) বর্তমান সংস্করণ, যা Java 8+ এবং এক্সটেনশন সমর্থনকারী মডুলার আর্কিটেকচার সহ সম্পূর্ণরূপে পুনর্নির্মিত।

JUnit কীভাবে কাজ করে

JUnit এক্সিকিউশনের প্রক্রিয়া Test Runner প্যাটার্নের উপর ভিত্তি করে, যা classpath স্ক্যান করে, @Test অ্যানোটেশন সহ মেথড খুঁজে, টেস্ট ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং একটি নির্দিষ্ট ক্রমে মেথড চালায়। Test Runner লাইফসাইকেল পরিচালনা করে: BeforeAll → BeforeEach → Test → AfterEach → AfterAll।

টেস্ট ক্লাসের লাইফসাইকেল

JUnit প্রতিটি টেস্ট মেথডকে একটি পৃথক ক্লাস ইনস্ট্যান্সে মোড়ায়, যা টেস্টগুলির মধ্যে বিচ্ছিন্নতা নিশ্চিত করে। এর অর্থ হল ক্লাসের ফিল্ডগুলি বিভিন্ন @Test মেথডের মধ্যে অবস্থা ধরে রাখে না — প্রতিটি টেস্ট একটি পরিষ্কার অবজেক্ট দিয়ে শুরু হয়।

টেস্টের মৌলিক কাঠামো

JUnit-এ সবচেয়ে সহজ টেস্ট হল @Test অ্যানোটেশন সহ একটি মেথড যা টেস্টের অধীনে কোড কল করে এবং একটি অ্যাসার্শন ব্যবহার করে ফলাফল যাচাই করে। যদি অ্যাসার্শন ব্যর্থ হয়, টেস্টটি ব্যর্থ বলে গণ্য হয় এবং JUnit ত্রুটি রিপোর্ট করে।

java
@Test
void additionShouldReturnCorrectSum() {
    var calculator = new Calculator();
    var result = calculator.add(2, 3);
    assertEquals(5, result);
}

Test Runner স্বয়ংক্রিয়ভাবে এমন একটি মেথড খুঁজে, এটি চালায় এবং ফলাফল রিপোর্ট করে। যদি মেথডটি কোনো ব্যতিক্রম না ফেলে — টেস্ট পাস করে (green)। যদি কোনো অ্যাসার্শন ব্যর্থ হয় — টেস্ট ফেল করে (red)।

JUnit অ্যানোটেশন: টেস্ট লাইফসাইকেল

JUnit-এ অ্যানোটেশন নির্ধারণ করে কখন এবং কীভাবে টেস্ট কোড এক্সিকিউট হবে। JUnit 5-এ, অ্যানোটেশনগুলি org.junit.jupiter.api প্যাকেজে অবস্থিত এবং সমস্ত ধাপ কভার করে: ডেটা প্রস্তুতি, টেস্ট এক্সিকিউশন, রিসোর্স ক্লিনআপ।

অ্যানোটেশনউদ্দেশ্যএক্সিকিউশন
@Testটেস্ট মেথড চিহ্নিত করেপ্রতি কল একবার
@BeforeEachপ্রতিটি টেস্টের আগে সেটআপপ্রতিটি @Test-এর আগে
@BeforeAllএকবার ক্লাস ইনিশিয়ালাইজেশনসব টেস্টের আগে একবার
@AfterEachপ্রতিটি টেস্টের পরে ক্লিনআপপ্রতিটি @Test-এর পরে
@AfterAllএকবার ক্লাস সমাপ্তিসব টেস্টের পরে একবার
@DisplayNameমানব-পাঠযোগ্য টেস্ট নামসজ্জা

অ্যানোটেশন ব্যবহারের উদাহরণ

একটি সঠিক লাইফসাইকেল সহ একটি সম্পূর্ণ টেস্ট ক্লাস বিবেচনা করুন। setUp মেথড প্রতিটি টেস্টের আগে Calculator-এর একটি নতুন ইনস্ট্যান্স তৈরি করে, এবং tearDown রিসোর্স মুক্ত করে — উদাহরণস্বরূপ, ফাইল ডিস্ক্রিপ্টর বা ডেটাবেস সংযোগ বন্ধ করা।

java
class CalculatorTest {

    private Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @Test
    void subtractionShouldReturnCorrectResult() {
        int result = calculator.subtract(10, 4);
        assertEquals(6, result);
    }

    @AfterEach
    void tearDown() {
        calculator.reset();
    }
}

অ্যাসার্শন: JUnit-এ ফলাফল যাচাই

অ্যাসার্শন হল স্ট্যাটিক মেথড যা প্রকৃত ফলাফলের সাথে প্রত্যাশিত ফলাফলের তুলনা করে এবং অমিল হলে ব্যতিক্রম ফেলে। JUnit 5 org.junit.jupiter.api.Assertions ক্লাস প্রদান করে যাতে বিভিন্ন যাচাই পরিস্থিতির জন্য 25টিরও বেশি মেথড রয়েছে — সরল মান তুলনা থেকে টাইমআউট চেক এবং গ্রুপড অ্যাসার্শন পর্যন্ত।

  • assertEquals(expected, actual) — equals()-এর মাধ্যমে সমতা যাচাই করে।
  • assertTrue(condition) — যাচাই করে যে শর্ত সত্য।
  • assertFalse(condition) — যাচাই করে যে শর্ত মিথ্যা।
  • assertNotNull(object) — যাচাই করে যে অবজেক্ট null নয়।
  • assertNull(object) — যাচাই করে যে অবজেক্ট null।
  • assertThrows(exception, executable) — যাচাই করে যে কোড নির্দিষ্ট ব্যতিক্রম ফেলে।
  • assertAll(executables) — একাধিক অ্যাসার্শনকে গ্রুপ করে এবং প্রথম ব্যর্থতায় না থামিয়ে সবগুলো এক্সিকিউট করে।

ব্যতিক্রম যাচাইয়ের জন্য assertThrows

assertThrows মেথডটি বিশেষ মনোযোগের দাবি রাখে, যা যাচাই করতে দেয় যে কোড সঠিকভাবে ত্রুটি পরিস্থিতি — শূন্য দ্বারা ভাগ, null পাস করা, সীমা অতিক্রম — পরিচালনা করে।

java
@Test
void divisionByZeroShouldThrowException() {
    Calculator calc = new Calculator();

    ArithmeticException exception = assertThrows(
        ArithmeticException.class,
        () -> calc.divide(10, 0)
    );

    assertEquals("Cannot divide by zero", exception.getMessage());
}

JUnit-এ প্যারামিটারাইজড টেস্ট

প্যারামিটারাইজড টেস্ট একই টেস্ট মেথডকে বিভিন্ন আর্গুমেন্ট সেটের সাথে চালানোর অনুমতি দেয়। JUnit 5-এ, এটি @ParameterizedTest অ্যানোটেশনকে ডেটা সোর্স — @ValueSource, @CsvSource, @MethodSource বা @EnumSource — এর সাথে সংযুক্ত করে করা হয়।

এই পদ্ধতি কোড পুনরাবৃত্তি আমূলভাবে হ্রাস করে: বিভিন্ন মানের জন্য দশটি অভিন্ন টেস্টের পরিবর্তে, একটি প্যারামিটারাইজড মেথড লেখা হয়। Google Testing Blog-এর মতে, প্যারামিটারাইজেশন কভারেজ না হারিয়ে টেস্ট কোডের পরিমাণ 40–60% কমিয়ে দেয়।

CsvSource-এর সাথে উদাহরণ

@CsvSource অ্যানোটেশন টেস্টে কমা-বিভক্ত একাধিক সারি পাঠায়। প্রতিটি সারি একটি টেস্ট রানের সাথে সঙ্গতিপূর্ণ। JUnit স্বয়ংক্রিয়ভাবে স্ট্রিং মানগুলিকে প্রয়োজনীয় টাইপে — int, long, String এবং অন্যান্য — রূপান্তর করে।

java
@ParameterizedTest
@CsvSource({
    "1,    1,   2",
    "2,    3,   5",
    "10,  20,  30",
    "-1,   1,   0"
})
void additionWithMultipleInputs(int a, int b, int expected) {
    assertEquals(expected, a + b);
}

জটিল অবজেক্টের জন্য MethodSource

যখন ইনপুট ডেটা সাধারণ সংখ্যা বা স্ট্রিংয়ের চেয়ে জটিল, তখন @MethodSource ব্যবহার করা হয়। এটি একটি স্ট্যাটিক মেথডকে রেফারেন্স করে যা আর্গুমেন্টের Stream প্রদান করে — উদাহরণস্বরূপ, Arguments-এর Stream বা DAO স্তর টেস্ট করার জন্য User অবজেক্টের Stream।

Android প্রজেক্টের সাথে JUnit-এর ইন্টিগ্রেশন

Android ডেভেলপমেন্টে, JUnit AndroidX Test-এর সাথে ব্যবহার করা হয়, যা Activity, Content Provider এবং অন্যান্য Android কম্পোনেন্ট টেস্ট করার জন্য এক্সটেনশন প্রদান করে। JUnit এমুলেটর ছাড়া JVM-এ এক্সিকিউট হওয়া ইউনিট টেস্ট পরিচালনা করে, যখন AndroidX Test ডিভাইসে ইন্সট্রুমেন্টেড টেস্ট পরিচালনা করে।

Gradle সেটআপ

Android প্রজেক্টে JUnit 5 যোগ করতে, মডিউল-স্তরের build.gradle-এ org.junit.jupiter:junit-jupiter নির্ভরতা অন্তর্ভুক্ত করা যথেষ্ট। AGP Gradle প্লাগইন স্ট্যান্ডার্ড Test Runner-এর মাধ্যমে JVM-এ JUnit 5 টেস্ট চালানো সমর্থন করে।

kotlin
// build.gradle.kts
android {
    testOptions {
        unitTests.isIncludeAndroidResources = true
    }
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
    testImplementation("androidx.test:core-ktx:1.6.1")
}

JUnit-এর সাথে ViewModel টেস্টিং

অনুশীলনে, JUnit প্রায়শই ViewModel এবং রিপোজিটরি — যে স্তরগুলির Android কনটেক্সট বা এমুলেটরের প্রয়োজন হয় না — টেস্ট করতে ব্যবহৃত হয়। এই ধরনের টেস্ট মিলিসেকেন্ডে চলে এবং সময় নষ্ট না করে শতবার এক্সিকিউট করা যায়।

  • ViewModel — অবস্থা যাচাই: লোড হচ্ছে, সফল, ত্রুটি।
  • Repository — ডেটা ম্যাপিং এবং ত্রুটি পরিচালনা যাচাই।
  • UseCase — নির্ভরতা মক সহ বিজনেস লজিক যাচাই।

JUnit 4 বনাম JUnit 5: মূল পার্থক্য

JUnit 5 (Jupiter) শুধু একটি নতুন সংস্করণ নয়, বরং সম্পূর্ণরূপে পুনর্নির্মিত একটি প্ল্যাটফর্ম যা তিনটি মডিউলে বিভক্ত: JUnit Platform (JVM-এ টেস্ট এক্সিকিউশন), JUnit Jupiter (টেস্ট লেখার জন্য API), এবং JUnit Vintage (JUnit 4-এর সাথে পশ্চাৎগামী সামঞ্জস্য)। এই মডুলারিটি বিভিন্ন Test Engine — যেমন, Kotlin-এর জন্য Spek বা TestNG — সংযোগের অনুমতি দেয়।

বৈশিষ্ট্যJUnit 4JUnit 5
প্যাকেজorg.junitorg.junit.jupiter
মূল অ্যানোটেশন@Test (junit.framework থেকে)@Test (org.junit.jupiter.api থেকে)
Before/After@Before, @After, @BeforeClass@BeforeEach, @AfterEach, @BeforeAll
প্যারামিটারাইজড@RunWith(Parameterized.class)@ParameterizedTest + @ValueSource
এক্সটেনশন@Rule, @ClassRule@ExtendWith, আরো নমনীয় API
Java ন্যূনতমJava 5Java 8+

JUnit 4 থেকে JUnit 5-এ মাইগ্রেট করতে সমস্ত টেস্ট পুনরায় লেখার প্রয়োজন নেই — শুধু JUnit Vintage Engine যোগ করুন এবং পুরানো টেস্টগুলি কাজ করতে থাকবে। নতুন টেস্টগুলি JUnit 5 দিয়ে লেখার সুপারিশ করা হয় যাতে এক্সটেনশন, ল্যাম্বডা অ্যাসার্শন এবং অন্তর্নির্মিত প্যারামিটারাইজেশন সমর্থনের সুবিধা নেওয়া যায়।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

JUnit Mockito থেকে কীভাবে আলাদা?

JUnit হল টেস্ট লেখা এবং চালানোর জন্য একটি ফ্রেমওয়ার্ক, যেখানে Mockito মক অবজেক্ট তৈরির জন্য একটি লাইব্রেরি। এগুলি একসাথে ব্যবহার করা হয়: JUnit টেস্ট এক্সিকিউশন পরিচালনা করে, এবং Mockito টেস্টের অধীনে ক্লাসের নির্ভরতা প্রতিস্থাপন করে।

Android প্রজেক্টে JUnit 5 ব্যবহার করা যায় কি?

হ্যাঁ, JUnit 5 Android প্রজেক্টের সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ। ইউনিট টেস্টের জন্য, build.gradle-এ junit-jupiter নির্ভরতা যোগ করা যথেষ্ট। ইন্সট্রুমেন্টেড টেস্ট AndroidX Test Runner-এর মাধ্যমে কাজ করতে থাকে।

একটি টেস্টের জন্য ন্যূনতম অ্যানোটেশন সেট কী?

সর্বনিম্নভাবে, মেথডের আগে একটি মাত্র @Test অ্যানোটেশন যথেষ্ট। ইনিশিয়ালাইজেশন এবং ক্লিনআপের জন্য @BeforeEach এবং @AfterEach সুপারিশ করা হয়, তবে এগুলি বাধ্যতামূলক নয়।

JUnit-এ Test Runner কী?

Test Runner হল JUnit-এর একটি কম্পোনেন্ট যা classpath স্ক্যান করে, @Test অ্যানোটেশন সহ মেথড খুঁজে, টেস্ট ক্লাসের ইনস্ট্যান্স তৈরি করে এবং টেস্ট চালায়। JUnit 5-এ, এই ভূমিকা সংযুক্ত Test Engine-সহ JUnit Platform পালন করে।

কীভাবে যাচাই করবেন যে একটি মেথড ব্যতিক্রম ফেলে?

assertThrows(Class, Executable) ব্যবহার করুন — এটি প্রত্যাশিত ব্যতিক্রম টাইপ এবং মেথড কল সহ ল্যাম্বডা নেয়। JUnit যাচাই করে যে ব্যতিক্রমটি প্রকৃতপক্ষে ফেলা হয়েছে এবং আরও পরিদর্শনের জন্য এটি ফেরত দেয়।

সারাংশ

  • JUnit হল Java এবং Kotlin-এর জন্য স্ট্যান্ডার্ড ইউনিট টেস্টিং ফ্রেমওয়ার্ক, xUnit ইকোসিস্টেমের ভিত্তি।
  • অ্যানোটেশন @Test, @BeforeEach, @AfterEach টেস্ট ক্লাসের লাইফসাইকেল পরিচালনা করে।
  • অ্যাসার্শন — assertEquals, assertTrue, assertThrows ফলাফলের সঠিকতা যাচাই করে।
  • প্যারামিটারাইজড টেস্ট @CsvSource এবং @MethodSource-এর সাথে কোড পুনরাবৃত্তি হ্রাস করে।
  • JUnit 5 — প্ল্যাটফর্ম, Jupiter API এবং এক্সটেনশন সমর্থন সহ মডুলার আর্কিটেকচার।
  • Android ইন্টিগ্রেশন — JUnit এমুলেটর ছাড়া স্ট্যান্ডার্ড Test Runner-এর মাধ্যমে JVM-এ চলে।
  • Test Runner স্বয়ংক্রিয়ভাবে @Test মেথড শনাক্ত করে ও চালায়, ফলাফল রিপোর্ট করে।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন