Java >> Java tutorial >  >> Tag >> JUnit

Hent navnet på den igangværende test i JUnit

1. Oversigt

Når vi bruger JUnit, kan vi have brug for vores tests for at få adgang til deres navn. Dette kan hjælpe med fejlmeddelelser, især for test med systemgenererede navne.

I denne korte vejledning vil vi se på, hvordan du får navnet på den aktuelle testcase i både JUnit 4 og JUnit 5.

2. JUnit 5 tilgang

Lad os se på to scenarier. Først vil vi se, hvordan du får adgang til navnet på en enkelt test. Dette navn er normalt forudsigeligt, da det sandsynligvis er navnet på funktionen eller værdien af ​​@DisplayName anmærkning. Men hvis vi bruger parameteriserede tests eller generatorer af displaynavne, skal vi muligvis kende navnet JUnit har givet.

JUnit 5 kan injicere en TestInfo objekt i vores test for at vise os navnet på den aktuelle testcase.

2.1. Individuel test

Lad os injicere en TestInfo objekt ind i vores testfunktion:

@Test
void givenNumbers_whenOddCheck_thenVerify(TestInfo testInfo) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    int number = 5;
    assertTrue(oddCheck(number));
}

Her har vi brugt getDisplayName metode for grænsefladen TestInfo for at vise navnet på testen . Når vi kører testen, får vi testnavnet:

displayName = givenNumbers_whenOddCheck_thenVerify(TestInfo)

2.2. Parameteriseret test

Lad os prøve dette med en parameteriseret test. Her bruger vi navnet feltet i @ParameterizedTest annotation for at beskrive for JUnit, hvordan man fremstiller et navn til testen for os:

private TestInfo testInfo;

@BeforeEach
void init(TestInfo testInfo) {
    this.testInfo = testInfo;
}

@ParameterizedTest(name = "givenNumbers_whenOddCheck_thenVerify{0}")
@ValueSource(ints = { 1, 3, 5, -3, 15 })
void givenNumbers_whenOddCheck_thenVerify(int number) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    assertTrue(oddCheck(number));
}

Vi skal bemærke, at i modsætning til den individuelle test, kan vi ikke injicere TestInfo ind i funktionen. Dette skyldes, at funktionsparametrene skal relatere til de parametrerede data. For at løse dette skal vi gemme TestInfo i et felt i testklassen via beforeEach metode .

Når vi kører testen, får vi testnavnene:

displayName = givenNumbers_whenOddCheck_thenVerify5
displayName = givenNumbers_whenOddCheck_thenVerify-3
displayName = givenNumbers_whenOddCheck_thenVerify3
displayName = givenNumbers_whenOddCheck_thenVerify1
displayName = givenNumbers_whenOddCheck_thenVerify15

3. JUnit 4 tilgang

JUnit 4 kan udfylde et TestName objekt i vores test . Testnavn er en JUnit-regel, og regler udføres som en del af JUnits testudførelse og viser dem detaljerne for den aktuelle test undervejs.

3.1. Individuel test

Lad os overveje en individuel test:

@Rule
public TestName name = new TestName();

@Test
public void givenString_whenSort_thenVerifySortForString() {
    System.out.println("displayName = " + name.getMethodName());
    String s = "abc";
    assertEquals(s, sortCharacters("cba"));
}

Som vist ovenfor kan vi bruge getMethodName metode for klasse TestName for at vise navnet på testen .

Lad os køre testen:

displayName = givenString_whenSort_thenVerifySortForString

3.2. Parameteriseret test

Lad os nu bruge den samme metode til at vise testnavnet, der er genereret for en parameteriseret test. Først skal vi annotere testen med den specielle testløber:

@RunWith(Parameterized.class)
public class JUnit4ParameterizedTestNameUnitTest {
}

Så kan vi implementere testen med både TestName regel og felterne og konstruktøren til at tildele parameterværdierne for den aktuelle test:

@Rule
public TestName name = new TestName();
private String input;
private String expected;

public JUnit4ParameterizedTestNameUnitTest(String input, String expected) {
    this.input = input;
    this.expected = expected;
}

@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> suppliedData() {
    return Arrays.asList(new Object[][] { 
      { "abc", "abc" }, { "cba", "abc" }, { "onm", "mno" }, { "a", "a" }, { "zyx", "xyz" }});
}

@Test
public void givenString_whenSort_thenVerifySortForString() {
    System.out.println("displayName = " + name.getMethodName());
    assertEquals(expected, sortCharacters(input));
}

I denne test leverer vi testdataene Indsamling  som indeholder både input-strenge såvel som forventede strenge. Dette gøres via suppliedData funktion, kommenteret med @Parameterized.Parameters anmærkning. Denne annotation giver os også mulighed for at beskrive testnavnet.

Når vi kører testen, vises TestName regel er givet navnene på hver test, så vi kan se:

displayName = givenString_whenSort_thenVerifySortForString[abc]
displayName = givenString_whenSort_thenVerifySortForString[cba]
displayName = givenString_whenSort_thenVerifySortForString[onm]
displayName = givenString_whenSort_thenVerifySortForString[a]
displayName = givenString_whenSort_thenVerifySortForString[zyx]

4. Konklusion

I denne artikel diskuterede vi, hvordan man finder navnet på den aktuelle test i både JUnit 4 og 5.

Vi så, hvordan man gør dette for både individuelle tests og parameteriserede tests.

Som sædvanlig er den komplette kildekode tilgængelig på GitHub.


Java tag