【问题标题】:How do I setup arquillian to test a maven war project by deploying the entire war to WildFly embedded?如何通过将整个战争部署到 WildFly 嵌入式来设置 arquillian 来测试 maven 战争项目?
【发布时间】:2015-12-04 03:12:19
【问题描述】:

我想在嵌入式 WildFly 实例上对我的战争进行宏观(不是微观!)黑盒测试。

我的 maven 项目是这样的

<project>
  ...
  <packaging>war</packaging>

  <!-- Lots of classes in src/main/webapp and files in src/main/webapp -->
  <dependencies>
    <!-- Lots of compile/runtime dependencies that change very frequently -->
    <!-- Lots of test dependencies that change very frequently -->
  </dependencies>
</project>

我的 arquillian 测试需要满足以下要求:

  • 将整个战争部署到测试中的应用服务器。这包括所有生产类、所有运行时依赖项和所有src/main/webapp 文件。从维护的角度来看,进行微部署是不可能的,因为类依赖和 jar 依赖变化非常频繁。因此,我们无法枚举 ShrinkWrap 部署中的任何内容。
  • 不要在测试或 arquillian.xml 中对 maven pom.xml 已知的任何内容进行硬编码。这包括版本字符串、依赖列表、包或类列表、应用服务器安装目录等。
  • 不要使用超过 1 个 maven 模块。我测试我的战争的测试属于产生战争的同一 maven 模块的 test 文件夹中。
  • 签出我的代码的用户需要能够简单地运行测试:
    • 测试需要从 IntelliJ 运行,只需使用 IntelliJ 打开 pom.xml
    • 使用 WildFly 嵌入式容器,因此无需先安装任何东西,无需先运行任何进程,并且绝对无需设置 JBOSS_HOME 环境变量
  • 我只对黑盒测试感兴趣,所以我的所有测试都可以作为客户端运行

理论上,这一切都可以通过 Arquillian 的 Maven 解析器、嵌入式容器、@RunAsClient、maven 故障安全插件、一些 arquillian.xml 魔术和许多 maven 魔术来实现。但在实践中,我无法让这些东西一起工作,我也找不到任何能体面地涵盖这种情况的文档,所以我希望有人能清楚地展示他们如何一起工作。

【问题讨论】:

  • 如果你考虑宏测试,你可以看看arquillian-suite-extension 或者完全放弃Arquillian。为什么?因为 Arquillian 是关于微部署的,而您似乎并非如此。同样使用嵌入式 JEE 应用服务器就像 asking for troubles...
  • Vanilla Arquillian 应该真正支持 arquillian-suite-extension 开箱即用的功能!

标签: wildfly jboss-arquillian shrinkwrap


【解决方案1】:

听起来确实像是 ShrinkWrap Resolver Maven Importer 的案例(不要与 Maven Resolver 混淆)。 Here 是一些显示其用法的测试。

我有一个单独的示例,仅适用于 Gradle Importer(我知道您使用的是 maven),但测试结构与 here 类似。

我目前没有公开可用的完整示例 @RunAsClient 和 Maven Importer,但我有一个项目将它们与 Graphene 一起使用,并且这种组合确实有效:)。一般来说,测试应该如下所示:

@RunWith(Arquillian.class)
public class SomeControllerIT {

    @Deployment
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(MavenImporter.class).loadPomFromFile("pom.xml").importBuildOutput()
            .as(WebArchive.class);
    }

    @Test
    @RunAsClient
    public void shouldDoSth() throws Exception {
      ...
   }
}

为什么要使用 Maven Importer 而不是 war 部署? War 是在测试执行之后创建的,这意味着如果在测试执行期间存在 War,那么它来自之前的构建并且已经过时。

【讨论】:

  • 谢谢,进口商工作!我仍然得到这个:[WARN Failed to define class org.optaconf.service.ConferenceServiceArquillianTest in Module "deployment.optaconf-webapp.war:main" from Service Module Loader: java.lang.LinkageError: Failed to link org/optaconf/service/ConferenceServiceArquillianTest (Module "deployment.optaconf-webapp.war:main" from Service Module Loader) ... Caused by: java.lang.NoClassDefFoundError: org/optaconf/service/AbstractArquillianTest。看起来 arquillian 仍在尝试将测试类添加到 wildfly 类路径,即使它是 RunAsClient 测试?
  • 请另外尝试@Deployment(testable = false)
  • 这个方法不支持很多maven插件,所以不保证能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
相关资源
最近更新 更多