首页 文章

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

提问于
浏览
7

我想在嵌入式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测试需要满足以下要求:

  • Deploy the entire war 到测试中的app服务器 . 这包括所有 生产环境 类,所有运行时依赖项和所有 src/main/webapp 文件 . 从维护的角度来看,微型部署是不可能的,因为类依赖性和jar依赖性经常发生变化 . 所以我们不能枚举ShrinkWrap部署中的任何内容 .
    测试中的

  • Don't hardcode anything 或arquillian.xml that is already known by the maven pom.xml . 这包括版本字符串,依赖项列表,包或类列表,应用服务器安装目录等 .

  • Don't use more than 1 maven module . 我测试我的战争的测试属于产生战争的同一个maven模块的测试文件夹 .

  • 签出我的代码的用户需要能够如此简单地运行测试:
    只需用IntelliJ打开 pom.xml

  • Tests needs to run from IntelliJ .

  • 使用WildFly嵌入式容器,因此不需要先安装任何东西,不需要先运行任何进程,而且首先必须运行 no JBOSS_HOME environment variable needs to be set .

  • 我只对黑盒测试感兴趣,所以我的所有测试都可以作为客户端运行 .

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

1 回答

  • 3

    绝对听起来像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部署?战争是在测试执行后创建的,这意味着如果战争在测试执行期间存在,那么它来自之前的构建并且已经过时 .

相关问题