스프링프레임워크로 만들어질 웹애플리케이션을 spring-test 라이브러리를 사용하여 테스트를 하는 방법을 알아 봅니다. spring-test는 스프링프레임워크 3.2부터 지원되며, 스프링 MVC 컨트롤러에 대한 단위테스트를 지원합니다. 예제로 사용할 프로젝트를 전자정부표준프레임워크 3.6에 있는 템플릿을 사용해 봅니다.
1. 예제 프로젝트 만들기
- 전자정부표준프레임웍 3.7을 사용합니다. "전자정부표준프레임워크 3.7 설치하기" 를 참조하세요.
1.1. File -> New -> eGovFrame Web Project를 선택합니다.
1.2. Project name과 Maven Setting의 Group ID에 "spring_test" 를 입력합니다. Target Runtime은 Apache Tomcat v8.0을 선택하고, Dynamic Web Module version은 3.1을 선택합니다.
1.3. Generate Example 창에서 Generate Example에 체크하고 Finish 를 눌러 프로젝트를 생성합니다.
1.4. 자동으로 생성된 소스는 Servlet 2.5 버전을 사용하도록 되어 있습니다. 3.1을 사용하도록 다음과 같이 수정합니다.
- web.xml 파일 수정하기
<!-- Servlet 2.5 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- Servlet 3.1 -->
<web-app id="WebApp_ID" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
- pom.xml 파일을 수정합니다.
<!--
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
<version>2.5</version>
</dependency>
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
1.5. 프로젝트명에 마우스 오른쪽키를 눌러 Run as -> Run on server를 선택해서 실행을 해봅니다.
2. pom.xml에 메이븐 의존성을 등록합니다.
- junit 라이브러리는 단위테스트를 위한 라이브러리입니다.
- spring-test 라이브러리는 사용중인 Spring Framework 버전에 맞춥니다. 전자정부표준프레임워크 3.7은 스프링프레임워크 4.2.4.RELEASE 버전을 사용합니다.
- hamcrest 라이브러리는 테스트시 match 규칙을 유연하게 사용할 수 있도록 도와 줍니다. JUnit 4 버전부터 hamcrest-core가 포함되어 있습니다. 필요하다면 추가할 수 있겠습니다.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.maven.artifact.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
3. 테스트 케이스 기본 구조
- JUnit Test Case를 아래 이름으로 추가합니다. JUnit 4 버전을 사용합니다.
- src/test/java/com/tistory/offbyone/test/EgovSampleControllerTest.java 파일 입니다.
package com.tistory.offbyone.test;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"classpath:egovframework/spring/context-*.xml",
"file:src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml"})
@WebAppConfiguration
public class EgovSampleControllerTest {
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
}
@Test
public void testSampleList() throws Exception {
mockMvc.perform(get("/egovSampleList.do").param("pageIndex","2"))
.andExpect(status().isOk())
.andExpect(view().name("sample/egovSampleList"))
.andExpect(model().attributeExists("resultList"));
}
}
- @RunWith(SpringJUnit4ClassRunner.class) : 클래스가 스프링프레임워크의 JUnit 기능을 사용함을 나타냅니다.
- @ContextConfiguration({"...","..."}) : 스프링컨텍스트 ApplicationContext와 WebApplicationContext를 로드합니다.
- @WebAppConfiguration : 웹 애플리케이션 컨텍스트를 사용할 수 있게 합니다.
- mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build() : DispatcherServlet과 동일하게 동작합니다.
- mockMvc.perform() : 요청을 생성하고 수행합니다. ResultActions 객체를 반환합니다.
- MockMvcRequestBuilders.get(), post() 메소드를 사용합니다. 이 메소드는 MockHttpServletRequestBuilder 객체를 반환합니다.
4. 실행결과
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
전자정부표준프레임워크 3.7 에서 CSRF 설정 방법 (0) | 2018.06.16 |
---|---|
전자정부표준프레임워크 폼 검증(Form validation)하기 (10) | 2018.05.02 |
전자정부표준프레임워크 3.7 설치하기 (0) | 2018.04.27 |
Hibernate Bean Validator 사용하기(2) - 그룹과 커스텀 아노테이션 (0) | 2018.04.21 |
Hibernate Bean Validator 사용하기(1) - 기본 사용법 (0) | 2018.04.21 |