JUnit5 - assertAll 외

assertAll

  • assertAll​(String heading, Executable… executables)
    • Assert that all supplied executables do not throw exceptions.
    • excutalble 들이 예외를 발생시키지 않을 것이라고 주장

예를 들어 다음과 같이 Person 모델이 있다가 해보겠습니다.

1
2
3
4
5
class Person {
private Long id;
private String firstName;
private String lastName;
}

모델을 테스트 하기 위해서 다음과 같이 테스트 코드를 작성했습니다.

1
2
3
4
5
6
7
@Test
void standardAssertions() {
Person person = new Person(1l, "Robert", "De Niro");

assertEquals(person.getFirstName(), "Rovert", "First Name Failed");
assertEquals(person.getLastName(), "Niro", "Last Name Failed");
}

다음과 같은 결과를 받았습니다.
org.opentest4j.AssertionFailedError: First Name Failed ==>
Expected :Robert
Actual :Rovert

firstName을 테스트하는 첫번째 assertEquals가 실패하면 lastName을 테스트 해볼 수 없습니다. 이 경우 두번째 assert는 첫번째 assert에 의존성을 가지고 있습니다. assertAll 메소드를 사용하면 이런 경우 독립적으로 테스트를 진행할 수 있습니다.

1
2
3
4
5
6
7
8
@Test
void groupedAssertion() {
Person person = new Person(1l, "Robert", "De Niro");

assertAll("Test Person Model independently",
() -> assertEquals(person.getFirstName(), "Rovert", "First Name Failed"),
() -> assertEquals(person.getLastName(), "Niro", "Last Name Failed"));
}

다음과 같은 결과를 받았습니다.
org.opentest4j.MultipleFailuresError: Test Person Model independently (2 failures)
First Name Failed ==> expected: but was:
Last Name Failed ==> expected: but was:

firstName에 대한 테스트가 실패했으나, lastName에 대한 테스트도 수행했으며, 하나의 그룹으로 묶어줌으로써 결과도 함께 볼 수 있습니다.

이외에도 assertAll의 excutable 에서는 다양한 상황을 독립적으로 혹은 의존적으로 테스트 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Test
void nameAssertion() {
Person person = new Person(1l, "Robert", "De Niro");

assertAll("Test Person Name",
() -> {
String firstName = person.getFirstName();
assertNotNull(firstName);

assertAll("Test FirstName",
() -> assertTrue(firstName.startsWith("A"), "First Name Is Not Start With A"),
() -> assertTrue(firstName.endsWith("Z"), "First Name Is Not End With Z")
);
},
() -> {
String lastName = null;
assertNotNull(lastName, "Last Name is null. You don't need to test spelling of lastName");

assertAll("Test Last Name",
() -> assertTrue(lastName.startsWith("A"), "Last Name Is Not Start With A"),
() -> assertTrue(lastName.endsWith("Z"), "Last Name Is Not End With Z")
);
});
}

Disable

특정 테스트 메소드나 테스트 클래스를 스킵하고 싶을 때 사용합니다. @Disable 어노테이션으로 선언되어 있더라도, 메소드나 클래스를 직접 구동하면 테스트가 가능합니다. JUnit4에서는 @Ignore를 사용했습니다.

DisplayName

테스트가 표시되는 이름을 설정할 수 있습니다.. @DispalyName 어노테이션이 없는 경우, 기본적으로 테스트 메소드 명이 노출됩니다.

1
2
3
4
5
6
7
8
9
@DisplayName(value = "로버트 드 니로 이름 테스트")
@Test
void groupedAssertion() {
Person person = new Person(1l, "Robert", "De Niro");

assertAll("Test Person Model independently",
() -> assertEquals(person.getFirstName(), "Rovert", "First Name Failed"),
() -> assertEquals(person.getLastName(), "Niro", "Last Name Failed"));
}

assertThrow

예외에 대한 테스트를 가능하게 해준다.

1
2
3
4
5
6
7
8
void exception() {
throw new RuntimeException();
}

@Test
void exceptionTest() {
assertThrows(RuntimeException.class, () -> this.exception());
}

assertTimeout & assertTimeoutPreemptively

타임 아웃에 대한 대한 테스트를 수행합니다. assertTime 메소드의 경우, 테스트 하고자 하는 코드가 모두 동작을 마칠 때까지 기다립니다. preempt의 경우에는 비교값으로 전달한 시간이 지나면 테스트 하고자 하는 코드의 수행 여부와 관계없이 timeoutexcpetion을 발생시킵니ㄷ.

1
2
3
4
5
6
@Test
void timeoutTest() {
assertAll("Timeout test",
() -> assertTimeout(Duration.ofMillis(100), () -> Thread.sleep(5000)),
() -> assertTimeoutPreemptively(Duration.ofMillis(100), () -> Thread.sleep(1000)));
}

다음과 같은 결과를 받습니다.
org.opentest4j.MultipleFailuresError: Timeout test (2 failures)
execution exceeded timeout of 100 ms by 4901 ms
execution timed out after 100 ms

JUnit5 - Nested, Tags, Interface, DI, Repeat 특정 문자열이 커밋되는 것을 막아보자

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×