3

我们的 POM 文件中有以下配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
    <executions>
        <execution>
            <id>surefire-it</id>
            <phase>integration-test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <skip>false</skip>
            </configuration>
        </execution>
    </executions>
</plugin>

这确保了测试不会在测试阶段执行。测试仅在集成测试阶段执行。

但是,当我们准备发布时(release:prepare),maven 在测试阶段执行测试。这会导致我们的构建失败,因为我们的测试只能在集成测试阶段运行(我们使用 tomcat-maven 插件在执行测试之前部署打包的战争)。

我知道我们可以通过传递参数(-DskipTests 等)来跳过测试。我们不想跳过任何测试,我们只想 release:prepare 像任何其他 maven 目标一样执行。

非常感谢任何建议/帮助。

4

4 回答 4

2

在默认情况下不活动的单独配置文件中添加您的集成测试。添加触发规则或其他内容。然后根据需要使用集成测试调用构建。例如,在您的 CI(Jenkins/Hudson、TeamCity、Bamboo 等)上触发了配置文件。

您当前面临的问题是您没有区分这两种类型的测试以及它们应该何时运行。您已经简单地定义了您希望它们执行的阶段。这对于 Maven 执行上下文的了解还不够,无法确定您想要做什么,并且它也在发布期间调用它们。

于 2012-10-11T14:00:49.747 回答
2

尝试使用更通用的方法来maven-surefire-plugin完全禁用test阶段期间。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
        <execution>
            <id>default-test</id>
            <!-- Disable the default-test by putting it in phase none -->
            <phase>none</phase>
        </execution>
        <execution>
            <!-- Enable the test during integration-test phase -->
            <id>surefire-it</id>
            <phase>integration-test</phase>
            <goals>
                <goal>test</goal>
            </goals>
        </execution>
    </executions>
</plugin>

编辑

这是我mvn release:prepare使用上述配置的surefire插件进行的空运行的输出:

C:\Users\maba\Development\svn\local\stackoverflow\Q12840869>mvn release:prepare -DdryRun
[INFO] 正在扫描项目...
[信息]
[信息] --------------------------------------------- -------------------------
[信息] 建筑 Q12840869-1.0-SNAPSHOT 1.0-SNAPSHOT
[信息] --------------------------------------------- -------------------------
[信息]
[信息] --- maven-release-plugin:2.0:prepare (default-cli) @ Q12840869 ---
[INFO] 从“scm-check-modifications”阶段恢复发布
[INFO] 正在验证没有本地修改...
[INFO] 正在执行:cmd.exe /X /C "svn --non-interactive status"
[INFO] 工作目录:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869
[INFO] 检查快照的依赖项和插件...
“Q12840869-1.0-SNAPSHOT”的发布版本是什么?(com.stackoverflow:Q12840869) 1.0: :
“Q12840869-1.0-SNAPSHOT”的 SCM 发布标签或标签是什么?(com.stackoverflow:Q12840869) Q12840869-1.0: :
“Q12840869-1.0-SNAPSHOT”的新开发版本是什么?(com.stackoverflow:Q12840869) 1.1-SNAPSHOT: :
[信息] 正在转换“Q12840869-1.0-SNAPSHOT”...
[INFO] 不生成发布 POM
[INFO] 执行准备目标 - 因为这是模拟模式,它针对原始项目运行,而不是重写的项目
[INFO] 执行目标“干净验证”...
[警告] Maven 将以交互模式执行,但尚未为此 MavenInvoker 实例配置输入流。
[INFO] [INFO] 正在扫描项目...
[信息] [信息]
[信息] [信息] ----------------------------------------- ----------------------------
[INFO] [INFO] 楼 Q12840869-1.0-SNAPSHOT 1.0-SNAPSHOT
[信息] [信息] ----------------------------------------- ----------------------------
[信息] [信息]
[INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ Q12840869 ---
[INFO] [INFO] 删除 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target
[信息] [信息]
[INFO] [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ Q12840869 ---
[INFO] [INFO] 使用 'UTF-8' 编码复制过滤的资源。
[INFO] [INFO] 复制 0 个资源
[信息] [信息]
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ Q12840869 ---
[INFO] [INFO] 编译 1 个源文件到 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\classes
[信息] [信息]
[INFO] [INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ Q12840869 ---
[INFO] [INFO] 使用 'UTF-8' 编码复制过滤的资源。
[INFO] [INFO] 跳过不存在的资源目录 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\src\test\resources
[信息] [信息]
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ Q12840869 ---
[INFO] [INFO] 编译 1 个源文件到 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\test-classes
[信息] [信息]
[INFO] [INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ Q12840869 ---
[INFO] [INFO] 构建 jar:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\Q12840869-1.0-SNAPSHOT.jar
[信息] [信息]
[信息] [信息] --- maven-surefire-plugin:2.7.2:test (surefire-it) @ Q12840869 ---
[INFO] [INFO] Surefire 报告目录:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\surefire
-报告
[信息]
[信息] --------------------------------------------- --------
[信息] 测试
[信息] --------------------------------------------- --------
[信息] 运行 com.stackoverflow.MainTest
[信息] 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.041 秒
[信息]
[信息] 结果:
[信息]
[INFO] 测试运行:1,失败:0,错误:0,跳过:0
[信息]
[信息] [信息] ----------------------------------------- ----------------------------
[信息] [信息] 构建成功
[信息] [信息] ----------------------------------------- ----------------------------
[INFO] [INFO] 总时间:5.102s
[INFO] [INFO] 完成于:Thu Oct 11 17:10:29 CEST 2012
[INFO] [INFO] 最终内存:13M/147M
[信息] [信息] ----------------------------------------- ----------------------------
于 2012-10-11T14:11:08.033 回答
2

我会尝试另一种方法,并尝试将发布插件配置为始终-DskipTests用作参数,这样您就不需要每次都指定它:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin<artifactId>
    <configuration>
        <arguments>-DskipTests</arguments>
    </configuration>
</plugin>

理论上,这应该附加-DskipTestspreparerelease目标传递给它们执行的 Maven 子执行的参数。

于 2012-10-11T15:14:37.737 回答
2

maven-failsafe-plugin用于集成测试,并保留maven-surefire-plugin用于单元测试。

这将保证单元测试与集成测试完全隔离(因此可以单独关闭),并且集成测试在“构建生命周期的integration-test和阶段”运行。verify

于 2012-10-11T16:24:35.593 回答