JUnit
JUnit는 단위 테스트를 쉽게 해주는 테스트용 Framework입니다.
코드가 거대해지고 복잡해짐에 따라, 유닛 단위로 지속적인 테스트를 해서 작은 단위로 빠르고 안정적인 검증을 하기 위해 JUnit을 사용합니다.
JUnit 어노테이션
- @Test
- 함수 위에 선언해 테스트 함수임을 지정합니다.
- @Test(timeout = 밀리초)
- 테스트 함수의 수행 시간을 제한합니다.
- 테스트할 함수가 수행되는 시간이 어노테이션 매개변수로 지정한 시간을 넘긴다면 테스트 Fail
- @Test(expected = 예외)
- 테스트 함수의 예외를 지정합니다.
- 매개변수로 지정한 예외가 발생해야 테스트 Pass
- @Ignore
- 해당 어노테이션이 선언된 테스트 함수는 무시하도록 지정합니다.
- @BeforeEach
- 해당 어노테이션이 선언된 함수는 모든 @Test 함수가 실행되기 전에 매번 실행됩니다.
- 테스트 전에 리셋되어야 할 항목이 들어갑니다.
- @AfterEach
- 해당 어노테이션이 선언된 함수는 모든 @Test 함수가 실행된 후 매번 실행됩니다.
- @BeforeAll
- 모든 @Test 함수가 실행되기 전 한번만 실행됩니다.
- @AfterAll
- 모든 @Test 함수가 실행된 후 한번만 실행됩니다.
- @Nested
- 정적이 아닌 중첩된 테스트 클래스임을 지정합니다.
- @DisplayName
- 테스트 클래스나 함수에 설명을 추가합니다.
테스트 클래스에 @Test 함수가 두개 있다고 가정했을 때, 어노테이션 실행 순서는 아래와 같습니다.
BeforeAll -> BeforeEach -> Test -> AfterEach -> BeforEach -> Test -> AfterEach -> AfterAll
@ParameterizedTest 어노테이션
@Test 대신 @ParameterizedTest 어노테이션을 사용하면 여러 개의 테스트를 한번에 작성할 수 있습니다.
@Test
@DisplayName("null 값 이름 예외처리")
fun createUserFromNullName() {
assertThatThrownBy { User(null) }
.isInstanceOf(IllegalArgumentException::class.java)
}
@Test
@DisplayName("공백 이름 예외처리")
fun createUserFromBlankName() {
assertThatThrownBy { User("") }
.isInstanceOf(IllegalArgumentException::class.java)
}
@ValueSource
테스트에 주입할 값을 어노테이션에 배열로 지정합니다.
배열을 순회하면서, 테스트 메소드에 인수로 배열에 지정된 값들을 주입해서 테스트합니다.
이 때, 하나의 테스트에는 하나의 인수만 전달할 수 있습니다.
@ValueSource에 사용할 수 있는 자료형에는 다음이 있습니다.
- byte, short, int, long, float, double, char, boolean
- String, Class
@ParameterizedTest
@DisplayName("ValueSource를 이용한 User 생성 테스트")
@ValueSource(strings = ["", " "])
fun createUserException(text: String?) {
assertThatThrownBy { User(text) }
.isInstanceOf(IllegalArgumentException::class.java)
}
@CsvSource
@ValueSource에서는 하나의 인수만 전달할 수 있기 때문에 여러 개의 인수를 전달하고 싶으면 @CsvSource를 사용합니다.
이 때, "{input},{expected}" 의 형태로 구분자가 있는 문자열을 입력해주어야 합니다.
delimiter 값을 직접 정의해서 넣어줘서 커스텀 구분자를 사용할 수도 있습니다.
@ParameterizedTest
@CsvSource(value = ["1:2", "2:4", "3:6"], delimiter = ':')
fun multiplyByTest(input: Int, expected: Int) {
assertThat(multiplyBy(input)).isEqualTo(expected)
}
@NullSource, @EmptySource, @NullAndEmptySource
@NullSource는 테스트 메소드에 인수로 null을, @EmptySource는 빈 값을, @NullAndEmptySource는 null과 빈 값을 모두 주입합니다.
- 원시 값에는 null 값이 들어갈 수 없으므로 메소드의 인수가 원시 값이라면 @NullSource , @NullAndEmptySource는 사용이 불가능합니다.
- @NullSource와 @EmptySource를 모두 사용한 것과 @NullAndEmptySource는 같습니다.
- @ValueSource와 같이 사용이 가능합니다.
@ParameterizedTest
@DisplayName("null 값 또는 empty 값으로 User 생성 테스트")
@NullAndEmptySource
@ValueSource(strings = ["", " "])
fun createUserExceptionFromNullOrEmpty(text: String?) {
assertThatThrownBy { User(text) }
.isInstanceOf(IllegalArgumentException::class.java)
}
@EnumSource
Enum 클래스의 모든 값을 사용하려면 @EnumSource 안에 Enum 클래스만 전달해주면 됩니다.
특정 값만 필요할 경우 value에 Enum 클래스를, names에 선택할 값의 이름을 전달해주면 됩니다.
이 때, names까지 값을 넣으면 추가로 mode 값을 넣어줄 수 있는데 지원하는 mode는 다음과 같습니다.
- INCLUDE, EXCLUDE, MATCH_ALL, MATCH_ANY
@ParameterizedTest
@DisplayName("6, 7월이 31일까지 있는지 테스트")
@EnumSource(value = Month::class, names = ["JUNE", "JULY"])
fun isJuneAndJuly31(month: Month) {
assertThat(month.minLength()).isEqualTo(31)
}
@MethodSource
@MethodSource를 사용하여 method를 인수로 전달해주면 복잡한 인수를 전달할 수 있습니다.
@MethodSource의 기본 규칙은 다음과 같습니다.
- @MethodSource에 작성하는 메소드 이름은 인수로 제공하려는 메소드 이름과 같아야 합니다.
- 인수로 제공하려는 메소드는 static이어야 합니다.
- @MethodSource에 메소드 이름을 작성해주지 않을 경우 JUnit이 테스트 메소드 네임과 같은 메소드를 찾아서 인수로 제공합니다.
- 만약 테스트 호출 당 하나의 인수만 제공하고자 한다면, Arguments로 추상화 할 필요는 없습니다.
- Argument Source Method는 Stream<Arguments>를 반환하는 것이 기본이나, List와 같은 컬렉션이나 인터페이스를 반환할 수도 있습니다.
- 정규화된 이름(FQN#methodName의 형식)으로 외부 정적 메소드를 참조할 수 있습니다.
@ParameterizedTest
@MethodSource("provideStringsForIsBlank")
fun isBlankShouldReturnTrue(input: String, expected: Boolean) {
assertThat(input.isBlank()).isEqualTo(expected)
}
companion object {
@JvmStatic
fun provideStringsForIsBlank(): Stream<Arguments> = Stream.of(
Arguments.of("", true),
Arguments.of(" ", true),
Arguments.of("not blank", false)
)
}
'기타 > 우테코' 카테고리의 다른 글
[우테코] 프리코스 4주차 미션 - 크리스마스 프로모션 (0) | 2023.11.16 |
---|---|
[우테코] 프리코스 3주차 미션 - 로또 (0) | 2023.11.10 |
[Kotlin] JUnit의 Assert 함수 사용하기 (0) | 2023.11.09 |
[우테코] 프리코스 2주차 미션 - 자동차 경주 (0) | 2023.11.03 |
[우테코] 프리코스 1주차 미션 - 숫자 야구 (0) | 2023.10.27 |