본문 바로가기
개발/자바

JUnit 사용법

by hamcheeseburger 2022. 2. 11.

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

이전 댓글