JUnit: یہ کیا ہے، کلیدی تصورات اور یہ کیسے کام کرتا ہے

مصنف: IT Sectr اشاعت: 2026-04-08 مطالعے کا وقت: 8 منٹ

JUnit Java اور Kotlin ماحولیاتی نظام میں یونٹ ٹیسٹنگ کے لیے ایک معیاری فریم ورک ہے، جو Android ڈیولپمنٹ میں الگ تھلگ اجزاء کی سطح پر کاروباری منطق کی تصدیق کے لیے استعمال ہوتا ہے۔ فریم ورک تشریحات، assertion طریقوں اور Test Runner کا ایک سیٹ فراہم کرتا ہے جو خود بخود ٹیسٹوں کو دریافت اور انجام دیتا ہے۔ JUnit.org کے مطابق، لائبریری JVM ماحولیاتی نظام میں یونٹ ٹیسٹنگ کے لیے سب سے مقبول حل بنی ہوئی ہے: 70% سے زیادہ Java پروجیکٹس کسی بھی ورژن میں JUnit استعمال کرتے ہیں۔

اہم نکات

  • JUnit Java اور Kotlin کوڈ کے یونٹ ٹیسٹنگ کے لیے ایک اوپن سورس فریم ورک ہے۔
  • تشریحات — @Test، @BeforeEach، @BeforeAll ٹیسٹ کلاس کے لائف سائیکل کا انتظام کرتی ہیں۔
  • Assertions — assertEquals، assertTrue، assertThrows متوقع عملدرآمد نتائج کی تصدیق کرتی ہیں۔
  • پیرامیٹرائزڈ ٹیسٹ — ایک ٹیسٹ کو ان پٹ ڈیٹا کے مختلف سیٹوں کے ساتھ چلانے کی اجازت دیتے ہیں۔
  • Test Runner — JUnit کا بنیادی ڈھانچہ خود بخود پروجیکٹ میں تمام ٹیسٹوں کو ڈھونڈتا اور چلاتا ہے۔

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 کیسے کام کرتا ہے

JUnit کے عملدرآمد کا طریقہ کار Test Runner پیٹرن پر مبنی ہے، جو classpath کو اسکین کرتا ہے، @Test تشریح والے طریقوں کو ڈھونڈتا ہے، ٹیسٹ کلاس کی ایک مثال بناتا ہے اور طریقوں کو ایک مخصوص ترتیب میں چلاتا ہے۔ Test Runner لائف سائیکل کا انتظام کرتا ہے: BeforeAll → BeforeEach → Test → AfterEach → AfterAll۔

ٹیسٹ کلاس کا لائف سائیکل

JUnit ہر ٹیسٹ طریقہ کو ایک علیحدہ کلاس مثال میں لپیٹتا ہے، جو ٹیسٹوں کے درمیان علیحدگی کو یقینی بناتا ہے۔ اس کا مطلب ہے کہ کلاس کے فیلڈز مختلف @Test طریقوں کے درمیان حالت برقرار نہیں رکھتے — ہر ٹیسٹ ایک صاف آبجیکٹ سے شروع ہوتا ہے۔

بنیادی ٹیسٹ ساخت

JUnit میں سب سے آسان ٹیسٹ ایک طریقہ ہے جس میں @Test تشریح ہوتی ہے جو ٹیسٹ کے تحت کوڈ کو کال کرتا ہے اور assertion کے ذریعے نتیجہ کی تصدیق کرتا ہے۔ اگر assertion ناکام ہو جاتا ہے تو ٹیسٹ ناکام سمجھا جاتا ہے اور JUnit غلطی کی اطلاع دیتا ہے۔

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

Test Runner خود بخود ایسے طریقہ کو ڈھونڈتا ہے، اسے چلاتا ہے اور نتیجہ کی اطلاع دیتا ہے۔ اگر طریقہ کوئی استثناء نہیں پھینکتا — ٹیسٹ پاس ہوتا ہے (green)۔ اگر کوئی assertion ناکام ہو جاتا ہے — ٹیسٹ فیل ہوتا ہے (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();
    }
}

Assertions: JUnit میں نتائج کی تصدیق

Assertions جامد طریقے ہیں جو حقیقی نتیجہ کا متوقع نتیجہ سے موازنہ کرتے ہیں اور عدم مطابقت کی صورت میں استثناء پھینکتے ہیں۔ JUnit 5 org.junit.jupiter.api.Assertions کلاس فراہم کرتا ہے جس میں مختلف تصدیقی منظرناموں کے لیے 25 سے زیادہ طریقے ہیں — سادہ قدر موازنہ سے لے کر ٹائم آؤٹ چیک اور گروپڈ assertions تک۔

  • assertEquals(expected, actual) — equals() کے ذریعے مساوات کی تصدیق کرتا ہے۔
  • assertTrue(condition) — تصدیق کرتا ہے کہ شرط درست ہے۔
  • assertFalse(condition) — تصدیق کرتا ہے کہ شرط غلط ہے۔
  • assertNotNull(object) — تصدیق کرتا ہے کہ آبجیکٹ null نہیں ہے۔
  • assertNull(object) — تصدیق کرتا ہے کہ آبجیکٹ null ہے۔
  • assertThrows(exception, executable) — تصدیق کرتا ہے کہ کوڈ ایک مخصوص استثناء پھینکتا ہے۔
  • assertAll(executables) — متعدد assertions کو گروپ کرتا ہے اور پہلی ناکامی پر رکے بغیر سب کو انجام دیتا ہے۔

استثناء کی جانچ کے لیے 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۔

JUnit کا Android پروجیکٹس کے ساتھ انضمام

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 کے ساتھ لکھنے کی سفارش کی جاتی ہے تاکہ ایکسٹینشنز، لیمبڈا assertions اور بلٹ ان پیرامیٹرائزیشن سپورٹ سے فائدہ اٹھایا جا سکے۔

اکثر پوچھے گئے سوالات

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 ٹیسٹ کلاس کے لائف سائیکل کا انتظام کرتی ہیں۔
  • Assertions — assertEquals، assertTrue، assertThrows نتائج کی درستگی کی تصدیق کرتی ہیں۔
  • پیرامیٹرائزڈ ٹیسٹ @CsvSource اور @MethodSource کے ساتھ کوڈ کی تکراری کو کم کرتے ہیں۔
  • JUnit 5 — پلیٹ فارم، Jupiter API اور ایکسٹینشن سپورٹ کے ساتھ ماڈیولر فن تعمیر۔
  • Android انضمام — JUnit بغیر ایمولیٹر کے معیاری Test Runner کے ذریعے JVM پر چلتا ہے۔
  • Test Runner خود بخود @Test طریقوں کو ڈھونڈتا اور چلاتا ہے، نتائج کی اطلاع دیتا ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں