如何通过将整个战争部署到WildFly嵌入式来设置arquillian来测试maven war项目?

Geo*_*met 7 shrinkwrap jboss-arquillian wildfly

我想在嵌入式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>
Run Code Online (Sandbox Code Playgroud)

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

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

理论上,这可以用Arquillian的Maven解析器,嵌入式容器@RunAsClient,maven故障安全插件,一些arquillian.xml魔法和大量的maven魔法来实现.但实际上,我不能让这些东西一起工作,我也找不到任何适合这个场景的文档,所以我希望有人能清楚地展示它们如何协同工作.

mma*_*oka 3

听起来绝对像 ShrinkWrap Resolver Maven Importer (不要与 Maven Resolver 混淆)。以下是一些显示其用法的测试。

我有一个Gradle Importer案例的独立示例(我知道您正在使用 maven),但这里的测试构造是类似的。

我目前没有公开提供@RunAsClientMaven Importer 和 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 {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

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