JUnit 이란?
Java에서 사용할 수 있는 대표적인 테스트 프레임 워크이다.
다른 언어에서 사용할 수 있는 테스트 프레임워크들도 있는데, 보통 (언어의 약자)Unit 이라고 불리운다.
ex ) CUnit, CppUnit, PHPUnit, PyUnit
Gradle Dependency
dependencies {
testImplementation 'org.assertj:assertj-core:3.22.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
}
자주 사용하는 JUnit Method
assertThat - isTrue(), isFalse()
true, false 값을 확인할 때
@Test
@DisplayName("assertThat으로 true 값인지 확인한다.")
void checkIsTrue() {
assertThat(isAvailable()).isTrue();
}
@Test
@DisplayName("assertThat으로 false 값인지 확인한다.")
void checkIsFalse() {
assertThat(isAvailable()).isFalse();
}
assertTrue, assertFalse
isTrue(), isFalse() 보다 간결히 쓸 때
@Test
@DisplayName("assertTrue로 true 값인지 확인한다.")
void checkIsTrueByAssertTrue() {
assertTrue(isAvailable());
}
@Test
@DisplayName("assertFalse로 false 값인지 확인한다.")
void checkIsTrueByAssertFalse() {
assertFalse(isAvailable());
}
assertThat - isEqualTo()
같음을 확인할 때
@Test
@DisplayName("두 개의 정수를 파라미터로 전달하면 합을 반환한다.")
void sumTwoNumbers() {
assertThat(sum(1, 2)).isEqualTo(3);
}
assertThat - isGreaterThan(), isGreaterThanOrEqualTo(), isLessThan(), isLessThanOrEqualTo()
값의 범위를 테스트 할 때
@Test
@DisplayName("Random 값이 0초과 9미만이다.")
void checkRandomRange_1() {
assertThat(generateRandomNumber()).isGreaterThan(0).isLessThan(9);
}
@Test
@DisplayName("Random 값이 0이상 9이하이다.")
void checkRandomRange_2() {
assertThat(generateRandomNumber()).isGreaterThanOrEqualTo(0).isLessThanOrEqualTo(9);
}
assertThat - contains()
순서 상관 없이 기대하는 원소들이 Collection 안에 포함되었는지 확인할 때
@Test
@DisplayName("콤마로 값을 분리하고 HashSet으로 반환한다.")
void splitWithHashSetTest() {
assertThat(splitWithHashSet("a,b,c")).contains("a", "c", "b");
}
assertThat - containsExactly()
기대하는 원소들이 순서에 맞게 Collection 안에 포함되었는지 확인할 때
@Test
@DisplayName("콤마로 값을 분리하고 List로 반환한다.")
void checkContainsExactly() {
assertThat(splitWithList("a,b,c")).containsExactly("a", "b", "c");
}
assertThatExceptionOfType
의도한 예외가 발생하는지 테스트할 때
@Test
@DisplayName("음수가 들어온 경우 예외가 발생한다.")
void sumNegativeNumberException() {
assertThatExceptionOfType(RuntimeException.class)
.isThrownBy(() -> sum(1, -8))
.withMessageMatching("음수는 입력될 수 없다.");
}
sum(1, -8) 을 실행했을 때 RuntimeException이 발생하는지 확인한다. 또한 ErrorMessage에 "음수는 입력될 수 없다." 라는 문구가 포함되어있는지 확인한다.
자주 사용하는 JUnit Annotation
@ParameterizedTest
특정 기능을 여러 개의 입력 값으로 테스트하고 싶을 때 사용한다. 보통 @ValueSource 나 @CsvSource 와 조합하여 사용한다.
@ValueSource
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("contains로 원소가 포함되어 있는지 여부를 확인한다.")
void setContainsTest(int number) {
assertTrue(numbers.contains(number));
}
@ParameterizedTest
@ValueSource(strings = {"a", "b", "c"})
@DisplayName("contains로 원소가 포함되어 있는지 여부를 확인한다.")
void setContainsTest(String text) {
assertTrue(numbers.contains(text));
}
@ValueSource()의 {} 내에 넣고자 하는 입력 값을 기입한다. 입력 값의 자료형을 지정할 수 있으며 테스트 메소드의 파라미터인 number로 해당 입력값이 전달 된다.
자료형의 종류는 아래와 같다.
@Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@API(status = STABLE, since = "5.7")
@ArgumentsSource(ValueArgumentsProvider.class)
public @interface ValueSource {
short[] shorts() default {};
byte[] bytes() default {};
int[] ints() default {};
long[] longs() default {};
float[] floats() default {};
double[] doubles() default {};
char[] chars() default {};
boolean[] booleans() default {};
String[] strings() default {};
Class<?>[] classes() default {};
}
@CsvSource
@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void setContainsTest2(int number, boolean expected) {
assertThat(numbers.contains(number)).isEqualTo(expected);
}
map 형식으로 매칭된 값을 파라미터로 전달한다. delimiter을 지정할 수 있으며, default는 콤마(,)이다.
@CsvSource() 내에서 Parameter 타입을 따로 지정하지 않는 것을 보면 암묵적 변환을 지원한다.
아래의 경우도 가능하다.
@ParameterizedTest
@CsvSource({"APRIL", "JUNE", "SEPTEMBER", "NOVEMBER"}) // Pssing strings
void someMonths_Are30DaysLongCsv(Month month) {
final boolean isALeapYear = false;
assertThat(month.length((isALeapYear))).isEqualTo(30);
}
@RepeatableTest
특정 테스트 메소드를 반복하고 싶을 때 사용한다.
@RepeatedTest(10)
@DisplayName("랜덤값을 생성한다.")
void generateRandomNumber() {
int randomNumber = RandomGenerator.generateRandomNumber();
assertThat(randomNumber).isLessThan(10).isGreaterThanOrEqualTo(0);
}
참조 : https://www.baeldung.com/parameterized-tests-junit-5#2-explicit-conversion
'개발 > 자바' 카테고리의 다른 글
추상화란? (2) | 2022.03.17 |
---|---|
compareTo()가 0을 반환하면 어떤 순서로 정렬되나? (0) | 2022.02.19 |
Java Stream.max() 사용법 (0) | 2022.02.14 |
Comparable의 compareTo() 파헤치기 (0) | 2022.02.14 |
[Java] clone()에 대해서 (0) | 2021.05.17 |
이전 댓글