在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框架运行相同的测试用例
实现这一目标的最佳方法是什么?我在这里看到的基本上有两种选择:
- testcase基类需要跨多个项目共享,我在不同的讨论中读到,跨项目共享测试代码是一种不好的做法
@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");
}
}