Maven Failsafe 플러그인을 사용하여 결합 테스트 자동화

Maven Failsafe Plugin 을 이용하면 결합 테스트를 자동화할 수 있음을 알았으므로 비망록으로 기재한다.

예를 들어, 다음과 같은 테스트를 자동화하고 싶을 때 사용할 수 있습니다.


  • 서블릿, 필터로 응답 정보를 작성하는 애플리케이션에 요청을 던져 예상대로 응답이 반환되는지 확인한다.

  • 샘플 프로그램



    환경


  • Apache Tomcat
  • JUnit

  • 애플리케이션 구현


  • 아래 Maven 아키타입으로 Maven 프로젝트 만들기
  • 다음과 같은 형태로 종속성 정의

    pom.xml
        <dependencies>
            <!-- Servlet API -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
            <!-- クライアント -->
            <dependency>
                <groupId>org.glassfish.jersey.core</groupId>
                <artifactId>jersey-client</artifactId>
                <version>2.28</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.inject</groupId>
                <artifactId>jersey-hk2</artifactId>
                <version>2.28</version>
                <scope>test</scope>
            </dependency>
            <!-- JUnit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  • 아래 소스 코드 준비

  • DemoServlet.java
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/demo")
    public class DemoServlet extends HttpServlet {
    
        private static final long serialVersionUID = 2564544155028547344L;
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.getWriter().println("body");
        }
    }
    
    

    DemoFilter.java
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    
    @WebFilter("/demo")
    public class DemoFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
            wrapper.setHeader("Header-Name", "value");
            chain.doFilter(request, wrapper);
        }
    
        @Override
        public void destroy() {
        }
    }
    
  • 아래 테스트 코드 준비

  • DemoIT.java
    import static org.junit.Assert.assertEquals;
    
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.core.Response;
    
    import org.junit.Test;
    
    public class DemoIT {
    
        @Test
        public void test() {
            // サーバーへリクエスト送信
            Response response = ClientBuilder.newClient().target("http://localhost:8080/sample-it/demo").request().get();
            // フィルターが想定通り動作していることを確認
            assertEquals("value", response.getHeaderString("Header-Name"));
            // サーブレットが想定通り動作していることを確認
            assertEquals("body", response.readEntity(String.class).trim());
        }
    }
    

    Failsafe 플러그인 정의



    그 후,
  • 응용 프로그램 서버 시작
  • 서버에 응용 프로그램 배포
  • 테스트 클래스 실행
  • 응용 프로그램 서버 중지

  • 의 흐름으로 처리를 자동 실행시키도록 한다.

    이를 위해 Failsafe 플러그인을 사용합니다.
    (Failsafe 플러그인은 테스트 실행을 제어할 수 있는 플러그인. 위와 같이 테스트 실행의 전처리나 후처리를 정의할 수 있다.)
    서버 시작 응용 프로그램 배포는 Failsafe 플러그인에서 사용할 수 없으므로,
    Apache Tomcat Maven 플러그인 를 이용.
    다음이 설정.

    pom.xml
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <version>3.0.0-M3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- Tomcat操作用プラグイン -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <executions>
                        <!-- テスト実行前処理 -->
                        <execution>
                            <id>run</id>
                            <phase>pre-integration-test</phase>
                            <goals>
                                <!-- Tomcat起動・アプリケーションのデプロイ -->
                                <goal>run</goal>
                            </goals>
                            <!-- run以降のゴールが実行できるようにするための設定 -->
                            <configuration>
                                <fork>true</fork>
                            </configuration>
                        </execution>
                        <!-- テスト実行後処理 -->
                        <execution>
                            <id>shutdown</id>
                            <phase>post-integration-test</phase>
                            <goals>
                                <!-- Tomcat停止 -->
                                <goal>shutdown</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    테스트는 다음 명령을 실행하여 수행 할 수 있습니다.
    mvn clean verify
    

    Spring Boot계는 SprintBootTest를 사용하면, 결합 테스트도 자동화할 수 있을 것 같기 때문에 Failsafe 플러그인을 이용할 가치는 없을지도 모른다. 다만, Spring MVC 등 서버에 배치하지 않으면 안 되는 어플리케이션의 경우는, 본 플러그인을 이용하면 자동화할 수 있다. 민첩 등 사양 변경이 많이 발생하는 경우에는 사용할 수있을 것.

    좋은 웹페이지 즐겨찾기