Java Academy · Lektion

Parametriserade tester med @CsvSource och @MethodSource

Kör samma test med flera uppsättningar indata med @ParameterizedTest, @CsvSource och @MethodSource.

Lektion 1 av 413 steg

Parametriserade tester med @CsvSource och @MethodSource är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Varför parameteriserade tester?

Genom att köra samma testlogik med flera uppsättningar indata hittar du gränsfall utan att kopiera testmetoder. JUnit 5 har inbyggt stöd för parameteriserade tester med @ParameterizedTest.

@ValueSource: Enkla tester med ett värde

@ValueSource tillhandahåller en parameter av en viss typ. Testet körs en gång per värde.

@ParameterizedTest
@ValueSource(strings = {"", "  ", "\t"})
void blank_strings_are_rejected(String input) {
    assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}

@CsvSource: Flera parametrar direkt i koden

@CsvSource tillhandahåller rader med kommaseparerade värden. Varje rad motsvarar en testkörning. Använd enkla citattecken för att hantera kommatecken i strängvärden.

@ParameterizedTest
@CsvSource({
    "Alice, 30, true",
    "Bob,   17, false",
    "Carol, 0,  false"
})
void test_adult_check(String name, int age, boolean expectedAdult) {
    User user = new User(name, age);
    assertEquals(expectedAdult, user.isAdult());
}

@CsvSource med delimiterString

Använd delimiterString för avgränsare med flera tecken eller när dina data innehåller kommatecken. Använd nullValues för att mappa en speciell sträng till null.

@ParameterizedTest
@CsvSource(value = {
    "Alice | 30 | ADMIN",
    "Bob   | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }

@CsvFileSource: Externa datafiler

Läs in testdata från en CSV-fil i classpath. Det är användbart för stora datamängder som annars skulle göra testkoden svåröverskådlig.

@ParameterizedTest
@CsvFileSource(resources = "/test-data/users.csv", numLinesToSkip = 1)
void test_from_file(String name, int age, boolean expected) {
    assertEquals(expected, service.isEligible(name, age));
}

@MethodSource: Komplexa parametrar

@MethodSource anropar en statisk fabriksmetod som returnerar en Stream<Arguments>. Varje Arguments.of() motsvarar en testkörning. Använd detta för komplexa objekt.

@ParameterizedTest
@MethodSource("provideOrders")
void test_total_calculation(Order order, BigDecimal expected) {
    assertEquals(expected, orderService.calculateTotal(order));
}
static Stream<Arguments> provideOrders() {
    return Stream.of(
        Arguments.of(new Order(List.of(item(10), item(20))), BigDecimal.valueOf(30)),
        Arguments.of(new Order(List.of()),                   BigDecimal.ZERO)
    );
}

@EnumSource: Testa alla enumvärden

@EnumSource kör testet en gång för varje enumkonstant. Använd mode och names för att inkludera eller exkludera specifika värden.

@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
    assertTrue(notificationService.shouldNotify(status));
}

@NullAndEmptySource

En kortform för att testa indata som är null eller tomma strängar. Kombinera med @ValueSource genom att använda @NullSource och @EmptySource, eller använd den kombinerade @NullAndEmptySource.

@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
    assertFalse(validator.isValid(input));
}

Anpassade visningsnamn

Använd name i @ParameterizedTest för att formatera testets visningsnamn. Platshållare: {index}, {0}, {1}, {arguments}.

@ParameterizedTest(name = "age={1} should be adult={2}")
@CsvSource({"Alice, 30, true", "Bob, 17, false"})
void test_adult(String name, int age, boolean expected) { ... }

Kombinera källor med @ArgumentsSource

Implementera ArgumentsProvider för helt anpassad argumentgenerering – dynamiska data från databaser, filer eller API:er.

public class UserArgumentsProvider implements ArgumentsProvider {
    public Stream<? extends Arguments> provideArguments(ExtensionContext ctx) {
        return Stream.of(
            Arguments.of(new User("Alice", 30)),
            Arguments.of(new User("Bob", 17))
        );
    }
}
@ParameterizedTest
@ArgumentsSource(UserArgumentsProvider.class)
void test_user(User user) { ... }

Parameteriserade tester för gränsvärden

Testa systematiskt gränsvillkor: min-1, min, max, max+1. Parameteriserade tester gör täckningen av gränsvärden lättläst och underhållbar.

@ParameterizedTest
@CsvSource({"0, false", "1, true", "100, true", "101, false"})
void test_range_boundaries(int value, boolean expected) {
    assertEquals(expected, validator.isInRange(value, 1, 100));
}

Snabbkontroll

Vilken returtyp från @MethodSource tillhandahåller argumenten för varje testkörning?

Sammanfattning

Använd @CsvSource för tabellformaterade data direkt i koden, @MethodSource för komplexa objekt, @EnumSource för alla enumvärden och @NullAndEmptySource för gränsfall med null eller tomma värden. Anpassade namn med name= gör testerna lättare att läsa.

Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”Parametriserade tester med @CsvSource och @MethodSource” gratis?

Ja – hela texten till ”Parametriserade tester med @CsvSource och @MethodSource” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Parametriserade tester med @CsvSource och @MethodSource”?

Kör samma test med flera uppsättningar indata med @ParameterizedTest, @CsvSource och @MethodSource. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Parametriserade tester med @CsvSource och @MethodSource”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Parametriserade tester med @CsvSource och @MethodSource
  2. Avancerad Mockito: argumentfångare och spioner
  3. Spring Boot-testskivor: @WebMvcTest och @DataJpaTest
  4. Testcontainers: integrationstester med riktig databas
← Tillbaka till Java Academy