JUnit হল Java এবং Kotlin ইকোসিস্টেমে ইউনিট টেস্টিংয়ের জন্য একটি স্ট্যান্ডার্ড ফ্রেমওয়ার্ক, যা Android ডেভেলপমেন্টে বিচ্ছিন্ন কম্পোনেন্টের স্তরে বিজনেস লজিক যাচাই করতে ব্যবহৃত হয়। ফ্রেমওয়ার্কটি অ্যানোটেশন, অ্যাসার্শন মেথড এবং Test Runner-এর একটি সেট প্রদান করে যা স্বয়ংক্রিয়ভাবে টেস্ট শনাক্তকরণ এবং সম্পাদন করে। JUnit.org-এর মতে, লাইব্রেরিটি JVM ইকোসিস্টেমে ইউনিট টেস্টিংয়ের জন্য সবচেয়ে জনপ্রিয় সমাধান হিসাবে রয়ে গেছে: 70%-এরও বেশি Java প্রজেক্ট যেকোনো সংস্করণে 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 এক্সিকিউশনের প্রক্রিয়া Test Runner প্যাটার্নের উপর ভিত্তি করে, যা classpath স্ক্যান করে, @Test অ্যানোটেশন সহ মেথড খুঁজে, টেস্ট ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং একটি নির্দিষ্ট ক্রমে মেথড চালায়। Test Runner লাইফসাইকেল পরিচালনা করে: BeforeAll → BeforeEach → Test → AfterEach → AfterAll।
JUnit প্রতিটি টেস্ট মেথডকে একটি পৃথক ক্লাস ইনস্ট্যান্সে মোড়ায়, যা টেস্টগুলির মধ্যে বিচ্ছিন্নতা নিশ্চিত করে। এর অর্থ হল ক্লাসের ফিল্ডগুলি বিভিন্ন @Test মেথডের মধ্যে অবস্থা ধরে রাখে না — প্রতিটি টেস্ট একটি পরিষ্কার অবজেক্ট দিয়ে শুরু হয়।
JUnit-এ সবচেয়ে সহজ টেস্ট হল @Test অ্যানোটেশন সহ একটি মেথড যা টেস্টের অধীনে কোড কল করে এবং একটি অ্যাসার্শন ব্যবহার করে ফলাফল যাচাই করে। যদি অ্যাসার্শন ব্যর্থ হয়, টেস্টটি ব্যর্থ বলে গণ্য হয় এবং JUnit ত্রুটি রিপোর্ট করে।
@Test
void additionShouldReturnCorrectSum() {
var calculator = new Calculator();
var result = calculator.add(2, 3);
assertEquals(5, result);
}
Test Runner স্বয়ংক্রিয়ভাবে এমন একটি মেথড খুঁজে, এটি চালায় এবং ফলাফল রিপোর্ট করে। যদি মেথডটি কোনো ব্যতিক্রম না ফেলে — টেস্ট পাস করে (green)। যদি কোনো অ্যাসার্শন ব্যর্থ হয় — টেস্ট ফেল করে (red)।
JUnit-এ অ্যানোটেশন নির্ধারণ করে কখন এবং কীভাবে টেস্ট কোড এক্সিকিউট হবে। JUnit 5-এ, অ্যানোটেশনগুলি org.junit.jupiter.api প্যাকেজে অবস্থিত এবং সমস্ত ধাপ কভার করে: ডেটা প্রস্তুতি, টেস্ট এক্সিকিউশন, রিসোর্স ক্লিনআপ।
| অ্যানোটেশন | উদ্দেশ্য | এক্সিকিউশন |
|---|---|---|
| @Test | টেস্ট মেথড চিহ্নিত করে | প্রতি কল একবার |
| @BeforeEach | প্রতিটি টেস্টের আগে সেটআপ | প্রতিটি @Test-এর আগে |
| @BeforeAll | একবার ক্লাস ইনিশিয়ালাইজেশন | সব টেস্টের আগে একবার |
| @AfterEach | প্রতিটি টেস্টের পরে ক্লিনআপ | প্রতিটি @Test-এর পরে |
| @AfterAll | একবার ক্লাস সমাপ্তি | সব টেস্টের পরে একবার |
| @DisplayName | মানব-পাঠযোগ্য টেস্ট নাম | সজ্জা |
একটি সঠিক লাইফসাইকেল সহ একটি সম্পূর্ণ টেস্ট ক্লাস বিবেচনা করুন। setUp মেথড প্রতিটি টেস্টের আগে Calculator-এর একটি নতুন ইনস্ট্যান্স তৈরি করে, এবং tearDown রিসোর্স মুক্ত করে — উদাহরণস্বরূপ, ফাইল ডিস্ক্রিপ্টর বা ডেটাবেস সংযোগ বন্ধ করা।
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 5 org.junit.jupiter.api.Assertions ক্লাস প্রদান করে যাতে বিভিন্ন যাচাই পরিস্থিতির জন্য 25টিরও বেশি মেথড রয়েছে — সরল মান তুলনা থেকে টাইমআউট চেক এবং গ্রুপড অ্যাসার্শন পর্যন্ত।
assertThrows মেথডটি বিশেষ মনোযোগের দাবি রাখে, যা যাচাই করতে দেয় যে কোড সঠিকভাবে ত্রুটি পরিস্থিতি — শূন্য দ্বারা ভাগ, null পাস করা, সীমা অতিক্রম — পরিচালনা করে।
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
প্যারামিটারাইজড টেস্ট একই টেস্ট মেথডকে বিভিন্ন আর্গুমেন্ট সেটের সাথে চালানোর অনুমতি দেয়। JUnit 5-এ, এটি @ParameterizedTest অ্যানোটেশনকে ডেটা সোর্স — @ValueSource, @CsvSource, @MethodSource বা @EnumSource — এর সাথে সংযুক্ত করে করা হয়।
এই পদ্ধতি কোড পুনরাবৃত্তি আমূলভাবে হ্রাস করে: বিভিন্ন মানের জন্য দশটি অভিন্ন টেস্টের পরিবর্তে, একটি প্যারামিটারাইজড মেথড লেখা হয়। Google Testing Blog-এর মতে, প্যারামিটারাইজেশন কভারেজ না হারিয়ে টেস্ট কোডের পরিমাণ 40–60% কমিয়ে দেয়।
@CsvSource অ্যানোটেশন টেস্টে কমা-বিভক্ত একাধিক সারি পাঠায়। প্রতিটি সারি একটি টেস্ট রানের সাথে সঙ্গতিপূর্ণ। JUnit স্বয়ংক্রিয়ভাবে স্ট্রিং মানগুলিকে প্রয়োজনীয় টাইপে — int, long, String এবং অন্যান্য — রূপান্তর করে।
@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 ব্যবহার করা হয়। এটি একটি স্ট্যাটিক মেথডকে রেফারেন্স করে যা আর্গুমেন্টের Stream প্রদান করে — উদাহরণস্বরূপ, Arguments-এর Stream বা DAO স্তর টেস্ট করার জন্য User অবজেক্টের Stream।
Android ডেভেলপমেন্টে, JUnit AndroidX Test-এর সাথে ব্যবহার করা হয়, যা Activity, Content Provider এবং অন্যান্য Android কম্পোনেন্ট টেস্ট করার জন্য এক্সটেনশন প্রদান করে। JUnit এমুলেটর ছাড়া JVM-এ এক্সিকিউট হওয়া ইউনিট টেস্ট পরিচালনা করে, যখন AndroidX Test ডিভাইসে ইন্সট্রুমেন্টেড টেস্ট পরিচালনা করে।
Android প্রজেক্টে JUnit 5 যোগ করতে, মডিউল-স্তরের build.gradle-এ org.junit.jupiter:junit-jupiter নির্ভরতা অন্তর্ভুক্ত করা যথেষ্ট। AGP Gradle প্লাগইন স্ট্যান্ডার্ড Test Runner-এর মাধ্যমে JVM-এ JUnit 5 টেস্ট চালানো সমর্থন করে।
// 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 এবং রিপোজিটরি — যে স্তরগুলির Android কনটেক্সট বা এমুলেটরের প্রয়োজন হয় না — টেস্ট করতে ব্যবহৃত হয়। এই ধরনের টেস্ট মিলিসেকেন্ডে চলে এবং সময় নষ্ট না করে শতবার এক্সিকিউট করা যায়।
JUnit 5 (Jupiter) শুধু একটি নতুন সংস্করণ নয়, বরং সম্পূর্ণরূপে পুনর্নির্মিত একটি প্ল্যাটফর্ম যা তিনটি মডিউলে বিভক্ত: JUnit Platform (JVM-এ টেস্ট এক্সিকিউশন), JUnit Jupiter (টেস্ট লেখার জন্য API), এবং JUnit Vintage (JUnit 4-এর সাথে পশ্চাৎগামী সামঞ্জস্য)। এই মডুলারিটি বিভিন্ন Test Engine — যেমন, Kotlin-এর জন্য Spek বা TestNG — সংযোগের অনুমতি দেয়।
| বৈশিষ্ট্য | JUnit 4 | JUnit 5 |
|---|---|---|
| প্যাকেজ | org.junit | org.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 5 | Java 8+ |
JUnit 4 থেকে JUnit 5-এ মাইগ্রেট করতে সমস্ত টেস্ট পুনরায় লেখার প্রয়োজন নেই — শুধু JUnit Vintage Engine যোগ করুন এবং পুরানো টেস্টগুলি কাজ করতে থাকবে। নতুন টেস্টগুলি JUnit 5 দিয়ে লেখার সুপারিশ করা হয় যাতে এক্সটেনশন, ল্যাম্বডা অ্যাসার্শন এবং অন্তর্নির্মিত প্যারামিটারাইজেশন সমর্থনের সুবিধা নেওয়া যায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
JUnit হল টেস্ট লেখা এবং চালানোর জন্য একটি ফ্রেমওয়ার্ক, যেখানে Mockito মক অবজেক্ট তৈরির জন্য একটি লাইব্রেরি। এগুলি একসাথে ব্যবহার করা হয়: JUnit টেস্ট এক্সিকিউশন পরিচালনা করে, এবং Mockito টেস্টের অধীনে ক্লাসের নির্ভরতা প্রতিস্থাপন করে।
হ্যাঁ, JUnit 5 Android প্রজেক্টের সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ। ইউনিট টেস্টের জন্য, build.gradle-এ junit-jupiter নির্ভরতা যোগ করা যথেষ্ট। ইন্সট্রুমেন্টেড টেস্ট AndroidX Test Runner-এর মাধ্যমে কাজ করতে থাকে।
সর্বনিম্নভাবে, মেথডের আগে একটি মাত্র @Test অ্যানোটেশন যথেষ্ট। ইনিশিয়ালাইজেশন এবং ক্লিনআপের জন্য @BeforeEach এবং @AfterEach সুপারিশ করা হয়, তবে এগুলি বাধ্যতামূলক নয়।
Test Runner হল JUnit-এর একটি কম্পোনেন্ট যা classpath স্ক্যান করে, @Test অ্যানোটেশন সহ মেথড খুঁজে, টেস্ট ক্লাসের ইনস্ট্যান্স তৈরি করে এবং টেস্ট চালায়। JUnit 5-এ, এই ভূমিকা সংযুক্ত Test Engine-সহ JUnit Platform পালন করে।
assertThrows(Class, Executable) ব্যবহার করুন — এটি প্রত্যাশিত ব্যতিক্রম টাইপ এবং মেথড কল সহ ল্যাম্বডা নেয়। JUnit যাচাই করে যে ব্যতিক্রমটি প্রকৃতপক্ষে ফেলা হয়েছে এবং আরও পরিদর্শনের জন্য এটি ফেরত দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন