اس مضامین میں، ہم جانگے کہ Gradle پلاگائن کے لیے مضبوط ڈویلپمنٹ بنیاد کیسے تیار کی جاتی ہے، جسے ٹیسٹ-محور ڈیولپمنٹ (TDD - Test-Driven Development) کے اندراج کے ذریعے استعمال کیا جاتا ہے۔ یہ طریقہ ہمیں یقین دلاتا ہے کہ ہمارا کوڈ مضبوط، قابلِ مرمت ہے اور شروع سے ہی ضروریات کو پوری طرح پورا کرتا ہے۔

پروجیکٹ کی ابتدائی

Gradle نے ایک کمانڈ کے ذریعے ایک نئے پلاگین کی بنائیت کو زیادہ آسان کردیا ہے`gradle init`ایک 'Gradle Plugin' بنانے کا انتخاب کرنے سے Kotlin کے ساتھ، ہم تیار استعمال ہونے والے پروژیکٹ کی ساخت حاصل کرتے ہیں، جس میں دو اہم قسم کے ٹیسٹ شامل ہیں:

  • واحدی ٹیسٹ :میں واقع`src/test`, وہ ہماری پلاگین کے الگ-الگ اجزاء کی تصدیق کرنے میں مدد دیتے ہیں، جیسے کسی کام کی اندرونی logique یا ایک extension کی تنظیم۔ وہ جلدی ہیں اور pôrī Gradle تنفیذ کی ضرورت نہیں ہے۔

  • فنکشنل ٹیسٹز:موجود میں`src/functionalTest`, وہ استعمال کرتے ہیں`GradleRunner`ایک provisional test project میں پوری گریڈل بِلڈ چلانے کیلے. یہ ہم کنٹرولڈ ماحول میں پلاگ ان کی واقعی سلوک جانچنے کی اجازت دیتا ہے

2. ہماری پہلی TDD سikl : ایک کام ریکارڈ کریں

ہماری پہلی ضرورت سادہ ہے: پلاگ ان کو ایک نامیدة ٹسک ریکارڈ کرنا ہوگا`printSiteConfig`.

2.1. پہلا ٹیسٹ (ناکام ٹیسٹ)

TDD کے مطابق، ہم سب سے پہلے ٹیسٹ لکھتے ہیں جو اس کام کی موجودگی کا تجزیہ کرتا ہے۔ میں`SiteBakerPluginTest.kt`(ہماری یونٹ ٹیسٹ فائل)، ہم شامل کرتے ہیں:

@Test
fun `plugin registers task`() {
    // Créer un projet de test en mémoire
    val project = ProjectBuilder.builder().build()
    project.plugins.apply("com.cheroliv.site-baker")

    // Vérifier que la tâche a bien été enregistrée
    assertNotNull(project.tasks.findByName("printSiteConfig"))
}

یہ ٹیسٹ لہٰزہ ہے، کیونکہ ہم ابھی تک اپنے پلاگ ان میں کوئی کوڈ نہیں لکھے ہیں۔

2.2. بعد ذلك کوڈ (ٹیسٹ پاس کرنے کے لئے)

حالی میں، ہم ضرورت کے مطابق سب سے کم کد لکھ رہے ہیں داخل`SiteBakerPlugin.kt`تا کہ ٹیسٹ passages ہو جائے:

class SiteBakerPlugin: Plugin<Project> {
    override fun apply(project: Project) {
        // Enregistrer une tâche simple
        project.tasks.register("printSiteConfig") { task ->
            // ... la logique de la tâche viendra plus tard
        }
    }
}

ہم ٹیسٹس دوبارہ چلاتے ہیں، اور وہ کامیاب ہو جاتے ہیں۔ ہماری پہلی فیچر تصدیق کردہ ہے۔

3. دورہ دوم TDD : ایک DSL ای็กسٹنشن شامل کریں

اگلا شرط استعمال کرنے والوں کو ہمارے پلاگین کو DSL بلاک کے ذریعےconfigure کرنے کی اجازت دینا ہے ان کے`build.gradle.kts`. ہم ایک بلوک چاہتے ہیں`site { …​ }`جہاں کسی تنظیم کا راستہ محدد کیا جا سکتا ہے

3.1. پہلا ٹیسٹ

ہم ایک ٹیسٹ شامل کر رہے ہیں تا extension کی جانچ کی جا سکے`site`یہ اچھی طرح سے ریکارڈ کی گئی ہے اور اس پر ایک قدر مقرر کر سکتے ہیں۔

@Test
fun `plugin registers extension`() {
    val project = ProjectBuilder.builder().build()
    project.plugins.apply("com.cheroliv.site-baker")

    // Récupérer l'extension et lui affecter une valeur
    project.extensions
        .findByType(SiteExtension::class.java)!!
        .configPath
        .set("config.yml")

    // Vérifier que la valeur a bien été prise en compte
    assertEquals(
        "config.yml",
        project.extensions.findByType(SiteExtension::class.java)?.configPath?.get()
    )
}

یہ ٹیسٹ ناكام ہوتا ہے کیونکہ نہ کلاس`SiteExtension`او extension کی درج نہیں ہے۔

3.2. کوڈ بعد میں

ہم کلاس …​ بنا رہے ہیں`SiteBakerExtension.kt`اور اپ ڈیٹ کرتے ہیں`SiteBakerPlugin.kt`براہ کرم فراہم کردہ متن دیں جسے آپ ترجمہ کرنا چاہتے ہیں۔

// SiteBakerExtension.kt
open class SiteExtension @Inject constructor(objects: ObjectFactory) {
    val configPath: Property<String> = objects.property(String::class.java)
}

// SiteBakerPlugin.kt
class SiteBakerPlugin: Plugin<Project> {
    override fun apply(project: Project) {
        // Enregistrer l'extension
        val extension = project.extensions.create("site", SiteExtension::class.java)

        project.tasks.register("printSiteConfig") { task ->
            task.doLast {
                // On utilisera l'extension plus tard
            }
        }
    }
}

ٹیسٹس دوبارہ پاس ہو رہے ہیں۔

4. فونکشنل ٹیسٹ: انٹیگریٹی کی تصدیق

اب یونٹس ٹیسٹ ہو چکے ہیں، ہمیں یقینی بنانا چاہیے کہ سب چیز ایک ساتھ سچائی بنڈ میں کام کرے۔ یہ فنگیشنل ٹیسٹ کا کردار میں`SiteBakerPluginFunctionalTest.kt`.

4.1. انٹیگریشن ٹیسٹ : کنٹرولڈ ماحول بنائیں

یہ ٹیسٹ ہمارے پلاگ ان استعمال کرنے والے اصل پروگرام کا ایک سیمیولیشن کرے گا۔ اس کو اعتماد سے بنانے کے لیے, اسے ہونا چاہیےہawa band, یعنی، اس کو موجودہ فائلوں پر نظام سے مستقل ہونا چاہیے۔ اس کو خود تمام ضروری شرائط بنانی چاہیے جو اس کی chalani ke liye larazmi ہیں۔

تست لہٰذا :

  1. ایک بنائیں`build.gradle.kts`ٹیسٹ کا جو ہمارے پلگ ان اور اس کی DSL کو استعمال کرتا ہے۔

  2. کنفیگریشن فائل بنائیں(managed-jbake-context.yml) جو پلگ ان کو پڑھنا چاہیے ہے۔ یہ ٹیسٹ کی مضبوطی کے لیے ایک اہم مرحلہ ہے۔

  3. ٹاسک چلائیں`printSiteConfig`کے ذریعے`GradleRunner`براہ کرم ترجمہ کے لیے متن فراہم کریں۔

  4. تصدیق کریں کہ بلڈ کا آؤٹ پٹ درست ہے۔

ہر بار اس فائل کی کنفیگری کو نکال کر یا بنانے سے، ہم یقینی بناتے ہیں کہ ٹیسٹ ہےقابل بازآمداور بیرونی حالت پر منحصر نہیں ہے۔ یہ ہماری ٹیسٹس کو فائل کی پڑھنے سے متعلق ہو سکتی رجعیاں سے محفوظ رکھتا ہے۔

@Test fun `can run task with DSL`() {
    // 1. Créer un build.gradle.kts de test
    buildFile.writeText("""
        plugins { id("com.cheroliv.site-baker") }
        site { configPath = "managed-jbake-context.yml" }
    """.trimIndent())

    // 2. Créer le fichier de configuration pour un test contrôlé
    val configFile = File(projectDir, "managed-jbake-context.yml")
    configFile.writeText("site: { title: 'Mon Site de Test' }") // Contenu YAML simple

    // 3. Exécuter la build
    val runner = GradleRunner.create()
    runner.withPluginClasspath()
    runner.withArguments("printSiteConfig")
    runner.withProjectDir(projectDir) // Spécifier le répertoire du projet de test
    val result = runner.build()

    // 4. Vérifier la sortie
    assertTrue(result.output.contains("Site config path: managed-jbake-context.yml"))
}

یہ ٹیسٹ ناکام ہوگا جب تک کام`printSiteConfig`یہ ایکسٹنشن کی قدر واقعاً استعمال نہیں کرے گا۔

4.2. منطق کو مکمل کریں

ہم اپ ڈیٹ کر رہے ہیں کام میں`SiteBakerPlugin.kt`تاکہ وہ سیٹ شدہ قیمت دکھائے :

project.tasks.register("printSiteConfig") { task ->
    task.doLast {
        println("Site config path: ${extension.configPath.get()}")
    }
}

سب ٹیسٹس، یونٹری اور فنکشنل، اب پاس ہو جاتے ہیں۔

نتیجہ

TDD کے متبا میں ہم نے ایک پلاگ‑ایَن انکریمنٹل اور محفوظ طور پر بنایا۔ ہر چھوٹی فیچر فوراً ایک ٹست سے تصدیق کر دی جاتی ہے۔ تیز یونٹ ٹستس سے مکمل فنکشنل ٹستس تک جو پوری انٹیگریشن کی تصدیق کرتے ہیں۔

اپنے ٹیسٹس کو فنگکشنل بنانے میں احتیاط برتہمحكم— خاص طور پر پروگرام کے ذریعے ضروری کنفیگریشن فائلوں کو بناتے ہوئے — ہم ایک بہت مضبوط حفاظت کا جال بناتے ہیں۔ یہ سختی ہمیں واپسی سے مؤثر طور پر حفاظت کرتی ہے اور ہمیں بڑا اعتماد دیتی ہے کہ ہم بعد میں زیادہ پیچیدہ فیچرز شامل کر سکے، جیسے YAML کنفیگریشن فائل کا پارسنگ۔

یہ مضبوط ٹیسٹ کی بنیاد، plugin کے لیے نگہداشت اور مستقبل کی ترقی کے سب سے زیادہ قیمتی سامپٹی ہے۔

متعلقہ مضامین