Parameterized testing

Java में Testing परिचय

Maria Milusheva

Senior Software Engineer

उदाहरण: Username validation

Chapter 1 के username validation अभ्यास को देखें:

public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty() || username.contains(" ")) {
        return false;
    }
    return username.length() >= 3;
}
Java में Testing परिचय

उदाहरण: दोहराए जाने वाले validation टेस्ट

याद करें कि टेस्ट ऐसे दिखते थे:

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

    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

हमें ऐसे 3 टेस्ट लिखने की ज़रूरत नहीं!

1 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
Java में Testing परिचय

Parameterized tests: सिंटैक्स

@Test के बजाय, हम @ParameterizedTest का उपयोग करते हैं

यह इससे इम्पोर्ट होता है:

import org.junit.jupiter.params.ParameterizedTest;

हमें एक और annotation चाहिए: @ValueSource.

यह इससे इम्पोर्ट होता है:

import org.junit.jupiter.params.provider.ValueSource;
Java में Testing परिचय

Parameterized tests: उदाहरण टेस्ट

@ParameterizedTest
@ValueSource(strings = {"", "jane doe"}) // NOTE: It's "strings", not String
void isValidUsername_returnsFalse(String username) { // Tests can take arugments
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Junit इसे दो टेस्ट के रूप में चलाता है:

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Java में Testing परिचय

@ValueSource सीमाएँ

@ValueSource कुछ निश्चित टाइप तक सीमित है.

@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 में Testing परिचय

@NullSource

हम @ValueSource को null पास नहीं कर सकते, वरना कोड कम्पाइल नहीं होगा:

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

    assertFalse(actual);
}

इसके बजाय @NullSource का उपयोग करें.

Java में Testing परिचय

पूरा ParameterizedTest चलाना

यदि हम @ValueSource को null पास करें, तो यह कम्पाइल नहीं होगा.

@ParameterizedTest
@NullSource // null इनपुट का एक टेस्ट केस जोड़ता है
@ValueSource(strings = {"", "jane doe"})
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Java में Testing परिचय

प्रति टेस्ट कई आर्ग्युमेंट्स

@ValueSource की एक और सीमा - प्रति टेस्ट सिर्फ एक मान पास कर सकते हैं.

यह method देखें:

int countLetters(String input) {
    if (input != null) {
        return input.length();
    }
    return 0;
}
Java में Testing परिचय

@CsvSource

कई मानों के लिए @CsvSource उपयोग करें (CSV = comma separated values):

@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 माना जाता है. खाली string देने के लिए, JUnit 5.10 में "'', 0" उपयोग करें

@CsvSource has similar type limitations as @ValueSource.

Java में Testing परिचय

नोट: Source annotation इम्पोर्ट करना

सभी @____Source annotations इससे इम्पोर्ट किए जा सकते हैं:

import org.junit.jupiter.params.provider.*;
Java में Testing परिचय

अभ्यास करते हैं!

Java में Testing परिचय

Preparing Video For Download...