Parametreli testler

Java'da Teste Giriş

Maria Milusheva

Senior Software Engineer

Örnek: Kullanıcı adı doğrulama

Bölüm 1'deki kullanıcı adı doğrulama alıştırmasını hatırlayın:

public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty() || username.contains(" ")) {
        return false;
    }
    return username.length() >= 3;
}
Java'da Teste Giriş

Örnek: Tekrarlı doğrulama testi

Testlerin şu şekilde olduğunu hatırlayın:

@Test
void isValidUsername_returnsFalse() {
    String username = "____";

    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Bunlardan 3 tane yazmak zorunda değiliz!

1 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
Java'da Teste Giriş

Parametreli testler: sözdizimi

@Test yerine @ParameterizedTest kullanırız.

Şuradan içe aktarılır:

import org.junit.jupiter.params.ParameterizedTest;

Ayrıca bir ek açıklama daha gerekir: @ValueSource.

Şuradan içe aktarılır:

import org.junit.jupiter.params.provider.ValueSource;
Java'da Teste Giriş

Parametreli testler: örnek test

@ParameterizedTest
@ValueSource(strings = {"", "jane doe"}) // NOT: "strings", String değil
void isValidUsername_returnsFalse(String username) { // Testler argüman alabilir
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Junit bunu iki test olarak çalıştırır:

Çalıştırılan test: 2, Başarısız: 0, Hata: 0, Atlanan: 0
Tüm testler geçti!
Java'da Teste Giriş

@ValueSource sınırlamaları

@ValueSource belirli türlerle sınırlıdır.

@ValueSource(bytes = {1, 2, 3, 42})
@ValueSource(shorts = {100, 200, 300})
@ValueSource(ints = {1, 2, 3, 42})
@ValueSource(longs = {1000L, 2000L, 3000L})
@ValueSource(floats = {1.0f, 3.14159f, 2.71828f})
@ValueSource(doubles = {3.14, 2.71828, 1.4142})
@ValueSource(chars = {'a', 'b', 'c', 'Z'})
@ValueSource(booleans = {true, false})
@ValueSource(strings = {"Hello", "JUnit", "5", "Parameter"})
@ValueSource(classes = {String.class, Integer.class, ValueSourceExamples.class})
1 https://junit.org/junit5/docs/5.7.1/api/org.junit.jupiter.params/org/junit/jupiter/params/provider/ValueSource.html
Java'da Teste Giriş

@NullSource

@ValueSource'a null veremeyiz; derlenmez:

@ParameterizedTest
@ValueSource(strings = {"", "jane doe", null}) // Derlenmez
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Bunun yerine @NullSource kullanın.

Java'da Teste Giriş

Tüm Parametreli Testi çalıştırma

null@ValueSource'a verirsek derlenmez.

@ParameterizedTest
@NullSource // Null giriş için bir test ekler
@ValueSource(strings = {"", "jane doe"})
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}
Çalıştırılan test: 3, Başarısız: 0, Hata: 0, Atlanan: 0
Tüm testler geçti!
Java'da Teste Giriş

Test başına birden çok argüman

@ValueSource'un başka bir sınırlaması: her test için yalnızca bir değer geçebilir.

Şu yöntemi düşünün:

int countLetters(String input) {
    if (input != null) {
        return input.length();
    }
    return 0;
}
Java'da Teste Giriş

@CsvSource

Birden çok değer için @CsvSource kullanın (CSV = virgülle ayrılmış değerler):

@ParameterizedTest
@CsvSource({"Hello World, 11", "DataCamp, 8", "'', 0", ", 0"})
void countLetters_countsLetters(String input, int expected) {
    int actual = countLetters(input);

    assertEquals(expected, actual);
}

", 0" null, 0 olarak girilir. Boş bir dize girmek için JUnit 5.10'da "'', 0" kullanın.

@CsvSource has similar type limitations as @ValueSource.

Java'da Teste Giriş

Not: Source ek açıklamalarını içe aktarma

Tüm @____Source ek açıklamaları şuradan içe aktarılabilir:

import org.junit.jupiter.params.provider.*;
Java'da Teste Giriş

Hadi pratik yapalım!

Java'da Teste Giriş

Preparing Video For Download...