Java Academy · Oppitunti

Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla

Suorita sama testi useilla syötejoukoilla käyttämällä @ParameterizedTest-, @CsvSource- ja @MethodSource-annotaatioita.

Oppitunti 1/413 vaihetta

Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Miksi parametroidut testit?

Saman testilogiikan suorittaminen useilla syötejoukoilla paljastaa reunatapauksia ilman testimetodien kopioimista. JUnit 5 tukee parametroiduja testejä suoraan @ParameterizedTest-annotaatiolla.

@ValueSource: yksinkertaiset yhden arvon testit

@ValueSource antaa yhden tietyn tyyppisen parametrin. Testi suoritetaan kerran jokaista arvoa kohden.

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

@CsvSource: useita parametreja suoraan

@CsvSource antaa pilkuilla eroteltuja arvorivejä. Jokainen rivi on yksi testikutsu. Käyttäkää yksittäisiä lainausmerkkejä pilkkujen suojaamiseen merkkijonoarvoissa.

@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 ja delimiterString

Käyttäkää delimiterString-parametria monimerkkisiin erottimiin tai silloin, kun data sisältää pilkkuja. nullValues-parametrilla voitte muuntaa ennalta määritetyn merkkijonon null-arvoksi.

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

@CsvFileSource: ulkoiset datatiedostot

Ladatkaa testidata classpathissa olevasta CSV-tiedostosta. Tämä on hyödyllistä suurille aineistoille, jotka muuten tekisivät testikoodista vaikeasti luettavaa.

@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: monimutkaiset parametrit

@MethodSource kutsuu staattista factory-metodia, joka palauttaa Stream<Arguments>-olion. Jokainen Arguments.of() on yksi testikutsu. Käyttäkää tätä monimutkaisten olioiden kanssa.

@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: kaikkien enum-arvojen testaaminen

@EnumSource suorittaa testin kerran jokaista enum-vakiota kohden. Käyttäkää mode- ja names-parametreja tiettyjen arvojen sisällyttämiseen tai poissulkemiseen.

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

@NullAndEmptySource

Lyhyt muoto null- ja tyhjien merkkijonojen syötteiden testaamiseen. Voitte yhdistää @ValueSource-annotaation lähteisiin @NullSource + @EmptySource tai käyttää yhdistettyä @NullAndEmptySource-annotaatiota.

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

Mukautetut näyttönimet

Muotoilkaa testin näyttönimi käyttämällä name-parametria annotaatiossa @ParameterizedTest. Paikkamerkit ovat: {index}, {0}, {1} ja {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) { ... }

Lähteiden yhdistäminen @ArgumentsSource-annotaatiolla

Toteuttakaa ArgumentsProvider täysin mukautettua argumenttien generointia varten — dynaamista dataa voidaan hakea tietokannoista, tiedostoista tai API-rajapinnoista.

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) { ... }

Parametroidut testit raja-arvoille

Testatkaa rajaehdot järjestelmällisesti: min-1, min, max ja max+1. Parametroidut testit tekevät raja-arvojen kattavuudesta helposti luettavaa ja ylläpidettävää.

@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));
}

Pikatarkistus

Minkä palautustyypin @MethodSource tarjoaa kunkin testikutsun argumentit?

Kertaus

Käyttäkää @CsvSource-annotaatiota suoraan kirjoitettuihin taulukkomuotoisiin tietoihin, @MethodSource-annotaatiota monimutkaisiin olioihin, @EnumSource-annotaatiota kaikkien enum-arvojen testaamiseen ja @NullAndEmptySource-annotaatiota null-arvojen ja tyhjien syötteiden reunatapauksiin. Mukautetut nimet name=-parametrilla parantavat testien luettavuutta.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla” ilmainen?

Kyllä – oppitunnin ”Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla”?

Suorita sama testi useilla syötejoukoilla käyttämällä @ParameterizedTest-, @CsvSource- ja @MethodSource-annotaatioita. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla
  2. Mockito edistyneesti: argumenttikaappaajat ja vakoilijat
  3. Spring Boot -testiviipaleet: @WebMvcTest ja @DataJpaTest
  4. Testcontainers: integraatiotestit oikealla tietokannalla
← Takaisin: Java Academy