maven自动拉依赖测试jar

时间:2014-01-27 15:56:11

标签: maven maven-plugin

如何获取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匹配的少数依赖项)?

2 个答案:

答案 0 :(得分: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?那里有正确的覆盖吗?是否缺少豆类?

  4. 当您添加测试时,缺陷率会下降,因为测试将覆盖您的团队通常会出错的区域。

答案 1 :(得分:0)

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

文件夹布局完全如下所示:

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

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

您正在使用的测试罐用于不同的东西。它用于具有多个单元测试所使用的公共类,这些类可以在单元测试中重用代码。