如何针对多个版本的依赖项运行单元测试

问题描述 投票:0回答:2

我正在编写一个java库

foo
,它依赖于
bar:1.1+
。 但随着时间的推移,库
bar
发生了很大的变化,我想确保我的库与
bar
的每个版本兼容(
1.1
...
1.10
)。

所以我想(在 CI 期间)使用包含

bar:1.X
的类路径运行每个单元测试,并且每个版本都可用
bar

我正在使用 gradle 和 junit/spock,但我愿意接受各种变化的解决方案。

是的,我可以通过 gradle 测试任务来复制,但这相当麻烦,而且测试结果可能很难汇总。 理想情况下,我会在测试旁边定义它应该运行的 bar 版本,例如:

@RunWith("com.acme:bar:1.1..1.10")
public class MyTest { ... }

但我找不到相应的工具/运行程序。

java unit-testing junit gradle spock
2个回答
0
投票

这与 Maven 有关,不确定它如何与 CI 配合,但可能会帮助您入门。

一种选择可能是使用 Maven Archetype

<-
更多信息

使用

mvn archetype:generate
,您可以动态生成您需要的版本的项目

mvn archetype:generate                                  
  -DarchetypeGroupId=<archetype-groupId>                
  -DarchetypeArtifactId=<archetype-artifactId>          
  -DarchetypeVersion=<archetype-version>                
  -DgroupId=<my.groupid>                                
  -DartifactId=<my-artifactId>
  -Dversion=<custom-version>

0
投票

就我现在而言,至少有三种方法可以做到这一点。

  • 使用多个类加载器
  • 利用 maven-invoker-plugin 运行示例项目
  • 将 CI 配置为 sed 依赖文件(pom.xml、build.gradle.kts 等)

使用多个类加载器

几年前我遇到过这个问题,并创建了一个 JUnit5 扩展来实现这一点。
具体来说,它将使用从当前 Maven 描述符构建的专用类路径重新加载测试类,并使用 Maven 下载缺少的内容。
针对同一依赖项的多个版本测试某些内容将如下所示:

@CompatibilityTestWithClasspath(dependencies = {
  "com.acme:bar:[1.1, 1.2, ..., 1.10]"
})
void sample() {
  // test what you want
}

这是扩展的来源:https://github.com/fridujo/classpath-junit-extension

利用 maven-invoker-plugin 运行示例项目

您可以使用

maven-invoker-plugin
进行多次执行,以在同一项目中使用不同变量运行测试。
在插件的配置中,您将拥有与要测试的版本一样多的执行,每个执行都指定要替换的属性值(使用
filterProperties
标签) 以下是使用此机制的项目示例:https://github.com/fridujo/rabbitmq-mock

将 CI 配置为 sed 依赖文件

无论您使用 Jenkins、GitHub 操作还是任何其他 CI 工具或服务,您都可以使用

sed
来更改项目依赖项文件中的版本,并在循环或矩阵中重新运行测试 针对多个版本进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.