当前位置 : 主页 > 网络安全 > 测试自动化 >

glassfish – Arquillian – 程序化配置

来源:互联网 收集:自由互联 发布时间:2021-06-19
我正在使用Arquillian和使用TestNG的嵌入式glassfish 3.1.2.2编写集成测试.我希望能够并行运行这些测试,对于这种情况,我需要动态配置glassfish端口和数据库名称(我们已经有了这个设置,我想重
我正在使用Arquillian和使用TestNG的嵌入式glassfish 3.1.2.2编写集成测试.我希望能够并行运行这些测试,对于这种情况,我需要动态配置glassfish端口和数据库名称(我们已经有了这个设置,我想重用它的arquillian测试).我缺少的是一个’before container start’钩子,我可以准备数据库,查找空闲端口并更新我的glassfish配置(domain.xml,也可以是glassfish-resources.xml).是否有一个“干净”的解决方案,或Arquillian开发人员没有预见到我的用例?

我目前解决它的hacky方法是覆盖arquillian的beforeSuite方法,但是这个方法被调用两次 – 在测试启动时然后在容器中(因此我可怜的静态标志).其次,这个解决方案不适用于基于JUnit的测试,因为在套件之前无法拦截arquillian:

public class FullContainerIT extends Arquillian {

    private static boolean dbInitialized;

    //@RunAsClient <-supported by @Test only
    @Override
    @BeforeSuite(groups = "arquillian", inheritGroups = true)
    public void arquillianBeforeSuite() throws Exception {
        if (dbInitialized == false) {
            initializeDb();
            dbInitialized = true;
        }
        super.arquillianBeforeSuite();
    }
}

我有一些想法:
  @BeforeSuite @RunAsClient似乎是我需要的,但@RunAsClient仅支持@Test;
  我在Arquillian JavaDocs看过org.jboss.arquillian.container.spi.event.container.BeforeStart事件,但我不知道如何听Arquillian事件;
  我已经看到有可能让@Deployment创建一个ShrinkWrap Descriptor,但这些不支持Glassfish资源.

我在 JBoss forum上为我的问题找到了一个干净的解决方案.您可以注册一个LoadableExtension SPI并修改arquillian配置(从xml加载).这是我可以创建数据库并使用适当的值过滤glassfish-resources.xml的地方.设置如下所示:

package com.example.extenstion;

public class AutoDiscoverInstanceExtension 
                 implements org.jboss.arquillian.core.spi.LoadableExtension {

    @Override
    public void register(ExtensionBuilder builder) {
        builder.observer(LoadContainerConfiguration.class);
    }
}

package com.example.extenstion;

public class LoadContainerConfiguration {

    public void registerInstance(@Observes ContainerRegistry, ServiceLoader serviceLoader) {

        //Do the necessary setup here
        String filteredFilename = doTheFiltering();

        //Get the container defined in arquillian.xml and modify it
        //"default" is the container's qualifier 
        Container definition = registry.getContainer("default");
        definition.getContainerConfiguration()
                .property("resourcesXml", filteredFilename);
    }
}

您还需要通过创建文件来配置SPI扩展
META-INF /服务/ org.jboss.arquillian.core.spi.LoadableExtension
这个内容:

com.example.extenstion.AutoDiscoverInstanceExtension
网友评论