在Java中使用不同的部署配置运行相同的测试用例

在Java中使用不同的部署配置运行相同的测试用例,java,gradle,multi-project,Java,Gradle,Multi Project,我有以下多模块项目结构 根目录 | | ----带有arquillian测试用例的项目A | | ----project B构建war并使用不同的部署配置运行相同的测试 我想用两种不同的部署配置运行我的测试用例 在项目A中,我使用Arquillian运行测试用例。然后,在项目B中构建war之后,我使用testcontainers框架运行相同的测试用例 实现这一目标的最佳方法是什么?我在这里看到的基本上有两种选择: 在项目A和项目B中复制相同的测试用例 具有包含testcases的基类,该基类由覆

我有以下多模块项目结构

根目录
|
|
----带有arquillian测试用例的项目A
|
|
----project B构建war并使用不同的部署配置运行相同的测试

我想用两种不同的部署配置运行我的测试用例

在项目A中,我使用Arquillian运行测试用例。然后,在项目B中构建war之后,我使用testcontainers框架运行相同的测试用例

实现这一目标的最佳方法是什么?我在这里看到的基本上有两种选择:

  • 在项目A和项目B中复制相同的测试用例
  • 具有包含testcases的基类,该基类由覆盖部署配置方法的特定类扩展
  • 对于我通常更喜欢的方法2,我看到了一些问题:

    • testcase基类需要跨多个项目共享,我在不同的讨论中读到,跨项目共享测试代码是一种不好的做法
    那你觉得呢?你们会怎么做?如果您知道除了复制代码或扩展之外的其他方法来共享测试用例,请告诉我

    提前谢谢

    示例方法1:

    项目A包含以下testclass:

    @RunWith(Arquillian.class)
    public class YTest
    {
    @ArquillianResource
    private URL webappUrl;
    
    /**
     * @return {@link JavaArchive}
     */
    @Deployment(name = "myservice")
    public static Archive<?> createTestArchive()
    {
        final WebArchive archive = ShrinkWrap
            .create(WebArchive.class, "myservice.war")
            .addClasses(X.class, Y.class);
    
        return archive;
    }
    
    private WebTarget webTarget()
    {
        return ClientBuilder.newClient().target(webappUrl.toExternalForm());
    }
    
    @Test
    public void whenPostServiceShouldReturn200() throws IOException
    {
        final Response response = webTarget()
            .path("/myservice")
            .request()
            .header("Content-Type", "application/json")
            .post(Entity.entity(TestDataGeneration.generatePayload, MediaType.APPLICATION_JSON_TYPE));
    
        assertEquals(200, response.getStatus());
    }
    }
    
    public class Y2Test
    {
    private static final Logger LOGGER = LoggerFactory.getLogger(Y2Test.class);
    
    @ClassRule
    public static GenericContainer<?> webAppContainer = new GenericContainer<>(
        new ImageFromDockerfile().withFileFromPath("..", new File("..").toPath()))
            .withLogConsumer(new Slf4jLogConsumer(LOGGER))
            .withExposedPorts(9080);
    
    
    private WebTarget webTarget()
    {
        return ClientBuilder
            .newClient()
            .target(
                "http://"
                    + webAppContainer.getContainerIpAddress()
                    + ":"
                    + webAppContainer.getMappedPort(9080)
                    + "/provisioning-service");
    }
    
    @Test
    public void whenPostServiceShouldReturn200() throws IOException
    {
        final Response response = webTarget()
            .path("/myservice")
            .request()
            .header("Content-Type", "application/json")
            .post(Entity.entity(TestDataGeneration.generatePayload(), MediaType.APPLICATION_JSON_TYPE));
    
        assertEquals(200, response.getStatus());
    }
    }
    

    @RunWith(Arquillian.class)
    公共类YTest扩展了YTestCases
    {
    @阿奎利安资源
    私有URL-webappUrl;
    /**
    *@return{@link JavaArchive}
    */
    @部署(name=“myservice”)
    公共静态存档createTestArchive()
    {
    最终WebArchive归档=收缩包装
    .create(WebArchive.class,“myservice.war”)
    .增加等级(A级、B级);
    归还档案;
    }
    @凌驾
    WebTarget WebTarget()
    {
    返回ClientBuilder.newClient().target(webappUrl.toExternalForm());
    }
    }
    
    项目B包含以下testclass,它现在只扩展basetestcases类

    public class Y2T extends YTestCases
    {
    private static final Logger LOGGER = LoggerFactory.getLogger(Y2T.class);
    @ClassRule
    public static GenericContainer<?> webAppContainer = new GenericContainer<>(
        new ImageFromDockerfile().withFileFromPath("..", new File("..").toPath()))
            .withLogConsumer(new Slf4jLogConsumer(LOGGER))
            .withExposedPorts(9080);
    
    @Override
    WebTarget webTarget()
    {
        // cassandra.getContainerIpAddress();
        // cassandra.getMappedPort(9042);
        return ClientBuilder
            .newClient()
            .target(
                "http://"
                    + webAppContainer.getContainerIpAddress()
                    + ":"
                    + webAppContainer.getMappedPort(9080)
                    + "/myservice");
    }
    }
    
    公共类Y2T扩展了YTestCases
    {
    专用静态最终记录器Logger=LoggerFactory.getLogger(Y2T.class);
    @阶级规则
    公共静态GenericContainer webAppContainer=新的GenericContainer(
    新建ImageFromDockerfile().withFileFromPath(“..”,新建文件(“..”).toPath())
    .withLogConsumer(新Slf4jLogConsumer(记录器))
    .具有暴露端口(9080);
    @凌驾
    WebTarget WebTarget()
    {
    //getContainerIpAddress();
    //卡桑德拉·格特马佩德波特(9042);
    返回客户端生成器
    .newClient()
    .目标(
    “http://”
    +webAppContainer.getContainerIpAddress()
    + ":"
    +webAppContainer.getMappedPort(9080)
    +“/myservice”);
    }
    }
    
    不完全确定项目的功能,但您可以将测试导出为依赖项(JAR),然后在任意位置引用它。如果我在你的位置上,我会用一个“虚拟”测试为此创建一个小样本项目(带有多个模块)。由于要共享的代码在测试中,我需要将它们导出为测试jar,然后将其作为测试依赖项添加到我读到的另一个项目中,这是一种不好的做法。嗯,不确定这是否是一种不好的做法(我还没有做过这样的事情)。因为你问“你们做得怎么样?”,所以很难回答你的问题。我建议你制作一个(在本例中是一个示例项目,其中你实现了你的1.或2.想法)。这将帮助我回答这个问题,因为尽管这是一个有趣的问题(对我来说)它假设了太多的未知数,让我无法认真研究。我已经测试了这两种方法,两种方法都有效。分享它有点困难,但我会尝试。
    @RunWith(Arquillian.class)
    public class YTest extends YTestCases
    {
    @ArquillianResource
    private URL webappUrl;
    
    /**
     * @return {@link JavaArchive}
     */
    @Deployment(name = "myservice")
    public static Archive<?> createTestArchive()
    {
        final WebArchive archive = ShrinkWrap
            .create(WebArchive.class, "myservice.war")
            .addClasses(A.class, B.class);
    
        return archive;
    }
    
    @Override
    WebTarget webTarget()
    {
        return ClientBuilder.newClient().target(webappUrl.toExternalForm());
    }
    }
    
    public class Y2T extends YTestCases
    {
    private static final Logger LOGGER = LoggerFactory.getLogger(Y2T.class);
    @ClassRule
    public static GenericContainer<?> webAppContainer = new GenericContainer<>(
        new ImageFromDockerfile().withFileFromPath("..", new File("..").toPath()))
            .withLogConsumer(new Slf4jLogConsumer(LOGGER))
            .withExposedPorts(9080);
    
    @Override
    WebTarget webTarget()
    {
        // cassandra.getContainerIpAddress();
        // cassandra.getMappedPort(9042);
        return ClientBuilder
            .newClient()
            .target(
                "http://"
                    + webAppContainer.getContainerIpAddress()
                    + ":"
                    + webAppContainer.getMappedPort(9080)
                    + "/myservice");
    }
    }