এই নিবন্ধে, আমরা কীভাবে একটি Gradle প্লাগইনের জন্য শক্তিশালী ভিত্তি তৈরি করবেন টেস্ট-ড্রিভেন ডেভেলপমেন্ট (TDD - টেস্ট-ড্রিভেন ডেভেলপমেন্ট) পদ্ধতির মাধ্যমে দেখব। এই পদ্ধতিটি নিশ্চিত করে যে আমাদের কোড দৃঢ়, রক্ষণযোগ্য এবং শুরু থেকেই প্রয়োজনীয়তাগুলোকে সঠিকভাবে পূরণ করে।

প্রকল্পের প্রারম্ভণ

Gradle কমান্ডের সাহায্যে একটি নতুন প্লাগইন তৈরি খুবই সহজ করে।gradle init. কোটলিন দিয়ে একটি "Gradle Plugin" তৈরি করলে, আমরা একটি প্রস্তুত ব্যবহারযোগ্য প্রকল্পের গঠন পাই, যা দুটি গুরুত্বপূর্ণ ধরনের পরীক্ষা অন্তর্ভুক্ত করে :

  • একক পরীক্ষা :অবস্থিত`src/test`, তারা আমাদের প্লাগ인의 পৃথক উপাদানগুলো যাচাই করতে সক্ষম করে, যেমন একটি টাস্কের ভিতরের লজিক বা একটি এক্সটেনশন কনফিগারেশন। তারা দ্রুত এবং সম্পূর্ণ Gradle চালানোর প্রয়োজন নেই।

  • ফাংশনাল পরীক্ষা :বসিত`src/functionalTest`, তারা ব্যবহার করে`GradleRunner`একটি পূর্ণ Gradle বিল্ড চালু করার জন্য একটি অস্থায়ী টেস্ট প্রকল্পে। এটি আমাদেরকে একটি নিয়ন্ত্রিত পরিবেশে প্লাগইনের বাস্তব আচরণ যাচাই করার অনুমতি দেয়।

2. আমাদের প্রথম TDD চক্র: একটি কাজ রেকর্ড করা

আমাদের প্রথম প্রয়োজনীয়তা হলো সহজ: প্লাগইনটিকে একটি নামযুক্ত কাজ নথিভুক্ত করতে হবে।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`পরীক্ষাটি পাস হওয়ার জন্য:

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 এক্সটেনশন যোগ করুন

পরের_required হল ব্যবহারকারীদেরকে আমাদের প্লাগইন একটি DSL ব্লক ব্যবহার করে তাদের মধ্যে কনফিগারারের অনুমতি দেওয়া।build.gradle.kts. আমরা একটি ব্লক চাই`site { …​ }`যেখানে কনফিগারেশন পথ নির্দিষ্ট করা যায়।

3.1. প্রথম টেস্ট

আমরা এক্সটেনশনটি যাচাই করার জন্য একটি পরীক্ষা যোগ করছি`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`এক্সটেনশন রেজিস্ট্রেশনও বিদ্যমান নেই।

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`.

৪.১. একীভূত পরীক্ষা : নিয়ন্ত্রিত পরিবেশ তৈরি করুন

এই টেস্টটি আমাদের প্লাগইন ব্যবহার করে একটি প্রকৃত প্রকল্পকে অনুকরণ করবে। যোতে এটি বিশ্বাসনীয় হয়, তা হতে হবেঅব্যাহতি, অর্থাৎ, এটি সিস্টেমে বিদ্যমান ফাইলগুলের উপর নির্ভর করতে হবে না। এটি নিজেই তার নিষ্পাদনের জন্য প্রয়োজনীয় সব শর্ত তৈরি করতে হবে।

এটি পরীক্ষা তাহলে:

  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 কনফিগারেশন ফাইলের পার্সিংের মতো জটিল কার্যকারিতা যোগ করার জন্য আমাকে গরবময় বিশ্বাস দেয়।

এই দৃঢ় পরীক্ষার ভিত্তি প্লাগইনকে বজায় রাখা ও ভবিষ্যতে উন্নয়নের জন্য সবচেয়ে মূল্যবান সম্পদ।

Articles connexes