[JUnit] @ParameterizedTest

chrkb1569·2023년 11월 27일
0

JUnit5

목록 보기
6/6
post-custom-banner

우아한 프리코스를 경험하면서 알게 된 어노테이션으로, 여러 값들을 한 번에 테스트하기 위하여 사용하는 어노테이션입니다.
이전까지는 @Test 어노테이션만을 사용하여 테스트 코드를 작성해왔는데, 프리코스에서 처음 사용해보니 코드양도 많이 줄어들었고, 가독성도 많이 좋아졌기에 자세히 알아보면서 정리하려고합니다.

@ParameterizedTest

해당 어노테이션을 사용할 경우, 기존에 사용하던 @Test 어노테이션과는 조금 다르게 테스트를 수행할 수 있습니다.

@Test 어노테이션을 활용한 테스트코드입니다.
테스트를 수행하는 method 내부에서 변수를 설정부터 method 실행 및 검증까지 모두 실행된다는 특징을 가지고 있지만, 하나의 테스트 method는 하나의 값만을 테스트할 수 있다는 단점이 존재합니다.

제가 작성한 테스트 코드를 예시로 설명해보겠습니다.

다음은 사용자로부터 입력 받은 값의 유효성을 검사하는 InputValueChecker라는 클래스의 method 중, 사용자로부터 입력 받는 날짜의 유효성을 테스트하는 테스트 method입니다.

사용자로부터 유효하지 않은 값을 입력받을 경우 오류를 발생해야하기 때문에 날짜 형식이 아닌 데이터들을 입력으로 넣어줘야 제가 만든 method가 올바르게 동작하는지 확인할 수 있을 것입니다.

처음 제가 생각했던 유효하지 않은 값들은 다음과 같습니다.
1) 공백이 없는 문자열
2) 공백이 존재하는 문자열
3) 특수문자가 존재하는 수
4) 공백
5) 입력 없음

@Test 어노테이션을 활용하여 이 값들을 입력으로하는 테스트를 작성하려면 비슷한 테스트 method를 5개 생성했을겁니다.

하지만 @ParameterizedTest를 활용함으로써, 여러 값들을 하나의 테스트 method로 테스트할 수 있다는 장점이 존재하고, 코드가 줄어듦으로써 가독성 또한 좋아지는 것을 확인할 수 있었습니다.

활용?

@ParameterizedTest 어노테이션을 활용하면 다수의 값들을 하나의 method로 테스트할 수 있지만, 이 다수의 값들을 어떻게 테스트할지 선언을 해줘야합니다.

단순하게 여러 값들을 넣어서 테스트할 수도 있지만, key-value 형식으로 특정 값을 넣었을 때 정해진 값이 나오도록 설정할 수도 있으며, 정해진 객체가 반환되도록 설정할 수도 있습니다.

@ValueSource

간단하게 값을 매개변수 형태로 테스트 method에 전달해주는 어노테이션입니다.

@ValueSource 어노테이션을 선언한 뒤, 옵션으로 어떠한 값들을 테스트할 지 설정할 수 있습니다.

옵션으로 설정할 수 있는 값들을 배열의 형태이며, 원시 자료형 및 클래스들을 값으로 설정할 수 있는 것 같습니다.

테스트를 실행할 경우, 다음처럼 5개의 테스트가 실행된 것과 원하는 결과가 출력되었음을 확인할 수 있었습니다.

@CsvSource

@ValueSource 어노테이션이 간단하게 값만을 매개변수 형태로 전달하여 테스트했다면, @CsvSource 어노테이션은 입력값을 입력했을 때의 출력값 또한 설정할 수 있습니다.

다음처럼 @CsvSource 어노테이션을 선언한 뒤, 옵션으로 입력값에 따른 출력값을 설정할 수 있습니다.
이때, 입력값과 출력값은 쉼표(,)를 통하여 구분되며, 입력값과 출력값의 자료형은 사용자가 설정할 수 있습니다.
지금은 입력값과 출력값의 자료형을 int로 설정하였지만,

다음처럼 자료형을 String으로도 변경할 수 있습니다.

다음처럼 테스트 결과 역시 우리가 생각했던 것처럼 잘 나오는 것을 확인할 수 있었습니다.
@CsvSource 어노테이션은 입력값과 출력값을 설정할 수 있기 때문에 테스트 코드의 신뢰성을 보장할 수 있지만, 간단한 원시 자료형만 사용할 수 있다는 단점이 존재합니다.
즉, 입력값으로 클래스를 설정할 수 없을 뿐더러, 출력값으로 컬렉션을 활용할 수 없기 때문에 간단한 형태의 테스트만 가능하다는 단점이 있습니다.

@MethodSource

@CsvSource 어노테이션을 활용하였을 경우, 입력값과 출력값을 지정할 수 있지만, 원시 자료형만 가능하다는 단점이 존재했기 때문에 활용성이 그렇게 높지 않았습니다.
하지만, @MethodSource 어노테이션은 이러한 단점을 보완하여 복잡한 입력값과 출력값을 지정하여 테스트를 수행할 수 있게 되었습니다.

@MethodSource 어노테이션을 사용하게 될 경우, 어노테이션을 선언한 뒤 옵션에 무언가를 입력해주는데, 입력해주는 이 문자열의 정체는 바로

method의 이름입니다.

@MethodSource 어노테이션은 복잡한 자료형들을 입력값과 출력값으로 사용할 수 있는 대신, 별도의 method를 통하여 미리 설정해야한다는 단점이 존재합니다.

테스트를 실행했을 경우, 다음처럼 우리가 원하는 입력값과 출력값이 출력되는 것을 확인할 수 있으며, 복잡한 값들을 테스트할 수 있게 되었습니다.

@EnumSource

다음으로는 Enum 클래스의 값들을 입력값으로 활용하는 @EnumSource 어노테이션입니다.

테스트하기 위해서 다음처럼 임의의 Enum 클래스를 선언하겠습니다.

다음처럼 어노테이션을 선언한 뒤, 옵션으로 Enum 클래스에 대한 정보를 줄 수 있습니다.

아무런 설정도 하지 않을 경우, Enum 클래스 내부에 존재하는 값들을 모두 테스트하지만,

다음처럼 names라는 옵션을 통하여 입력값으로 사용하길 원하는 값들만 지정할 수 있습니다.

post-custom-banner

0개의 댓글