Teste og videreutvikle DSL-er uten å bryte brukere
Utform stabile DSL-API-er, og test dem med lettleste blokker med assertions.
Teste og videreutvikle DSL-er uten å bryte brukere er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hvorfor testing av DSL-er er annerledes
En DSL er et offentlig API. Endringer i den kan bryte alle kallesteder i brukerkoden. Testing av en DSL innebærer å kontrollere både resultatet den produserer, og strukturen den håndhever – inkludert at ugyldige konstruksjoner fortsatt gir kompileringsfeil.
Testing av DSL-resultatet
Den enkleste testen er å bygge et objekt ved hjelp av DSL-en og kontrollere det gjengitte resultatet eller builderens interne tilstand.
@Test
fun `div contains a paragraph`() {
val result = html {
body {
div { p("Hi") }
}
}
assertTrue(result.render().contains("<p>"))
}Testing av builder-tilstand
I stedet for å teste den gjengitte strengen kan objektgrafen til builderen testes direkte. Dette gjør testen mer robust mot formateringsendringer:
@Test
fun `server config has correct port`() {
val cfg = server {
host = "example.com"
port = 9090
}
assertEquals(9090, cfg.port)
assertEquals("example.com", cfg.host)
}Testing av nestede strukturer
Gå gjennom objekttreet for å kontrollere nestingsforholdene:
@Test
fun `body contains one div`() {
val page = html { body { div { } } }
assertEquals(1, page.children
.filterIsInstance<Body>().first()
.children.filterIsInstance<Div>().size
)
}Testing av kompileringsfeil
Kompileringsfeil kan ikke enhetstestes direkte, men det kan legges til kommentarer som // This should NOT compile med koden som feiler, kommentert ut. Noen prosjekter bruker biblioteket Kotlin Compile Testing for å kontrollere at bestemt kode IKKE kompileres.
Trygg videreutvikling av en DSL: Tilleggsendringer
Det er bakoverkompatibelt å legge til nye valgfrie parametere med standardverdier eller nye builder-funksjoner. Eksisterende kallesteder kompileres uten endringer.
// Before
fun server(block: ServerConfig.() -> Unit): ServerConfig
// After — additive: new optional feature
fun server(enableMetrics: Boolean = false, block: ServerConfig.() -> Unit): ServerConfigBrytende endring: Fjerning eller omdøping
Fjerning eller omdøping av en DSL-funksjon bryter kallesteder. Hvis en funksjon må få nytt navn, kan det tilbys et foreldet alias som fjernes i en fremtidig hovedversjon:
@Deprecated("Use database{} instead", ReplaceWith("database(block)"))
fun db(block: DbConfig.() -> Unit) = database(block)Versjonering av DSL-en
Følg semantisk versjonering for DSL-er i biblioteker. Brytende DSL-endringer, som fjernede funksjoner eller endrede receivertyper, krever en økning av hovedversjonen. Dokumenter dem i en endringslogg.
Bruk av @RequiresOptIn for eksperimentelle DSL-funksjoner
Merk ustabile DSL-utvidelser med @RequiresOptIn. Brukere må aktivere dem eksplisitt, slik at de ikke utilsiktet blir avhengige av funksjoner som kan endres:
@RequiresOptIn(message = "This DSL feature is experimental and may change")
annotation class ExperimentalDsl
@ExperimentalDsl
fun ServerConfig.enableDebug() { /*...*/ }Egenskapsdelegering i DSL-er
DSL-er kan bruke egenskapsdelegering til å håndheve obligatoriske felt og gi tydelige feilmeldinger når en obligatorisk verdi mangler:
class Required<T> {
private var value: T? = null
operator fun getValue(t: Any?, p: KProperty<*>): T = value ?: error("${p.name} is required")
operator fun setValue(t: Any?, p: KProperty<*>, v: T) { value = v }
}Kontrakttesting på tvers av versjoner
Behold et sett med «golden»-kodeutdrag for DSL-bruk som tester. Hvis en refaktorering bryter dem, oppdager testpakken det før brukerne gjør det. Utdragene fungerer også som levende dokumentasjon.
Rask kontroll
Hva er den tryggeste typen DSL-endring når bakoverkompatibilitet skal bevares?
Oppsummering: Testing og videreutvikling av DSL-er
Viktigste punkter:
- Test DSL-resultatet og tilstanden til builder-objektet i enhetstester
- Tilleggsendringer, som nye valgfrie funksjoner eller parametere, er trygge
- Bruk
@Deprecated(ReplaceWith=...)for å endre navn uten å bryte brukerne - Bruk
@RequiresOptInfor eksperimentelle DSL-funksjoner - Behold tester med «golden»-bruk for å oppdage regresjoner på tvers av versjoner
Lær deg Kotlin med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «Teste og videreutvikle DSL-er uten å bryte brukere» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Teste og videreutvikle DSL-er uten å bryte brukere», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Teste og videreutvikle DSL-er uten å bryte brukere»?
Utform stabile DSL-API-er, og test dem med lettleste blokker med assertions. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Kotlin Academy?
Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Teste og videreutvikle DSL-er uten å bryte brukere»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?
Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Lambda med mottaker: Grunnlaget for DSL-er
- @DslMarker: Hindre lekkasje av mottakere
- Bygge en typesikker HTML-/Config-DSL
- Teste og videreutvikle DSL-er uten å bryte brukere