java - plugin - maven安装junit



我如何让我的Maven集成测试运行 (6)

Maven构建生命周期现在包含运行集成测试的“集成测试”阶段,这些测试与“测试”阶段中运行的单元测试分开运行。 它在“包”之后运行,所以如果运行“mvn verify”,“mvn install”或“mvn deploy”,集成测试将一路运行。

缺省情况下,集成测试运行名为**/IT*.java**/*IT.java**/*ITCase.java测试类,但可以对其进行配置。

有关如何完成这些工作的详细信息,请参阅故障安全插件故障安全使用页面 (当我编写此代码时,未正确链接到上一页),并查看此Sonatype博客文章

我有一个maven2多模块项目,并且在我的每个子模块中,我都有分别名为Test.javaIntegration.java JUnit测试,用于单元测试和集成测试。 当我执行时:

mvn test

子模块中的所有JUnit测试*Test.java执行。 当我执行

mvn test -Dtest=**/*Integration

没有一个Integration.java测试在子模块中得到执行。

这些对我来说看起来是完全相同的命令,但具有-Dtest = / * Integration **的那个不起作用,它显示0个在父级别运行的测试,其中没有任何测试


Answer #1

你应该尝试使用maven failsafe插件 。 你可以告诉它包含一些特定的测试。


Answer #2

您可以使用JUnit类别和Maven非常轻松地分割它们。
下面通过分解单元和集成测试非常简要地展示了这一点。

定义标记界面

使用类别对测试进行分组的第一步是创建标记界面。
此界面将用于标记您想要作为集成测试运行的所有测试。

public interface IntegrationTest {}

标记你的测试类

将类别注释添加到测试类的顶部。 它采用您的新界面的名称。

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
 }
}

配置Maven单元测试

这个解决方案的美妙之处在于,单元测试方面没有什么变化。
我们只需将一些配置添加到maven surefire插件,以使其忽略任何集成测试。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.11</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <excludedGroups>
            com.test.annotation.type.IntegrationTest
        </excludedGroups>
    </configuration>
</plugin>

当你进行mvn clean test时,只有未标记的单元测试才会运行。

配置Maven集成测试

再次,这个配置非常简单。
我们使用标准的故障安全插件并将其配置为仅运行集成测试。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <groups>
            com.test.annotation.type.IntegrationTest
        </groups>
    </configuration>
</plugin>

配置使用标准执行目标在构建的集成测试阶段运行故障安全插件。

你现在可以做一个mvn干净安装
这次以及单元测试运行时,集成测试在集成测试阶段运行。


Answer #3

您可以按照maven文档来运行构建的单元测试,并单独运行集成测试。

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

这将允许您在默认情况下禁用所有集成测试的情况下运行。 要运行它们,请使用以下命令:

mvn install -DskipTests=false

Answer #4

我已经完成了你想要做的事情,而且效果很好。 单元测试“*测试”总是运行,而“* IntegrationTests”只有在执行mvn验证或mvn安装时才会运行。 这里是我的POM的片段。 serg10几乎没有错,但并不完全。

  <plugin>
    <!-- Separates the unit tests from the integration tests. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
       <skip>true</skip>
       <!-- Show 100% of the lines from the stack trace (doesn't work) -->
       <trimStackTrace>false</trimStackTrace>
    </configuration>
    <executions>
       <execution>
          <id>unit-tests</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
                <!-- Never skip running the tests when the test phase is invoked -->
                <skip>false</skip>
             <includes>
                   <!-- Include unit tests within integration-test phase. -->
                <include>**/*Tests.java</include>
             </includes>
             <excludes>
               <!-- Exclude integration tests within (unit) test phase. -->
                <exclude>**/*IntegrationTests.java</exclude>
            </excludes>
          </configuration>
       </execution>
       <execution>
          <id>integration-tests</id>
          <phase>integration-test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
            <!-- Never skip running the tests when the integration-test phase is invoked -->
             <skip>false</skip>
             <includes>
               <!-- Include integration tests within integration-test phase. -->
               <include>**/*IntegrationTests.java</include>
             </includes>
          </configuration>
       </execution>
    </executions>
  </plugin>

祝你好运!


Answer #5

默认情况下,Maven只运行在类名中有测试的测试。

重命名为IntegrationTest,它可能会工作。

或者,您可以更改Maven配置以包含该文件,但只需将您的测试命名为SomethingTest可能更容易,更好。

包含和排除测试

默认情况下,Surefire插件将自动包含所有具有以下通配符模式的测试类:

  • “** / Test * .java” - 包含以“Test”开头的所有子目录和所有java文件名。
  • “** / * Test.java” - 包含所有以“Test”结尾的子目录和所有的java文件名。
  • “** / * TestCase.java” - 包含所有以“TestCase”结尾的子目录和所有的java文件名。

如果测试类不符合命名约定,则配置Surefire插件并指定要包含的测试。





surefire