为什么我的maven-surefire-plugin需要参与主项目构建?

时间:2015-09-29 12:58:29

标签: maven maven-plugin maven-surefire-plugin maven-failsafe-plugin

请注意,我对主项目构建中的maven-surefire-plugin感到满意,因为它为我提供了我需要的成功构建。

但我仍然对一些令我困惑的事情有疑问......

我正在运行Maven项目的构建。有两种测试。集成测试。在创建和部署war存档之前,这些测试针对外部且完全空的数据库运行。有12个这样的测试。和验收测试。这些测试针对外部和非空数据库运行,在创建和部署之后使用war存档。有一个这样的测试。

现在,使用以下命令运行时:

mvn clean install -Denv="test"

我可以看到已经通过了12次集成测试,并且构建成功。

但是在运行命令时:

mvn clean install -Denv="acceptance"

我可以看到13个测试被考虑,并且构建失败,控制台日志显示:

Tests in error: 
  testUser(it.kahoot.robot.rest.acceptance.UserControllerTest): I/O error on POST request for "http://localhost:8080/kahoot-rest/api/users/login":Connection refused; nested exception is java.net.ConnectException: Connection refused

Tests run: 13, Failures: 0, Errors: 1, Skipped: 0

测试结果表明构建尝试在创建和部署war存档之前运行验收测试。

-------------------------------------------------------------------------------
Test set: it.kahoot.robot.rest.acceptance.UserControllerTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 20.388 sec <<< FAILURE!
testUser(it.kahoot.robot.rest.acceptance.UserControllerTest)  Time elapsed: 0.407 sec  <<< ERROR!
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/kahoot-rest/api/users/login":Connection refused; nested exception is java.net.ConnectException: Connection refused

以下是包的拆分方式: 斯蒂芬@斯蒂芬-的ThinkPad-X301:休息&GT;树

.
├── acceptance
│   ├── AbstractControllerTest.java
│   ├── BaseControllerTest.java
│   └── UserControllerTest.java
├── assertion
│   ├── PartResourceAssert.java
│   ├── UserResourceAssert.java
│   └── UserRoleResourceAssert.java
└── integration
    ├── AbstractControllerTest.java
    ├── BaseControllerTest.java
    ├── UserControllerTest.java
    ├── UserExceptionTest.java
    └── WebSecurityTestConfiguration.java

我的pom.xml文件包含集成测试的“测试”配置文件,以及验收测试的“验收”配置文件。

<profile>
  <id>test</id>
  <activation>
    <property>
      <name>env</name>
      <value>test</value>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.17</version>
        <configuration>
          <includes>
            <include>**/integration/*.java</include>
          </includes>
          <excludes>
            <exclude>**/acceptance/*.java</exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>
<profile>
  <id>acceptance</id>
  <activation>
    <property>
      <name>env</name>
      <value>acceptance</value>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>failsafe-maven-plugin</artifactId>
        <version>2.4.3-alpha-1</version>
        <configuration>
          <includes>
            <include>**/acceptance/*.java</include>
          </includes>
          <excludes>
            <exclude>**/integration/*.java</exclude>
          </excludes>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.3.4.RC0</version>
        <executions>
          <execution>
            <id>start-jetty</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>start</goal>
            </goals>
          </execution>
          <execution>
            <id>stop-jetty</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
            <configuration>
              <stopKey>stop</stopKey>
              <stopPort>8081</stopPort>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <webApp>
            <contextPath>/kahoot-rest</contextPath>
          </webApp>
          <daemon>true</daemon>
          <connectors>
            <connector
              implementation="org.eclipse.jetty.nio.SelectChannelConnector">
              <port>8080</port>
              <maxIdleTime>300000</maxIdleTime>
            </connector>
          </connectors>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

有趣的是:当我将maven-surefire-plugin移出“test”配置文件并进入主项目构建时,两个命令最终都会成功构建。 以下插件:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <configuration>
      <includes>
        <include>**/integration/*.java</include>
      </includes>
      <excludes>
        <exclude>**/acceptance/*.java</exclude>
      </excludes>
    </configuration>
  </plugin>

移出“测试”配置文件并放置在主项目构建中,这导致两个命令都成功构建。

1 个答案:

答案 0 :(得分:1)

命名模式在相应的插件页面中记录:

我会将验收测试放入一个单独的项目中,并使用配置文件定义执行。

集成测试可以由适当的life cylcle phase integration-test

运行

但根据您的信息,您希望为集成测试启动一个码头,因此为集成测试创建一个单独的模块也是有意义的,可以通过配置文件激活。

将它们分开的另一个重点是为集成测试和验收测试提供单独的类路径,这可能意味着具有不同的依赖关系,并且可能是基于测试的某种配置(属性文件等)。