Maven 插件测试工具

该 API 旨在为希望测试 Maven 插件的开发人员提供一系列便利工具。该库的主要重点是集成测试,因为当前的工具和方法不能很好地支持它。

插件集成测试的特殊问题

Maven 插件在集成测试方面代表了一种特殊的需求。像许多面向组件的系统一样,Maven 提供了在其“自然环境”中测试插件所必需的许多运行时上下文。这意味着,为了正确测试任何特定插件与更大系统的集成,开发人员应该真正执行测试相关插件的特定功能的 Maven 构建。

但是,从插件自己的构建中运行测试构建会带来一些特殊问题。由于我们使用 Maven 来构建 Maven 插件,我们必须处理这样一个事实,即以前版本的插件可能在当前构建中处于活动状态(这不是一个很好的做法,但有时是不可避免的)。这意味着 Maven 必须足够聪明以从运行时上下文中卸载现有的插件版本并加载新版本 - 相应地,卸载测试版本并重新加载旧版本以用于同一反应器中的其他稍后构建。作为替代方案,插件的集成测试可以分叉单独的 Maven 构建,并跟踪输出以验证结果并确定构建是否成功。后一种方法虽然慢得多并且在某种程度上依赖于本地系统配置,

除了插件版本不一致之外,Maven 插件的集成测试还必须应对自己进行清理的需要。请记住,Maven 仅从其自己的本地存储库加载插件(可能在从远程存储库解析它们之后)。因此,在集成测试构建中使用当前插件的唯一实用方法是将其安装到某种本地存储库中,然后指示 Maven 使用该本地存储库进行构建。为了避免其他构建中的副作用(请记住,我们在这里构建 Maven 插件......并且它们用于构建其他项目),避免使用用于正常 Maven 构建的主要本地存储库至关重要。因此,插件集成测试需要一个自定义的本地存储库,集成测试构建可以定向到该存储库。<relativePath/>父元素。+

+ 所有这些似乎表明,确保所有必需的 POM 和插件存在的最佳方法是使用普通的本地存储库来构建一个新的本地存储库以用于测试目的。这方面的工作正在进行中。

最后,为了支持插件的集成测试,重要的是为开发人员提供一个 API 来引导测试环境(理想情况下,检测它何时已经被引导),并提供一个强大的 API 来执行构建和验证结果。

测试套件维护注意事项

由于无法掌握任何系统的用例实际上是无法满足用户需求的保证,因此了解集成测试的实际使用方式非常重要。

首先,集成测试被用作单向阀,以确保应用程序的任何特性(在我们的例子中是 Maven 插件)不会因为不相关的开发而退化。一组好的测试——其中集成测试是不可或缺的——可以为开发人员提供实现新功能的自由,并确信他能够在以前版本的基础上有效地构建。

但是,重要的是要了解回归预防并不是集成测试的唯一目的。次要但关键的用例涉及如何将集成测试添加到插件中。只需考虑如何在有缺陷的系统上报告错误即可理解。由于用户通常会报告错误,因此错误报告源自系统外部。对于 Maven 插件,这意味着用户很可能能够以失败构建的形式提供失败行为的示例。为了立即直接使用用户提供给我们的东西,集成测试的设计必须使用用户的构建示例来增强,并且尽可能少地重写。

为此,在这个库中进行集成测试的方法将是执行使用相关插件的示例构建,然后在日志、生成的退出代码或它生成的项目文件中验证结果。

集成测试要求

总而言之,这个库努力满足以下 Maven 插件集成测试的要求:

  • 使用测试项目触发 Maven 构建,而不会与当前(此插件的)构建中已使用的插件发生任何冲突。
  • 构建一个本地存储库,可以在其中安装插件的测试版本,允许主本地存储库不受测试影响。可以指示集成测试使用此测试时本地存储库而不是正常位置。
  • 支持跟踪和分析集成测试期间生成的 Maven 构建的结果。在合理的范围内,测试构建应该以与正常项目构建相同的方式配置,以充分利用用户提交的测试用例以及他们提交的问题。

此库中包含的实用程序

有关下述 API 的更多信息,请参阅JavaDocs

  • PluginTestTool - 设置插件测试环境的主要入口点,此实用程序协调 ProjectTool、RepositoryTool 和 BuildTool 以生成包含插件 jar 的本地存储库,以及使用<relativePath/可访问的任何祖先 POM 文件>父规范的元素。

    为了使测试项目对插件版本的变化更具弹性,此工具允许开发人员为插件指定测试版本,因此对插件的任何引用都可以明确并避免意外引用从外部解析的插件版本。

  • ProjectTool - 这个测试工具提供用于创建可测试插件 jar 文件的 API,可选择跳过插件的单元测试(毕竟,可以想象单元测试本身可能正在使用这些工具)。
  • RepositoryTool - RepositoryTool 提供了组装工件存储库以支持测试的方法。该工具负责组装集成测试期间使用的本地存储库 - 完成插件本身的测试版本,以及可通过<relativePath/>访问的所有祖先 POM 。
  • BuildTool - 这个工具的目的是不言自明的;它用于执行 Maven 构建。它为运行构建提供了一个相当通用的 API,原因很简单,一个测试可能需要运行多个构建。对于正常用例,使用标准项目测试方法封装 BuildTool API 是一个好主意,该方法将标准化用于运行一组类似测试构建的选项。