9

我有一个基于 Maven 的 Web 应用程序项目,它生成要在 Tomcat 中运行的 WAR。让我们假设,为了论证,该项目的单元测试通过网络实际发送/接收请求(而不是简单地使用模拟请求调用 servlet 方法)至关重要。

我的测试工具有什么方法可以在同一个 JVM 中运行 Tomcat 实例,加载当前项目,然后让测试用例命中它localhost?如果做不到这一点,我实际上将如何以编程方式将当前项目(连同依赖项)打包到 WAR 中,以便我可以使用 Cargo 以编程方式将其上传到其他一些 Tomcat 实例?有没有更好的选择,而不只是炮轰mvn

我知道我的请求不寻常,单元测试应该更加独立,等等,但请让我们一起玩吧:)

4

4 回答 4

7

您可以为此目的使用嵌入式 Tomcat 。只需在您的测试工具中设置一个静态实例,然后在最后将其关闭。这是一些示例代码:

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.junit.AfterClass;
import org.junit.BeforeClass;

public class TomcatIntegrationTest {
  private static Tomcat t;
  private static final int TOMCAT_PORT = 9999;

  @BeforeClass
  public static void setUp() throws LifecycleException {
    t = new Tomcat();
    t.setBaseDir(".");
    t.setPort(TOMCAT_PORT);
    /* There needs to be a symlink to the current dir named 'webapps' */
    t.addWebapp("/service", "src/main/webapp"); 
    t.init();
    t.start();
  }

  @AfterClass
  public static void shutDownTomcat() throws LifecycleException {
    t.stop();
  }
}
于 2012-11-17T01:02:20.400 回答
6

Jetty 非常适合这个目的。如果您不拘泥于必须拥有 Tomcat,则可以在集成测试阶段轻松使用它。让预集成启动码头,并在集成后停止它,您可以在您的战争文件中抛出请求,因为它在实际容器中运行。

于 2012-11-16T04:49:53.553 回答
2

我建议创建适当的集成测试并使用以下设置在 maven 构建期间进行集成测试。

您可以使用以下部分来下载 tomcat,或者如果您需要使用存储库中的工件。

<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<configuration>
    <wait>false</wait>
    <container>
        <containerId>tomcat${tomcat.major}x</containerId>
        <zipUrlInstaller>
            <url>http://archive.apache.org/dist/tomcat/tomcat-${tomcat.major}/v${tomcat.version}/bin/apache-tomcat-${tomcat.version}.tar.gz</url>
            <extractDir>${project.build.directory}/extract/</extractDir>
            <downloadDir>${project.build.directory}/download/</downloadDir>
        </zipUrlInstaller>
        <output>${project.build.directory}/tomcat${tomcat.major}x.log</output>
        <log>${project.build.directory}/cargo.log</log>
    </container>
    <configuration>
        <home>${project.build.directory}/tomcat-${tomcat.version}/container</home>
        <properties>
            <cargo.logging>high</cargo.logging>
            <cargo.servlet.port>9080</cargo.servlet.port>
            <cargo.tomcat.ajp.port>9008</cargo.tomcat.ajp.port>
        </properties>
    </configuration>
</configuration>

下一部分用于启动并将您的应用程序部署到给定的 tomcat(也与码头一起使用)。

  <executions>
    <execution>
        <id>start-container</id>
        <phase>pre-integration-test</phase>
        <goals>
            <goal>start</goal>
            <goal>deploy</goal>
        </goals>
        <configuration>
            <deployer>
                <deployables>
                    <deployable>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>mod-war</artifactId>
                        <type>war</type>
                        <pingURL>http://localhost:9080/mod-war</pingURL>
                        <pingTimeout>30000</pingTimeout>
                        <properties>
                            <context>mod-war</context>
                        </properties>
                    </deployable>
                </deployables>
            </deployer>
        </configuration>
    </execution>

当然最后通过以下方式停止启动的服务器:

<execution>
    <id>stop-container</id>
    <phase>post-integration-test</phase>
    <goals>
        <goal>stop</goal>
    </goals>
</execution>

最好的办法是将这种配置等放入一个单独的 maven 模块中,该模块可能称为 app-it(用于集成测试)。完整的测试周期可以简单地调用

mvn verify

而在验证生命周期中,集成测试阶段将运行并启动上述配置。但重要的是配置maven-failsafe-plugin以使集成测试本身运行。关于这个的详细描述可以在Maven 单元和集成测试指南中找到

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.12</version>
  <executions>
    <execution>
      <id>integration-test</id>
      <goals>
        <goal>integration-test</goal>
      </goals>
    </execution>
    <execution>
      <id>verify</id>
      <goals>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
于 2012-11-16T08:33:06.030 回答
0

您可以做的是使用来自 Apache 的 tomcat maven 插件生成原型,请参见http://tomcat.apache.org/maven-plugin-2.0/archetype.html

您将获得各种样本:

  • 嵌入junit测试
  • 启动一个带有战争的tomcat实例并运行硒测试

高温高压

于 2012-11-16T08:59:16.520 回答