如何使用 Ivy 构建和单元测试?

Posted

技术标签:

【中文标题】如何使用 Ivy 构建和单元测试?【英文标题】:How to build and unit test with Ivy? 【发布时间】:2012-01-17 00:04:49 【问题描述】:

当使用 Ivy 进行单元测试时,将测试依赖项放入您正在构建的目标二进制文件的 Ivy.xml 文件中是最佳实践吗?还是应该将它们放在您正在构建的测试项目的单独 Ivy.xml 文件中?

我在我的 Jenkins 构建服务器上使用 Ant 构建文件。

最初我计划在构建目标二进制文件后运行单元测试项目,但后来我上传到 Artifactory 的内容很混乱,因为最后一次 ivy 解析是针对测试依赖项完成的,而不是目标二进制文件。

如果我将测试依赖项放在实际二进制文件的 Ivy.xml 中,我会收到以下错误:

"一个模块没有被授权依赖它自己"

...但是我的测试取决于我正在构建的目标二进制文件。

测试项目的 Ivy.xml 文件是否应该实际上不将目标二进制文件列为依赖项?

更新

我现在在目标二进制文件的 Ivy.xml 中有依赖项。

我已将新依赖项标记为具有“测试”配置,以将它们与目标二进制文件所需的依赖项区分开来。

我现在正在研究如何将我的测试项目指向由目标项目的构建生成的二进制文件。我不确定这在技术上是否是 Ivy 的问题。

在构建目标二进制文件后,我是否应该有一个从测试项目到目标二进制文件的相对路径引用?

另一个想法是将目标二进制文件发布到本地缓存,然后在目标项目中从那里引用它。

更新 2

我最终使用 ant 复制任务将目标项目构建的二进制文件复制到包含目标项目依赖项的文件夹中。由于测试项目依赖项在此文件夹中,因此目标项目可以找到目标二进制文件。

【问题讨论】:

不再清楚你在问什么。你有没有把你的测试分成一个单独的 ANT 项目?无论如何,您似乎已经发现 ivy 配置可用于使您的测试依赖项分开 在同一个项目中运行构建和测试会简单得多。 ivy 可用于管理编译、运行时和测试类路径,使用“配置”和常春藤“缓存路径”任务的组合。 是的,这就是我正在做的。我在技术上分别构建它们(目标和测试 dll)。我正在使用一个 ivy.xml 文件来管理两者的依赖关系,并且测试依赖关系在测试配置中。 【参考方案1】:

同意马克·奥康纳的评论:

一般来说,单元测试的最佳实践是在打包之前对已编译的代码运行测试。

我建议将您对单元测试的调用作为编译后和打包前的一个步骤。大多数情况下,如果测试失败,您不希望将代码打包并上传到工件管理器(除非您有某种形式的特殊情况)。

所有这些都意味着测试应该在同一个 Jenkins 作业中进行。您可以构建两个 DLL,让它们使用相对路径相互引用,并执行测试,所有这些都在同一个作业中。然后你可以将你的二进制文件上传到 Artifactory,确信它通过了测试。

【讨论】:

这就是我现在正在做的事情。我实际上是在目标 DLL 的 ivy.xml 文件中跟踪测试的依赖关系。您暗示但没有直接说的一个重要注意事项:如果您将目标的构建和测试拆分为不同的构建文件调用,如果您解析两次,则必须在常春藤中设置一个标志以忽略第二次调用.那是我使用单独的依赖文件的时候。 我很困惑。您的问题似乎是在询问如何在包含您的二进制文件的另一个项目中创建一个“测试”项目点,但您是说只有一个项目。或许可以澄清一下您的问题?

以上是关于如何使用 Ivy 构建和单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular Material 构建 Ivy?

Grails 2.3 使用 IVY 解析器进行单元测试

如何使用 ivy 和 nexus 发布 3rdparty 工件

如何使用 ivy api 以编程方式为缓存中的模块构建路径?

应该如何设置 Jenkins 中的 Ivy 构建项目?

如何对使用 Express + Mongoose 构建的 NodeJs REST API 服务器进行单元测试?