Java 在预编译项目上使用Maven运行测试

Java 在预编译项目上使用Maven运行测试,java,maven,unit-testing,testing,maven-surefire-plugin,Java,Maven,Unit Testing,Testing,Maven Surefire Plugin,使用Maven,我想在预编译/预jar的多模块项目上运行单元测试和集成测试。我觉得这非常困难 我的业务案例是,我想在一个地方编译和构建一个多模块Maven项目,然后让单元测试和集成测试使用不同的Java版本在不同的操作系统上运行,以检查兼容性。让我们说{java8,java10}x{Ubuntu,Windows}来保持简单 我希望以一种速度编译和安装jar的原因是,我希望确保对实际交付的代码运行测试。如果我在任何地方重新编译,我担心可能会在无意中引入错误 一种解决方案是在Ubuntu上执行mvn

使用Maven,我想在预编译/预jar的多模块项目上运行单元测试和集成测试。我觉得这非常困难

我的业务案例是,我想在一个地方编译和构建一个多模块Maven项目,然后让单元测试和集成测试使用不同的Java版本在不同的操作系统上运行,以检查兼容性。让我们说{java8,java10}x{Ubuntu,Windows}来保持简单

我希望以一种速度编译和安装jar的原因是,我希望确保对实际交付的代码运行测试。如果我在任何地方重新编译,我担心可能会在无意中引入错误

一种解决方案是在Ubuntu上执行
mvn部署-DaltDeploymentRepository=$mydir
,生成一个编译过的项目树和一个装满JAR的目录;然后压缩项目树和部署目录,并将它们发送到Windows计算机;在项目树上运行的是
mvnsurefire:test-Dmaven.repo.local=$mydir

这是可行的,但很笨拙。Surefire似乎读取项目树中的测试类,并使用部署repo中相同项目+jar依赖项中的类进行链接。有一个问题是,
-Dmaven.repo.local
Maven需要再次下载所有第三方依赖项,因为该repo只包含我的项目工件。所以是固溶体,但不是很好

相反,我一直试图做的是,只使用编译后的项目树:

  • 如果我只是执行
    mvnsurefire:test
    我在解决依赖项时会遇到问题
  • 我尝试了
    mvn compile-Dmaven.main.skip surefire:test
    来修复依赖项解析,这似乎很有效-只是不适用于测试依赖项
  • 我进一步尝试了
    mvn compile-Dmaven.main.skip test compile-Dmaven.test.skip surefire:test
    ,但由于某种原因,该构建再次无法解决测试依赖关系
有趣的是,这是不确定的,失败发生在不同的阶段,有时根本不是-我偶尔绿色建设

现在我已经束手无策了:我一直认为这应该很简单,我不可能成为第一个为这个简单的问题奋斗的人

对我来说,反应堆发生了什么、何时以及如何触发都是不透明的。依赖关系图必须格式正确,否则无法编译。那么,为什么我不能让Maven为运行测试复制相同的依赖关系图呢

问候,

少女


PS:这也与我尊敬的同事Ben遇到的问题有关:

使用构建服务器(Jenkins)如何


如果您有复杂的测试场景,那么最好先构建(使用Maven)然后运行管道的另一个步骤,将文件部署到正确的服务器/测试系统上并开始测试。

您是否使用像Jenkins这样的CI解决方案?我们使用TeamCity重新阅读后,我有一个问题:'如果我在任何地方重新编译,我担心可能会无意中引入错误…'这可以通过使用版本控制工具简单地防止吗?如果您总是编译相同的状态,这不是问题。例如,在不同的节点和/或不同的JDK上使用Jenkins管道?Maven项目正是这样做的……举个例子:不同操作系统和不同JDK上的Runn?我们使用TeamCity。那么您的意思是在普通本地缓存中安装我们的工件(而不是使用我们的工件引导沙盒缓存),然后启动测试运行?听起来很有希望!