[JUnit 4] @FixedMethodOrder 통합 테스트 코드 작성하기
by 배부른코딩로그💡 클래스명 순으로 테스트가 진행되게끔 @FixedMethodOrder를 활용해 통합 테스트를 작성해보자!
목표
- @FixedMethodOrder이 무엇인지 설명할 수 있다.
- @FixedMethodOrder을 적극 활용할 수 있다.
테스트는 관심사 단위 별로 작성하는 것이 테스트에 대한 의존성을 낮출뿐더러 파악하기 쉬운 하나의 메뉴얼이 될 수 있다. 하지만, 꼭 그래야만 하는가? 라고 묻는다면 아니다. 목적에 따라 얼마든지 입맛대로 테스트를 짤 수 있다.
필자의 경우, 꼭 사용자 입장에서 순차적으로 진행되는 통합 테스트를 작성하고 싶었다.
시나리오 흐름대로 BDD(Behavior Driven Development) 행위 중심적으로 테스트가 필요했고,
이를 위해서, 지정한 순서 비스무리하게 테스트를 진행하는 @FixedMethodOrder 애노테이션을 활용해봤다.
@FixedMethodOrder
@FixMethodOrder 애노테이션은 JUnit v4.11부터 등장했음을 참고하면 좋다.
사용법은 Test Class 위에 애노테이션을 다음 예제와 같이 추가해주면 된다.
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Junit4FixedMethodOrderTest {
}
MethodSorters.class 를 통해 테스트 실행 순서를 설정할 수 있다.
각각 enum 타입으로 구현되어져 있고, 타입별 정렬 규칙은 아래를 참고하자.
Class MethodSorters
정렬조건 | 정렬규칙 | 실행순서 |
MethodSorters.DEFAULT | 특정 순서로 정렬 (테스트 마다 순서 매번 동일) | 예측 가능할지도? |
MethodSorters.JVM | JVM에 의해 정렬 (테스트 마다 순서 매번 랜덤) | 예측 불가 |
MethodSorters.NAME_ASCENDING | 사용자 정의 메서드명 기준 오름차순 정렬 | 예측 가능 |
개인적으로 표 내용 중 DEFAULT가 가장 특이했다.
실행순서가 JUnit의 특정 규칙에 따라 랜덤한 순서로 정해진다.
즉, 여러 메서드를 가진 클래스 내부가 수정되지 않는다면, 최소 테스트 순서만 예측이 불가능하다는 뜻이다.
이후부터 실행순서가 매번 동일하다.
단, 클래스 내부에 변화가 있다면 순서가 다시 변경되니, 주의가 필요하다.
사실 테스트는 순서에 상관없이 관심사에 따라 작성하면 문제될 부분은 없다 : )
사용 예제
필자는 운영팀의 네트워크 작업 등의 개발 외적인 요인으로 API 요청/응답 테스트나 서비스 접속 테스트 등을 할 필요가 간혹 발생했다. 서비스가 많을 경우, 언제 다 확인해볼 것인가? 단 1번 테스트 코드를 실행하고 편하게 쉬고 싶었다.
아래의 예제는 CRUP에 대한 의식 흐름에 맞긴 시나리오이며 통합 테스트 예제는 다음와 같다.
- 사용자가 서비스 신규가입
- 사용자가 실제로 가입됐는지 계정 생성유무 확인
- 사용자가 개인정보 수정
- 사용자가 수정된 정보 확인
- 사용자가 서비스 탈퇴
@FixMethodOrder(MethodSorters.DEFAULT)
public class JUnit4MethodSorterTest {
@Test
public void scen_1_regist_user() {
System.out.println("Testcase_1 executes");
String response = method.send(json);
Assert.assertEquals(
ResponseCode.SUCCESS,
ResponseCode.enumTypeOf(code));
}
@Test
public void scen_2_exist_user() {
System.out.println("Testcase_2 executes ");
// TODO
}
@Test
public void scen_3_update_user() {
System.out.println("Testcase_3 executes");
// TODO
}
@Test
public void scen_4_find_user() {
System.out.println("Testcase_4 executes ");
// TODO
}
@Test
public void scen_5_delete_user() {
System.out.println("Testcase_5 executes ");
// TODO
}
}
기본적인 테스트라고 볼 수 있다.
그럼에도 불구하고, 네트워크 작업이나 서버 작업 후 꼭 확인할 필요가 있는 부분이며,
이를 JUint4로 테스트 자동화할 수 있다는 점에서 활용도는 훌륭하다고 생각한다 : )
(JUnit5에서도 다뤄볼 예정!!)
사용자 화면이 존재하는 경우, Front 단에서 Mocha, codeceptjs 등으로 테스트가 가능할 것이다.
테스트 코드는 초기에 많은 시간 투자가 필요하지만, 미래의 나는 단 한 번의 클릭 후 유투브를 보고 있을 것이다 ㅎㅎ..
출처
- JUnit Test Execution Order, Software Testing Help, 2022-04-03
- JUnit 4.13.2 API (JUnit Docs), JUnit.org , 2021
Last Updated. 2022. 04. 22.
'TDD > JUnit' 카테고리의 다른 글
[JUnit 4] @Nested 없이 계층 구조의 테스트 코드 작성하기 (0) | 2022.04.21 |
---|---|
[JUnit 5] @ParameterizedTest 사용하기 (0) | 2021.06.14 |
블로그의 정보
배부른코딩로그
배부른코딩로그