본문 바로가기
프로그래밍/스프링프레임워크

spring-test - 테스트 프로젝트 및 테스트 케이스 기본구조

by pentode 2018. 5. 1.

스프링프레임워크로 만들어질 웹애플리케이션을 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. 실행결과


반응형