Mestrer test: JUnit, Mockito og integrationstest · Lektion

Parametriserede og dynamiske tests

Skriv effektive tests, der køres med flere datasæt ved hjælp af parametriserede tests, og generér tests dynamisk under kørsel.

Lektion 2 af 412 trin

Parametriserede og dynamiske tests er en gratis Mestrer test: JUnit, Mockito og integrationstest-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Mestrer test: JUnit, Mockito og integrationstest, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Introduktion til datadrevet test

Forestil dig, at du skal teste en funktion med mange forskellige input. Det kan være besværligt og ensformigt at skrive en separat test for hvert input.

Datadrevet test giver dig mulighed for at køre den samme testlogik flere gange, men med forskellige datasæt for hver kørsel. Det gør dine test mere effektive og nemmere at vedligeholde.

Hvad er parameteriserede test?

Parametriserede tests i JUnit 5 lader dig skrive én enkelt testmetode, som kan køres flere gange med forskellige argumenter. I stedet for at kopiere og indsætte testkode angiver du dataene, og JUnit håndterer gentagelserne.

  • Sparer tid og reducerer standardkode.
  • Forbedrer testdækningen ved at gøre det nemt at teste kanttilfælde.
  • Gør tests mere læsbare og nemmere at vedligeholde.

Brug af @ParameterizedTest

For at oprette en parametriseret test bruger du annoteringen @ParameterizedTest i stedet for @Test. Du skal også angive en kilde til argumenterne.

JUnit 5 tilbyder flere argumentkilder, f.eks. @ValueSource til enkeltstående argumenter eller @CsvSource til flere argumenter. Lad os først se på @ValueSource.

Simple data med @ValueSource

Annoteringen @ValueSource er perfekt til at levere simple primitive datatyper direkte i din test. Den understøtter strings, ints, longs, doubles og meget mere.

Hver værdi i kilden får testmetoden til at køre én gang med denne værdi som argument.

@ValueSource i praksis

Her er et enkelt eksempel, hvor vi tester, om strings hverken er null eller tomme. Bemærk, hvordan testmetoden modtager en String-parameter.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class StringValidatorTest {

    @ParameterizedTest
    @ValueSource(strings = {"apple", "banana", "orange"})
    void testStringsAreNotEmpty(String fruit) {
        Assertions.assertNotNull(fruit);
        Assertions.assertFalse(fruit.isEmpty());
    }
}

Flere argumenter med @CsvSource

Når din testmetode har brug for mere end ét argument, er @CsvSource praktisk. Den lader dig definere argumenter som kommaseparerede værdier (CSV).

Hver streng i arrayet @CsvSource repræsenterer en datarække, og værdierne opdeles ved kommaer, så de matcher testmetodens parametre.

@CsvSource i praksis

Lad os teste en simpel additionsfunktion. Hver linje i @CsvSource angiver to tal og deres forventede sum.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class CalculatorTest {

    // Simple method to simulate
    int add(int a, int b) {
        return a + b;
    }

    @ParameterizedTest
    @CsvSource({"1, 1, 2", "2, 3, 5", "5, 0, 5"})
    void testAddMethod(int a, int b, int expectedSum) {
        Assertions.assertEquals(expectedSum, add(a, b));
    }
}

Generering af dynamiske tests

Nogle gange kendes testdataene eller endda antallet af tests først under kørsel. Det er her, dynamiske tests virkelig er nyttige!

I stedet for at definere alle tests på kompileringstidspunktet lader dynamiske tests dig generere dem programmatisk under testkørslen. Det er nyttigt i komplekse scenarier eller med eksterne datakilder.

@TestFactory og DynamicTest

For at oprette dynamiske tests bruger du annoteringen @TestFactory. En metode, der er annoteret med @TestFactory, kører ikke selv en test, men producerer i stedet en samling af DynamicTest-instanser.

  • Metoder med @TestFactory skal returnere en Stream, Collection, Iterable eller Iterator af DynamicTest.
  • Hver DynamicTest-instans har et visningsnavn og en eksekverbar lambda.

Dynamisk test i praksis

Her er et eksempel, der genererer tests for strenglængder. Hver test oprettes undervejs ud fra en liste med ord.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;

import java.util.Arrays;
import java.util.Collection;

class DynamicTestExample {

    @TestFactory
    Collection<DynamicTest> dynamicTestsFromCollection() {
        return Arrays.asList(
            DynamicTest.dynamicTest("Test 'apple' length",
                () -> Assertions.assertEquals(5, "apple".length())),
            DynamicTest.dynamicTest("Test 'banana' length",
                () -> Assertions.assertEquals(6, "banana".length())),
            DynamicTest.dynamicTest("Test 'cat' length",
                () -> Assertions.assertEquals(3, "cat".length()))
        );
    }
}

Parametriserede kontra dynamiske tests

Parametriserede og dynamiske tests hjælper begge med at reducere standardkode, men de løser forskellige behov.

Hvad er den primære fordel ved at bruge parametriserede tests frem for at skrive individuelle @Test-metoder til lignende testtilfælde?

Opsummering: Fleksibel testning

Godt gået! Du har lært, hvordan du gør dine JUnit-tests mere fleksible og effektive:

  • Parametriserede tests (@ParameterizedTest med kilder som @ValueSource og @CsvSource) lader dig køre den samme testlogik med flere foruddefinerede datasæt.
  • Dynamiske tests (@TestFactory) lader dig generere tests programmatisk under kørsel, hvilket er ideelt i scenarier, hvor testtilfælde opdages dynamisk.

Disse funktioner hjælper dig med at skrive renere og mere omfattende tests med mindre indsats!

Gratis at komme i gang

Lær Mestrer test: JUnit, Mockito og integrationstest med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Parametriserede og dynamiske tests” gratis?

Ja — alle 3 lektioner i læringssporet Mestrer test: JUnit, Mockito og integrationstest, inklusive “Parametriserede og dynamiske tests”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Parametriserede og dynamiske tests”?

Skriv effektive tests, der køres med flere datasæt ved hjælp af parametriserede tests, og generér tests dynamisk under kørsel. Du øver dig i Mestrer test: JUnit, Mockito og integrationstest med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Mestrer test: JUnit, Mockito og integrationstest?

Der kræves ingen tidligere erfaring. Mestrer test: JUnit, Mockito og integrationstest på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Parametriserede og dynamiske tests”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Mestrer test: JUnit, Mockito og integrationstest-lektion?

Ja. Alle Mestrer test: JUnit, Mockito og integrationstest-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Testlivscyklus og rækkefølge
  2. Parametriserede og dynamiske tests
  3. Test af exceptions og timeouts
  4. Betingede tests og assumptions
← Tilbage til Mestrer test: JUnit, Mockito og integrationstest