본문 바로가기
Java

[Java] JUnit 5 사용법 (5) - 반복 테스트하기 (@ParameterizedTest, @CvsFileSource, @ArgumentSource) (3)

by 노력남자 2022. 9. 6.
반응형

이번 포스팅에서는 @ParameterizedTest의 부가 어노테이션 드디어 마지막 2개를 마무리짓겠습니다.

 

@CvsFileSource

 

.cvs 파일을 읽어서 테스트할 수 있게 해주는 어노테이션

 

@CvsSource와 거의 파라미터 값이 비슷합니다.

 

파라미터명 타입 설명
resources String[] .cvs 파일 경로

경로는 resources 폴더로부터 시작
files String[] .cvs 파일 경로

경로는 프로젝트 폴더로부터 시작
encoding String 파일 인코딩 값

기본값 : "UTF-8"
lineSeparator String 줄 바꿈 구분자

기본값 : "\n"
delimiter char delimiter를 변경 (char 형)

delimiterString 하고 같이 사용 불가
delimiterString String delimiter를 변경 (String 형)

delimiter 와 같이 사용 불가

delimiter, delimiterString 굳이 2개를 둔 이유는 char 형으로 굳이 사용해야 하는 경우가 있어서 그런 거 같습니다.
numLinesToSkip int cvs 파일 라인 스킵 수

* 주로 cvs 컬럼명이 첫째 줄에 있기 때문에 1을 사용
emptyValue String CVS 데이터 중 빈 값인 경우 대체되는 값
nullValues String[] CVS 데이터 중 null 값으로 대체할 값

 

예제

 

테스트를 위해 test/resources 경로에 two-column.csv 파일을 생성합니다.

 

//two-column.csv
Country, reference
Sweden, 1
Poland, 2
"United States of America", 3

 

생성한 csv 파일을 읽어보겠습니다. cvs 파일에 "(double quote)는 "로 잘 읽힙니다.

 

package com.effortguy.junit5.parameterizedTestAnnotation;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;

public class CvsFileSourceAnnotation {

    @ParameterizedTest
    @CsvFileSource(resources = "/two-column.csv", numLinesToSkip = 1)
    void testCsvFileSourceResource(String country, int reference) {
    }

    @ParameterizedTest
    @CsvFileSource(files = "src/test/resources/two-column.csv", numLinesToSkip = 1)
    void testCsvFileSourceFiles(String country, int reference) {
    }
}

 

결과

 

 

@ArgumentSource

 

다른 어노테이션처럼 정해진 데이터 주입 방법말고 커스텀하게 주입 데이터 값을 정할 수 있는 어노테이션

 

파라미터명 타입 설명
value Class<? extends ArgumentsProvider> 데이터 주입 방법을 정의한 클래스

 

예시

 

top class 인 경우가 아니라 inner class 인 경우엔 static 꼭 붙혀야합니다.

 

package com.effortguy.junit5.parameterizedTestAnnotation;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import org.junit.jupiter.params.provider.ArgumentsSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertNotNull;

public class ArgumentSourceAnnotation {

    @ParameterizedTest
    @ArgumentsSource(value = MyArgumentsProvider.class)
    void testArgumentSource(String argument) {
        assertNotNull(argument);
    }

    static class MyArgumentsProvider implements ArgumentsProvider {

        @Override
        public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
            return Stream.of("apple", "banana").map(Arguments::of);
        }
    }
}

 

결과

 

 

 

이상으로 @ParameterizedTest 어노테이션 정리가 끝났습니다.

 

활용도가 많이 높진 않지만 어쩌다가 한 번 사용할 수 있을 거 같아 정리해봤습니다.

 

다음 포스팅엔 테스트 인스턴스 종류와 설정 방법에 관한 @TestInstance 어노테이션을 정리하겠습니다~

 

읽어주셔서 감사합니다.

 

참고

 

https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-name-generator

반응형

댓글