【问题标题】:maven to auto pull dependencies test jarmaven 自动拉取依赖项测试 jar
【发布时间】:2014-01-28 16:33:24
【问题描述】:

如何获取包含在 pom.xml 中的依赖项的 tests.jars,而无需明确指定对测试范围的工件的依赖项。 例如:我的 pom.xml 包含“n”个依赖项,其中大部分还包含 tests.jar。当我用这个 pom 运行 mvn:test 时,我也想获取这些依赖项测试并运行它们(因为父 pom 是聚合器并且想要运行测试以确保集成不会破坏事情)。 如果我包含对这些“n”依赖项的测试工件的依赖项,并使用 maven-surefire-plugin 和 dependenciesToScan 组合(如下所示),我可以运行测试。 但这需要我每次为依赖构建测试 jar 或添加新依赖时编辑 pom.xml。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
        <dependenciesToScan>
            <dependency>group:artifact1</dependency>
            <dependency>group:artifact2</dependency>
        </dependenciesToScan>
    </configuration>
</plugin>
..
..
<dependencies>
    <dependency>
        <groupId>group</groupId>
        <artifactId>artifact1</artifactId>
        <version>version</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>group</groupId>
        <artifactId>artifact2</artifactId>
        <version>version</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
....
...
</dependencies>

如果不增加对测试工件的显式依赖,是否也可以自动提取和运行依赖项的测试(当然不是针对所有依赖项,而是针对少数与特定组 ID 匹配的依赖项)?

【问题讨论】:

  • 您上次的编辑没有改善结果。粘贴 XML,选择它,然后使用编辑器上方的小“代码”按钮将其转换为代码。
  • 我转向 gradle 来实现这一点。这是使用 ant JUnit 进行的简单任务配置。 stackoverflow.com/questions/21439082/… 有详细信息。

标签: maven maven-plugin


【解决方案1】:

对我来说,这听起来不像是一个理智的策略。构建每个依赖项时,测试将已经运行。

除非您在测试之间创建了依赖关系(例如更改类路径上 JAR 的顺序会改变测试结果),否则从不同的项目再次运行它们应该不会有任何影响。

如果当类路径中 JAR 的顺序发生变化时,您的测试开始中断或表现不同,那么我建议您查看您的版本控制系统并与编写该测试的人交谈。

[编辑]回复下面的第一条评论:

我去过那里。您描述的是集成测试(IT)。首先,对他们要非常非常小心。 IT 是脆弱的,是资源的无底洞。如果你不小心,你会用自己的工作扼杀自己。另见:Integration Tests are scam

在此免责声明之后,这是我驯服野兽的策略:

  1. 确保测试是独立的。总是。

  2. 创建一个依赖于 WAR 模块的新模块。这包含您的 IT - 它可以看到整个世界,可以拥有自己的设置和配置,并且可以在必要时部署 WAR。

  3. 请记住,错误不是随机的。 People always make the same mistakes over and over again. 这一次对你有利。所以你需要做的是添加测试来检查 Spring 配置中的错误。测试应该加载 spring 配置并进行如下检查:我们是否看到了我们期望的 bean?那里有正确的覆盖吗?豆子不见了吗?

随着您添加测试,缺陷率会下降,因为测试将涵盖您的团队通常会犯错误的那些区域。

【讨论】:

  • 我的用例是:有一个带有 POM 的项目来构建一个战争文件。这场战争取决于“n”个 java 项目。所有的java项目都是基于spring的,war项目定义了spring bootstrap配置。这个根配置包括来自 Java 项目的 spring 配置。当战争最终建立时,我想确保没有任何东西破坏 w.r.t spring root 配置。
  • 我明白了。我也在那里。查看我的编辑我是如何解决它的。
【解决方案2】:

首先,如果我们谈论的是单元测试,上述设置没有意义。您忽略了 Maven 的概念,因为每个模块都应该在模块中进行单元测试,并且它们在生成的 jar 文件被打包之前的生命周期中运行。

文件夹布局如下所示:

  +-- pom.xml
  +-- src/
       +-- main
            +--- java (Production code)
       +-- test
            +--- java (Unit Test code)

因此,给定的测试代码旨在对生产代码进行单元测试。这意味着单元测试将在该工件的构建和打包期间运行,而在打包之后NOT。如果是这种情况,我们正在讨论应该以不同方式处理的集成测试。

您正在使用的测试罐用于不同的用途。它用于拥有多个单元测试使用的公共类,从而有机会在单元测试中重用代码。

【讨论】:

  • 请查看我对@Aaron 回复的评论。
  • @Jack 但这是集成测试。在那里你应该创建一个单独的模块——你可以在其中使用 cargo 将战争文件部署到 Tomcat 等,或者可能会在真实环境中对产生的战争进行集成测试。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2011-10-23
  • 2012-05-27
相关资源
最近更新 更多