티스토리 뷰

테스트 파일 설정하기

스프링부트를 사용한다면 기본적으로 설정이 되어있다고 한다. 

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

스프링부트를 사용하지 않는다면 pom.xml 파일에 위와 같이 추가해주면 된다고 한다. 처음 인텔리제이로 자바 파일을 새로 열었더니 pom.xml 파일이 안 보여서 헤맸다. 어떤건가 했는데 Maven이라는 빌트 툴을 사용할 때, 그 설정파일을 의미하는 것 같다. 처음에 강의랑 달라서 찾아보다가 블로그 글(IntelliJ JUnit 추가하기)을 읽으면서 설정했다. 테스트 파일을 설정하면 초록색 바탕으로 테스트 디렉토리라는 것을 나타내 준다.

기본

@Test : 테스트임을 나타내준다. public 선언해 주지 않아도(void 메소드명) 된다.

@BeforeAll/ @AfterAll : 테스트 시작 전, 후에 실행할 메소드 앞에 붙인다. static이어야 한다.

@BeforeEach/ @AfterEach : 각각의 테스트 코드 전, 후에 실행할 메소드 앞에 붙인다.

@Disabled : 이 테스트는 무시하고 지나간다.

@DisplayNameGeneration : 클래스 앞에도 붙이면 그 클래스 안에 있는 메소드 이름을 모두 변경해 준다. 기본구현체 ReplaceUnderscores 를 제공한다.

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)

@DisplayName : 메소드 앞에 붙여서 어떤 테스트인지 이름을 표시할 수 있다. @DisplayNameGeneration 보다 우선순위가 높다.

assertEquals : 예상하는 결과와 메소드 실행결과가 일치하는지 확인해 준다.

assertNotNull : 값이 null이 아닌지 확인한다.

assertTrue : 조건이 참인지 확인한다.

assertAll : 하나의 테스트 메소드에서 중간에 fail이 나면 그 안의 다른 테스트는 실행하지 않는다. executable을 람다식으로 작성하여 assertAll 안에 작성하면, 안에 있는 모든 테스트 코드들을 실행해준다.

 assertAll(
            () -> assertEquals(calculator.multiply(2, 4), 5), // fail
            () -> assertEquals(calculator.sum(2, 4), 6)          
            // true 같은 메소드 안에 있을 때 위에가 fail이어도 이것도 진행해 줌
        );

assertThrows : 예외 발생을 확인한다.

assertTimeout : 특정 시간안에 실행이 완료되는지 확인한다. 해당 시간안에 실행완료가 되지 않더라도 종료되지 않고 끝까지 테스트를 진행한다. @assertTimeoutPreemptively를 사용하면 설정 시간동안 테스트 완료되지 않으면 종료하는데 뭔가 DB랑 관련 있을 때 의도하지 않은 문제가 생길 수도 있다고 한다. 사용에 주의해야 한다.

기타

조건에 따라

@assumTrue, @assumingThat, @Enabled~~,@Disabled~~를 사용할 수 있다.

태그

@Tag로 태그를 설정할 수 있다. @interface를 만들어서 애노테이션을 조합하여 커스텀 태그를 만들 수 있다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("special") // 여기서부터가 JUnit 애노테이션
@Test
public @interface SpecialTest {
}

인스턴스

테스트 메소드마다 기본적으로 새로운 인스턴스를 생성한다. @BeforeAll과 @AfterAll이 static 이어야 하는 이유이다. 하지만 @TestInstance(Lifecycle.PER_CLASS)를 사용하면 클래스당 하나의 인스턴스로 테스트 코드를 실행한다. 이렇게 되면 @BeforeAll과 @AfterAll이 static일 필요가 없다. @TestInstance는 테스트 코드 간의 의존성이 필요할 때 사용한다. (일반적으로 테스트 코드 간의 의존성이 있다면 좋지 않은 코드이다. 하지만 시나리오 테스트 등으로 테스트 코드 간의 의존성이 필요할 때가 있다.)

순서

일반적으로 순서는 내부 구현에 따라 작동하므로 알 수 없다. 하지만 @TestMethodOrder을 사용하면 순서를 정해줄 수 있다. @TestInstance 사용과 별개로 사용할 수 있으나 테스트 코드 간의 의존성이 없는데 순서를 부여할 의미가 잘 생기지 않는 듯 하다.

반복

@RepeatedTest(value = 횟수, name = 이름)로 테스트 반복이 가능하다. 사용법은 문서를 참고하자. 애노테이션의 붙은 메소드의 인자로 RepetitionInfo를 받을 수 있다.
@ParameterizedTest는 여러가지 값으로 테스트를 반복할 수 있다. 그 값은 @ValueSource, @NullAndEmptySource, @CvsSource 등으로 설정할 수 있다.

참고

인프런에서 백기선님의 자바 테스트코드 강의를 일부를 듣고 기본 내용을 정리한 것이다.

'Back-end > Java' 카테고리의 다른 글

JVM(Java Virtual Machine)  (0) 2021.01.21
for, switch 몰라도 되지만 알면 신기한 작성 방식  (0) 2021.01.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함