JUnit Java اور Kotlin ماحولیاتی نظام میں یونٹ ٹیسٹنگ کے لیے ایک معیاری فریم ورک ہے، جو Android ڈیولپمنٹ میں الگ تھلگ اجزاء کی سطح پر کاروباری منطق کی تصدیق کے لیے استعمال ہوتا ہے۔ فریم ورک تشریحات، assertion طریقوں اور 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 میں سامنے آیا اور ٹیسٹ سے چلنے والی ترقی (TDD) کے طریقوں کو مقبول بنا کر ترقی کے نقطہ نظر کو یکسر تبدیل کر دیا۔ آج، JUnit 5 (Jupiter) موجودہ ورژن ہے، جو Java 8+ اور ایکسٹینشنز کو سپورٹ کرنے والے ماڈیولر فن تعمیر کے ساتھ مکمل طور پر دوبارہ ڈیزائن کیا گیا ہے۔
JUnit کے عملدرآمد کا طریقہ کار Test Runner پیٹرن پر مبنی ہے، جو classpath کو اسکین کرتا ہے، @Test تشریح والے طریقوں کو ڈھونڈتا ہے، ٹیسٹ کلاس کی ایک مثال بناتا ہے اور طریقوں کو ایک مخصوص ترتیب میں چلاتا ہے۔ Test Runner لائف سائیکل کا انتظام کرتا ہے: BeforeAll → BeforeEach → Test → AfterEach → AfterAll۔
JUnit ہر ٹیسٹ طریقہ کو ایک علیحدہ کلاس مثال میں لپیٹتا ہے، جو ٹیسٹوں کے درمیان علیحدگی کو یقینی بناتا ہے۔ اس کا مطلب ہے کہ کلاس کے فیلڈز مختلف @Test طریقوں کے درمیان حالت برقرار نہیں رکھتے — ہر ٹیسٹ ایک صاف آبجیکٹ سے شروع ہوتا ہے۔
JUnit میں سب سے آسان ٹیسٹ ایک طریقہ ہے جس میں @Test تشریح ہوتی ہے جو ٹیسٹ کے تحت کوڈ کو کال کرتا ہے اور assertion کے ذریعے نتیجہ کی تصدیق کرتا ہے۔ اگر assertion ناکام ہو جاتا ہے تو ٹیسٹ ناکام سمجھا جاتا ہے اور JUnit غلطی کی اطلاع دیتا ہے۔
@Test
void additionShouldReturnCorrectSum() {
var calculator = new Calculator();
var result = calculator.add(2, 3);
assertEquals(5, result);
}
Test Runner خود بخود ایسے طریقہ کو ڈھونڈتا ہے، اسے چلاتا ہے اور نتیجہ کی اطلاع دیتا ہے۔ اگر طریقہ کوئی استثناء نہیں پھینکتا — ٹیسٹ پاس ہوتا ہے (green)۔ اگر کوئی assertion ناکام ہو جاتا ہے — ٹیسٹ فیل ہوتا ہے (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();
}
}
Assertions جامد طریقے ہیں جو حقیقی نتیجہ کا متوقع نتیجہ سے موازنہ کرتے ہیں اور عدم مطابقت کی صورت میں استثناء پھینکتے ہیں۔ JUnit 5 org.junit.jupiter.api.Assertions کلاس فراہم کرتا ہے جس میں مختلف تصدیقی منظرناموں کے لیے 25 سے زیادہ طریقے ہیں — سادہ قدر موازنہ سے لے کر ٹائم آؤٹ چیک اور گروپڈ assertions تک۔
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 کے ساتھ لکھنے کی سفارش کی جاتی ہے تاکہ ایکسٹینشنز، لیمبڈا assertions اور بلٹ ان پیرامیٹرائزیشن سپورٹ سے فائدہ اٹھایا جا سکے۔
اکثر پوچھے گئے سوالات
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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں