Parametriserade tester med @CsvSource och @MethodSource
Kör samma test med flera uppsättningar indata med @ParameterizedTest, @CsvSource och @MethodSource.
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.
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
- Parametriserade tester med @CsvSource och @MethodSource
- Avancerad Mockito: argumentfångare och spioner
- Spring Boot-testskivor: @WebMvcTest och @DataJpaTest
- Testcontainers: integrationstester med riktig databas