[테스트] 다양한 테스트 방법
동기
2주차 미션 피드백을 읽으면서 유용한 테스트 방법이 있어서 소개하고자 한다.
바로 ParameterizedTest
이다. 바로 사용 방법을 알아보자!
ParameterizedTest
@ParameterizedTest
를 사용하면 여러 개의 파라미터에 대한 테스트를 하나에 테스트 메소드로 처리할 수 있다.
@Test
만을 사용했을 때와 @ParameterizedTest
를 사용했을 때의 차이점을 코드로 확인해보자!
기존의 테스트
ParameterizedTest
를 사용하지 않으면 테스트하고 싶은 매개변수가 있을 때마다 테스트 메소드를 작성해야 한다.
코드를 보면 알 수 있다싶이 중복되는 부분이 많고 테스트 케이스마다 메소드를 작성해야 하기 때문에 관리하기 어렵다.
그렇다면 이제 ParameterizedTest
를 사용한 코드를 보자
ParameterizedTest를 사용한 테스트
위 코드를 실행하게 되면 test3
가 총 5번 호출되며 실행할 때, 5, 4, 3, 2, 1이 순서대로 들어간다.
여러 경우에 대한 테스트를 단 하나의 메소드로 처리할 수 있는 것이다!
아마 @ValueSoource
가 무엇인지 궁금할 것이다! 이는 파라미터에 값을 넣는 에노테이션으로 이제부터 설명하겠다.
Argument sources
앞서 봤듯이 ParameterizedTest
는 서로 다른 인수를 사용하여 동일한 테스트를 여러 번 실행시킨다.
그런데 단순한 인수만 넣을 수 있다면 조금만 복잡한 값이 들어오더라도 테스트할 수 없을 것이다.
이제부터 여러가지 인수를 넣는 방법에 대해서 살펴보자!
@ValueSource
@ValueSource
를 사용하면 단순한 리터럴 값 배열을 테스트 메서드에 전달할 수 있게된다.
사용법은 @ValueSource
안에 shorts
, strings
, ints
와 같이 타입을 적어주고 뒤에 값을 넣어주면 된다.
코드 예시를 보자!
test3은 총 3번 실행되며 str
에 순서대로 “aaa”, “bbb”, “ccc” 값이 들어간다.
@Test
만 사용한다면 총 3번개의 테스트 메소드를 작성해야 하는데 하나의 메소드로 처리한 것을 볼 수 있다.
넘겨줄 수 있는 자료형은 다음과 같다!
@NullSource
@NullSource
는 파라미터 값으로 null을 넣어준다.
바로 예시를 보자!
실행 결과를 보면 알 수 있듯이 data에 null이 들어간 것을 확인할 수 있다
@EmptySource
@EmptySource
도 이름 그대로 빈 값을 파라미터에 주입해준다.
코드로 바로 확인해보자!
data에 empty값이 들어간 것을 확인할 수 있다!
@EnumSource
@EnumSource
도 느낌이 오지 않는가? 그냥 Enum을 넣어준다 ㅎㅎ..
마찬가지로 잘 통과하는 것을 확인할 수 있다
@MethodSource
지금까지 살펴본 테스트들은 단순하고 하나의 파라미터밖에 넘기지 못한다.
@MethodSource
는 좀 더 복잡한 인수를 가지고 테스트를 제공한다.
바로 예시를 보자!
차례대로 input, expected에 `provideStringForBlank에서 생성한 값들이 들어가는 것을 확인할 수 있다.
이렇게 여러 복잡한 인자를 넘겨서 테스트가 가능하다!
이 방식을 사용하려면 몇 가지 규칙이 있다.
@MethodSource
로 지정한 메소드는 반드시 static이어야 한다.- 그리고 메소드 이름과
@MethodSource
에 들어가는 메서드 이름이 일치해야 한다.- 단, TestInstance를 사용하여 클래스 단위의 생성주기를 가지는 경우에 인스턴스 메소드가 가능하다.
@MethodSource
에 메소드 이름을 작성하지 않으면 JUnit이 테스트 메소드 네임과 같은 메소드를 찾아서 인수로 제공한다.
이 방식을 사용하면 복잡한 인수를 자동으로 주입해서 테스트할 수 있다!!
@CsvSource
@CsvSource
를 사용하면 인자와 테스트 값을 동시에 주입할 수 있다
바로 코드로 확인해보자
@CsvSource
에 값을 넣을때는 기본적으로 쉼표(,)
로 구분된다. delimeter
를 따로 설정할 수도 있다!
오늘은 다양한 테스트 방법에 대해서 알아봤다.
테스트 코드를 작성하는 것도 서비스 로직을 작성하는 것만큼 중요하다.
다양한 테스트 방법에 대해서 숙지해두자!
참고 사이트
-
https://ebabby.tistory.com/21
-
https://www.baeldung.com/parameterized-tests-junit-5
-
https://velog.io/@ohzzi/junit5-parameterizedtest