在Maven构建期间测试多个JVM或库版本?

时间:2014-12-17 18:27:21

标签: java unit-testing maven jvm

上下文

基本上,我有一个库,可以在java 6,java 7和现在java 8上运行的几个应用程序中使用。

该库还依赖于一个令人毛骨悚然(但非常有用)的第三方库(我不会命名) - 一个不关心前向兼容性的库。上述应用程序也大量使用此第三方库,但并不总是能够更新到最新版本。我已经习惯了,所以我的代码中有很多“if”处理愚蠢的事情。

问题

今天我偶然发现了一个恼人的问题:第三方库中的某些方法在java 7中运行时比在java 8及更高版本中运行时具有不同的行为。

我的单元测试旨在涵盖我的代码的这一部分,并且如果它们使用正确的java /库组合运行,就会发现错误。

问题1

如何在maven构建生命周期中很好地集成并使用java 6,java 7和java 8顺序运行我的测试? (如果任何测试因任何jvm而失败,则意味着失败)

问题2

与上述相同,但是为第三方库的每个“支持”版本添加了另一个顺序运行?

(这意味着,要明确的是,如果我“支持”此lib的版本6.11,6.12,6.13和6.14以及所有3个java版本,我将运行4 * 3 = 12次我的单元测试)

1 个答案:

答案 0 :(得分:1)

我有类似的问题。我创建了一个库,应该针对其他库的不同版本(在maven central中都可用)和(但这不太重要)jvm进行测试。

我的结论:只有在maven中这样做才会很麻烦,甚至是不可能的。您还必须将环境/系统依赖项编码到构建工具中

如建议的那样,大多数集成服务器都支持矩阵测试。您也可以使用它来手动提供您需要测试的库的每个版本(如果您事先了解它们)。在gradle中,库部分应该更容易实现(但仍然没有开箱即用的支持)。

关于测试次数:是的,必须运行x * y次。如果您的代码很大,请考虑隔离使用其他库的部分,并为每个jvm只运行这个小部分x次 - 它会快一点。你也可以并行运行这些测试

ps:我正在考虑编写一个gradle插件或至少一个概念验证版本。但我认为不会很快。但我对其他贡献者开放:)