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

fcipmucu  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在写一个java库foo,它依赖于bar:1.1+,但是bar库随着时间的推移已经改变了很多,我想确保我的库与bar1.1... 1.10)的每个版本兼容。
因此,我希望(在CI期间)使用包含bar:1.X的类路径运行每个单元测试,并使用每个可用的bar版本。
我用的是gradle和junit/spock,但我对各种解决方案持开放态度。
对,我可以通过gradle测试任务进行复制,但这非常麻烦,并且测试结果可能难以聚合。理想情况下,我会在测试旁边定义它应该运行的bar版本,例如:

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

字符串
但我找不到工具/跑步机。

fkaflof6

fkaflof61#

这与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>

字符串

hlswsv35

hlswsv352#

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

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

使用多个类加载器

几年前,我遇到了这个问题,并创建了一个JUnit 5扩展来完成这个任务。
具体地说,它将使用一个专用的类路径重新加载测试类,该路径是从当前的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

配置项到sed依赖文件

无论您使用Jenkins、GitHub操作还是任何其他CI工具或服务,您都可以使用sed来更改项目依赖文件中的版本,并在循环或 * 矩阵 * 中重新运行测试以测试多个版本。

相关问题