본문 바로가기
Category/Spring

[Spring] JUnit과 slf4j 사용하여 단위 테스트 하기

by developer__Y 2024. 1. 3.
JUnit

 

Controller를 만들면서, 기능이 정상적으로 작동하는지 확인하기위해 매번 Tomcat을 켜고 직접 url에 들어가 웹페이지 상에서 일일이 입력값을 주고 제대로 작동하는지 확인을 해왔었는데,

JUnit을 사용하면 간편하게 IDE안에서 기능의 작동여부를 확인할수있다!

이처럼 메소드 단위로 Test하는것을 단위테스트라고 한다.

JUnit은 스프링 프레임워크에 기본적으로 들어있지만, Spring-test 디펜던시를 추가해줘야한다.

version은 사용하는 스프링 프레임워크의 버전을 입력한다.

 

slf4j

 

개발을 하면서, 중간중간 System.out.println() 을 통해 제대로 값이 들어갔는지등등 확인해왔었는데,

slf4j를 통해 로그를 찍어 확인 할 수있다.

log4j는 보안문제로 인해 slf4j를 사용한다.

이러한 slf4j 또한 스프링 프레임워크에 기본적으로 들어있어 간단하게 @slf4j 어노테이션을 통해 사용할 수 있다.

 

JUnit과 slf4j를 통해 Controller의 기능 작동여부를 테스트 해보기

 

JUnit을 이용해서 테스트를 하기위해서는 테스트 코드를 작성해야한다.

테스트 코드는 src/test/java 경로에서 만들어서 작성한다.

 

 

JUnit에서 제공하는 많은 어노테이션들이 있다.

 

@RunWith() : 테스트를 실행할때 기본적으로 스프링 프레임워크에서는 컨테이너를 로딩하는등 다양한 작업들을 실행하는데, RunWith() 어노테이션과 SpringJunit4ClassRunner.class 을 통해서 조금더 실행환경을 가볍게 만들수있다.

@WebAppConfiguration과 @ContextConfiguration은 테스트를 실행하면서, 스프링의 빈에서 객체를 주입해주기위해 config 빈관련 설정파일들의 경로를 명시한다. 주로 root-context.xml과 servlet-context.xml을 사용한다.

 

그리고 테스트 클래스인 SampleControllerTests의 필드로 Setter를 통한 의존성을 주입해준다.

여기서 MockMvc는 클라이언트가 요청하는 것들을 간단하게 다양한 메소드를 통해서 MVC 역할을 해준다.

 

@Before : 테스트를 실행하고자 하는 메소드 단위의 @Test를 실행하기전에 실행해주는 작업으로 초기화,의존성주입등 원하는 테스트 사전작업을 명시한다. 

 

 

다음의 테스트를 통해서 Controller의 기능이 잘 작동하는지 테스트 할수있다.

먼저, 위의 TicketVO 객체 관련 설정은 클라이언트가 데이터를 담아 요청하고자 하는 작업을 설정하는 것이다.

 

내가 테스트하고싶은 RestController은 클라이언트가 Ajax를 통해 Json방식으로 ticketVO 객체를 요청하면,

RestController에서 ticketVO 객체를 받아 Log를 출력하고, 그대로 클라이언트에게 돌려주는 기능이다.

따라서, 위의 테스트 코드에서 셋팅한 TicketVO 객체를 Json 형식으로 바꿔야한다.

Gson()을 통해 객체를 Json 형식으로 변환 할 수있다.

 

의존성을 주입받은 mockMvc를 통해서 클라이언트의 요청을 대신할수있다. 

기존에 내가 직접 실행해서 해당 Url에 들어가 원하는 입력값을 입력하고 POST방식으로 전송하던 것을 

mockMvc의 perform() 메소드를 통해 실행하는 것이다.

mockMvc와 비슷한 역할을 하는 도구로 Swagger나, Postman 등이 있다.

 

perform() : 요청하고자 하는 HTTP 메소드와 url, 그리고 contentType등을 설정한다.

andExpect() : AssertThat() 처럼 어떠한 특정 결과를 기대하며, 그 결과가 나오지 않으면 에러를 발생한다.

여기서는, http status로 http결과가 200이 나온다면 테스트 성공이다.

이후, junit을 실행시켜주면

 

 

다음과 같이 테스트가 성공하여 해당 기능이 정상적으로 작동한다는것을 알수있다.

그리고, 컨트롤러와 테스트 코드에 log를 찍어놓았는데

해당 콘솔을 통해 테스트 코드에서 나온 로그와 mockMvc를 통해 테스트 하고자하는 컨트롤러의 로그가 둘다 나오는 것을 통해 테스트 코드를 통해 기존의 Controller또한 정상 작동한다는 것을 알수있다!