2014-09-26 213 views
10

这是mvn我的项目结构:Maven不同单元如何测试集成测试?

enter image description here

正如你可以看到,我有两个班在src/test/java

  1. CardValidtorIT.java(这是集成测试)

  2. CardValidatorTest.java (这是单元测试)

当我运行

mvn package

我只注意到了unit-test (CardValidatorTest.java)运行

但是当我运行

mvn integration-test

我看到两个unit-testIntegration tests中运行。

mvn在运行mvn package时如何知道不执行CardValidatorIT.java。也就是说,为什么它没有运行CardValidatoryIT.java

这是我pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>chapter14</artifactId> 
    <groupId>org.agoncal.book.javaee7</groupId> 
    <version>1.0</version> 
</parent> 
<groupId>org.agoncal.book.javaee7.chapter14</groupId> <artifactId>chapter14-service</artifactId> <version>1.0</version> 
<packaging>war</packaging> 
    <dependencies> 
    <dependency> 
<groupId>org.glassfish.main.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>4.0</version> 
<scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.5.1</version> 
     <configuration> 
      <source>1.7</source> 
      <target>1.7</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.2</version> 
     <configuration> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
     </configuration> 
     </plugin> 
     <plugin> 
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> 
<executions> 
      <execution> 
      <id>integration-test</id> 
      <goals> 
<goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

P.S:我知道,我有一个MVN目标integration-test。但我不依赖于它的类应该集成测试期间运行

感谢

回答

9

请参阅Maven Surefire。

这个插件负责在Maven的mvn test。默认配置即将发挥作用。这意味着字Test班会开始发挥作用,当你运行mvn test和你的情况mvn package

http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

当您运行mvn integration-test故障安全插件使用。默认的包含/排除规则有所不同 - 例如,默认情况下它会查找单词IT

http://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

注:奇怪的是,我认为,当你运行mvn integration-test测试类CardValidatorTest被拾起。根据我如何阅读故障安全插件的默认包含和排除规则,我不会期望这一点。事实上,当我将你的pom.xml改编成我自己的示例项目时,我没有看到这种行为。相反,所有Test类都拿起mvn testmvn package。所有的IT课程都是通过mvn integration-test获得的。你确定你没有对这两个类的代码级别依赖吗?除了更改的包含/排除规则之外,我能想到的唯一一点可能会导致它们都被mvn testmvn package接收。

+0

我相信我没有代码级别的依赖关系。 'mvn test'只运行1次测试(cardValidatorTest),''mvn package'只运行1次测试(CardValidatorTest),但'mvn integration-test'运行2次测试(CardValidatorTest和CardValidatorIT)。但你的回答有帮助,链接也是如此!谢谢 – 2014-09-26 22:36:12

4

Maven中的Failsafe plugin处理集成测试的目标。默认情况下,这些都是include patterns集成测试:

"**/IT*.java" - includes all of its subdirectories and all java filenames that start with "IT". 
"**/*IT.java" - includes all of its subdirectories and all java filenames that end with "IT". 
"**/*ITCase.java" - includes all of its subdirectories and all java filenames that end with "ITCase". 

故障保护不是Maven的default lifecycle bindings的一部分,所以集成测试,如CardValidatorIT,这当然满足默认模式,不作为生命周期的一部分运行。这得到了Maven的自以为是的惯例,其失败应该失败的构建和哪些测试应该始终运行(快速单元测试与广泛的代码覆盖率),哪些测试应该运行较少(慢集成测试)。

当然,您可以根据需要重写惯例。

+0

这些必须在'src/test/java/IT **。java'?这会工作吗? ''src/main/java/IT **。java.'这可能会与我的类发生名称冲突,它具有模式'IT **。java' – 2014-09-26 20:17:56

+0

我从来没有尝试过,但我认为你可以通过添加'配置“元素添加到插件,以便在生命周期的不同部分包含/排除。也就是说,你为自己打开了一扇令人头痛的大门,我会认为比它的价值更麻烦。 – Vidya 2014-09-26 20:39:37

+0

我更喜欢UTs和ITs的src/test/java/underlying surefire-plugin和src/integration-test/java/underlying failsafe-plugin。我们该怎么办? – fjjiaboming 2016-06-22 00:40:06

1

集成测试构建阶段在包构建阶段之后进行。所以“mvn package”不会达到“集成测试”构建阶段。