如何为打包为WAR文件的Maven项目编写自动验收测试?

时间:2013-01-16 15:30:55

标签: java eclipse maven testing dependencies

我已经获得了需要测试的现有Java应用程序(我们称之为“WebApp”)的源代码。它作为WAR文件部署到Glassfish中。这是客户代码,因此如果我能帮助它,我们希望避免修改WebApp POM。

所以我正在创建一个单独的项目(在Eclipse中)来进行测试。新项目需要直接在各种WebApp类上调用方法。我尝试将WAR文件引用为Maven依赖项,但在执行此操作后,它不会显示在Eclipse中的Maven依赖项中 - 请参阅下文:

WebApp
    src/main/java
    ...
    pom.xml

WebAppTest
    src/main/test
        test.package.name
            webAppAcceptanceTestIT.java
    Maven Dependencies
        junit-4.6.jar
        mockito-all-1.9.5.jar
        <<< No WebApp war/jars here >>>

WebAppTest的pom中的依赖关系如下:

<dependency>
    <groupId>...</groupId>
    <artifactId>webapp</artifactid>
    <version>...</version>
    <type>war</type>
    <scope>compile</scope>
</dependency>

尝试了type=jarscope=test,但这些都没有达到标记。不确定我是否遗漏了某些东西或者错误的方式?我应该使用Maven模块吗?不要让事情过于复杂。当然,我可以欺骗并将WebApp添加到WebAppTest的构建路径中,但我希望能够正确使用它,以便在部署时能够正常工作。

另一个问题 - WebAppTest应该打包为WAR还是JAR?它只包含执行WebApp代码和检查结果的测试。我认为它仍然需要作为WAR文件部署到Glassfish中吗?

1 个答案:

答案 0 :(得分:2)

您有多种选择,按优先顺序递减:

使用HTTP(仅)进行验收测试

部署war,向其发出HTTP请求,单独检查数据库。无法访问webapp的类。这是最干净的选择,而且最易于维护。

集装箱内测试

使用Arquillian将应用程序与测试一起部署并运行它们。 您需要在原始战争的POM中将attachClasses添加到maven-war-plugin的配置中。您的测试项目需要依赖[artifactid]-classes而不是artifactid。您的测试在Glassfish中运行(Arquillian处理启动Glassfish并部署战争)。

Arquillian有一点学习曲线。

远程公开WebApp类

使用类似Spring的HTTPInvoker的方法将要测试的类公开给测试代码。您的测试在单独的JVM中运行到Glassfish,并使用HTTP连接到测试中的类。您仍然需要像容器内的情况一样更改POM。如果您的WAR不是基于Spring的,并且对原始应用程序非常具有侵入性,那么这可能会很棘手。您也可能遇到序列化问题。