반응형
이 글은 Jetty 6 버전 기준이긴 하지만, 플러그인 버전이나 의존 라이브러리에서 차이가 날 뿐 Jetty 7 버전에서도 크게 다르지 않다.
Jetty 서버를 임베딩하기 위한 pom.xml 설정
Maven 프로젝트에서 Jetty 서버를 임베딩하려면 먼저 Jetty 관련 클래스들을 사용할 수 있어야 하므로, 아래와 같이 의존 라이브러리에 Jetty 관련 artifact를 추가해 준다.
위 설정에서 눈여겨 볼 점은 서블릿/JSP API를 위한 artifact는 provided 범위를 갖는 반면에 Jetty 자체를 임베딩해서 실행하기 위한 artifact는 test 범위를 갖는다는 것이다. test 범위를 갖도록 한 이유는 Jetty 임베딩을 ATDD를 위한 용도로만 사용하기 때문이다.
Jetty 서버 임베딩으로 실행하기
Maven 프로젝트 구조에서 Jetty 서버를 임베딩으로 실행하고 종료하는데 사용된 코드는 다음과 같다.
ATDD를 수행하는 코드에서는 다음과 같이 픽스처 구성시 JettyServer.start() 메서드를 이용해서 Jetty 서버를 임베딩해서 실행하고, 테스트 완료 후 JettyServer.stop() 메서드를 이용해서 Jetty 서버를 중지시켜주면 된다.
일단, Jetty 서버를 임베딩으로 실행하면 http://localhost:9090/goodjob/authentication/login 과 같은 URL을 이용해서 실제 기능 테스트를 수행할 수 있다. 예를 들어, 웹 기능 테스트를 위한 코드는 아래와 같은 구성을 갖게 된다.
Jetty 서버를 임베딩하기 위한 pom.xml 설정
Maven 프로젝트에서 Jetty 서버를 임베딩하려면 먼저 Jetty 관련 클래스들을 사용할 수 있어야 하므로, 아래와 같이 의존 라이브러리에 Jetty 관련 artifact를 추가해 준다.
<dependencies>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-api-2.1</artifactId>
<version>6.1.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
<version>6.1.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.14</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1</artifactId>
<version>6.1.14</version>
<scope>test</scope>
</dependency>
...
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-api-2.1</artifactId>
<version>6.1.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
<version>6.1.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.14</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1</artifactId>
<version>6.1.14</version>
<scope>test</scope>
</dependency>
...
위 설정에서 눈여겨 볼 점은 서블릿/JSP API를 위한 artifact는 provided 범위를 갖는 반면에 Jetty 자체를 임베딩해서 실행하기 위한 artifact는 test 범위를 갖는다는 것이다. test 범위를 갖도록 한 이유는 Jetty 임베딩을 ATDD를 위한 용도로만 사용하기 때문이다.
Jetty 서버 임베딩으로 실행하기
Maven 프로젝트 구조에서 Jetty 서버를 임베딩으로 실행하고 종료하는데 사용된 코드는 다음과 같다.
public class JettyServer {
private static Server server;
public static void start() throws Exception {
server = new Server(9090);
WebAppContext context = new WebAppContext();
context.setResourceBase("src/main/webapp");
context.setContextPath("/goodjob");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
}
public static void stop() throws Exception {
server.stop();
}
}
private static Server server;
public static void start() throws Exception {
server = new Server(9090);
WebAppContext context = new WebAppContext();
context.setResourceBase("src/main/webapp");
context.setContextPath("/goodjob");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
}
public static void stop() throws Exception {
server.stop();
}
}
ATDD를 수행하는 코드에서는 다음과 같이 픽스처 구성시 JettyServer.start() 메서드를 이용해서 Jetty 서버를 임베딩해서 실행하고, 테스트 완료 후 JettyServer.stop() 메서드를 이용해서 Jetty 서버를 중지시켜주면 된다.
public class EndToEndTestBase {
@BeforeClass
public static void init() throws Exception {
JettyServer.start();
}
@AfterClass
public static void close() throws Exception {
JettyServer.stop();
}
}
@BeforeClass
public static void init() throws Exception {
JettyServer.start();
}
@AfterClass
public static void close() throws Exception {
JettyServer.stop();
}
}
일단, Jetty 서버를 임베딩으로 실행하면 http://localhost:9090/goodjob/authentication/login 과 같은 URL을 이용해서 실제 기능 테스트를 수행할 수 있다. 예를 들어, 웹 기능 테스트를 위한 코드는 아래와 같은 구성을 갖게 된다.
public class AllTeamsSummaryReportEndToEndTest extends EndToEndTestBase {
@BeforeClass
public static void initData() throws Exception {
// 테스트 목적을 위한 데이터 초기화
...
}
@Test
public void queryAllTeamsWeekSummaryReport() throws Throwable {
// HtmlUnit이나 HttpClient와 같은 라이브러리를 이용해서
// http://localhost:9090/goodjob/testurl 등 테스트 URL에 연결하고
// 그 결과를 검증하는 코드 삽입
}
}
@BeforeClass
public static void initData() throws Exception {
// 테스트 목적을 위한 데이터 초기화
...
}
@Test
public void queryAllTeamsWeekSummaryReport() throws Throwable {
// HtmlUnit이나 HttpClient와 같은 라이브러리를 이용해서
// http://localhost:9090/goodjob/testurl 등 테스트 URL에 연결하고
// 그 결과를 검증하는 코드 삽입
}
}