2 분 소요

동기

2주차 미션 피드백을 읽으면서 유용한 테스트 방법이 있어서 소개하고자 한다.
바로 ParameterizedTest이다. 바로 사용 방법을 알아보자!

ParameterizedTest

@ParameterizedTest를 사용하면 여러 개의 파라미터에 대한 테스트를 하나에 테스트 메소드로 처리할 수 있다.
@Test만을 사용했을 때와 @ParameterizedTest를 사용했을 때의 차이점을 코드로 확인해보자!

기존의 테스트

img1

ParameterizedTest를 사용하지 않으면 테스트하고 싶은 매개변수가 있을 때마다 테스트 메소드를 작성해야 한다.
코드를 보면 알 수 있다싶이 중복되는 부분이 많고 테스트 케이스마다 메소드를 작성해야 하기 때문에 관리하기 어렵다.
그렇다면 이제 ParameterizedTest를 사용한 코드를 보자

ParameterizedTest를 사용한 테스트

img1

위 코드를 실행하게 되면 test3가 총 5번 호출되며 실행할 때, 5, 4, 3, 2, 1이 순서대로 들어간다.
여러 경우에 대한 테스트를 단 하나의 메소드로 처리할 수 있는 것이다!
아마 @ValueSoource가 무엇인지 궁금할 것이다! 이는 파라미터에 값을 넣는 에노테이션으로 이제부터 설명하겠다.

Argument sources

앞서 봤듯이 ParameterizedTest는 서로 다른 인수를 사용하여 동일한 테스트를 여러 번 실행시킨다.
그런데 단순한 인수만 넣을 수 있다면 조금만 복잡한 값이 들어오더라도 테스트할 수 없을 것이다.
이제부터 여러가지 인수를 넣는 방법에 대해서 살펴보자!

@ValueSource

@ValueSource를 사용하면 단순한 리터럴 값 배열을 테스트 메서드에 전달할 수 있게된다.
사용법은 @ValueSource안에 shorts, strings, ints와 같이 타입을 적어주고 뒤에 값을 넣어주면 된다.
코드 예시를 보자!

img1

test3은 총 3번 실행되며 str에 순서대로 “aaa”, “bbb”, “ccc” 값이 들어간다.
@Test만 사용한다면 총 3번개의 테스트 메소드를 작성해야 하는데 하나의 메소드로 처리한 것을 볼 수 있다.

넘겨줄 수 있는 자료형은 다음과 같다!

img1

@NullSource

@NullSource는 파라미터 값으로 null을 넣어준다.
바로 예시를 보자!

img1

img1

실행 결과를 보면 알 수 있듯이 data에 null이 들어간 것을 확인할 수 있다

@EmptySource

@EmptySource도 이름 그대로 빈 값을 파라미터에 주입해준다.
코드로 바로 확인해보자!

img1

img1

data에 empty값이 들어간 것을 확인할 수 있다!

@EnumSource

@EnumSource도 느낌이 오지 않는가? 그냥 Enum을 넣어준다 ㅎㅎ..

img1

img1

마찬가지로 잘 통과하는 것을 확인할 수 있다

@MethodSource

지금까지 살펴본 테스트들은 단순하고 하나의 파라미터밖에 넘기지 못한다.
@MethodSource는 좀 더 복잡한 인수를 가지고 테스트를 제공한다.
바로 예시를 보자!

img1

차례대로 input, expected에 `provideStringForBlank에서 생성한 값들이 들어가는 것을 확인할 수 있다.
이렇게 여러 복잡한 인자를 넘겨서 테스트가 가능하다!

이 방식을 사용하려면 몇 가지 규칙이 있다.

  • @MethodSource로 지정한 메소드는 반드시 static이어야 한다.
  • 그리고 메소드 이름과 @MethodSource에 들어가는 메서드 이름이 일치해야 한다.
    • 단, TestInstance를 사용하여 클래스 단위의 생성주기를 가지는 경우에 인스턴스 메소드가 가능하다.
  • @MethodSource에 메소드 이름을 작성하지 않으면 JUnit이 테스트 메소드 네임과 같은 메소드를 찾아서 인수로 제공한다.

이 방식을 사용하면 복잡한 인수를 자동으로 주입해서 테스트할 수 있다!!

@CsvSource

@CsvSource를 사용하면 인자와 테스트 값을 동시에 주입할 수 있다
바로 코드로 확인해보자

img1

img1

@CsvSource에 값을 넣을때는 기본적으로 쉼표(,)로 구분된다. delimeter를 따로 설정할 수도 있다!

오늘은 다양한 테스트 방법에 대해서 알아봤다.
테스트 코드를 작성하는 것도 서비스 로직을 작성하는 것만큼 중요하다.
다양한 테스트 방법에 대해서 숙지해두자!

참고 사이트

  • https://ebabby.tistory.com/21

  • https://www.baeldung.com/parameterized-tests-junit-5

  • https://velog.io/@ohzzi/junit5-parameterizedtest