Maven和/或Junit如何控制运行测试的次数?

时间:2014-08-08 02:25:43

标签: java maven junit maven-surefire-plugin

我希望有人可以告诉我junit,maven-surefire-plugin或maven如何控制运行测试的次数,或者在配置或属性文件中有什么东西我无法找到/查找/设置控制次数。

出于某种原因,当我在maven中运行我的测试时,它们会被执行两次。我在控制台输出中看到它。我认为maven-surefire-plugin可能是其中一部分原因,但我不确定。 我运行命令:

mvn -Dtest=TestClassBlah test

我在控制台中看到它启动的日志消息,运行测试,给出摘要,然后再出于任何原因再次运行它:

(日志文件已经过消毒和删节。请原谅消毒中的任何错误)

[INFO] Scanning for projects...
[INFO] 
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building TestClassBlah 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
<snip snip>
<snip snip>

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.blah.blah.TestClassBlah
<bunch of INFO and other msgs>
<bunch of INFO and other msgs>

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.465 sec

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-surefire-plugin:2.11:test (tests) @ TestClassBlah ---
[INFO] Surefire report directory: /dir/somewhere/for/me

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.blah.blah.TestClassBlah
<bunch of INFO and other msgs again>
<bunch of INFO and other msgs again>

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8.767 sec

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.799 s
[INFO] Finished at: 2014-08-07T18:54:27+01:00
[INFO] Final Memory: 19M/183M
[INFO] ------------------------------------------------------------------------

如果需要,我可以附加我的pom.xml文件,但它只列出我们的插件,依赖项,repos等。它似乎没有列出运行测试或禁止来自surefire-plugin的输出的次数。< / p>

我们使用maven-surefire-plugin将结果发布到Jenkins中。这是我第一次使用这些技术,所以我还不知道交易的所有技巧。提前感谢您提供的任何帮助。

更新:这是pom。对不起,有点长。

   <modelVersion>4.0.0</modelVersion>
   <groupId>GenericGroupName</groupId>
   <artifactId>TestClassBlah</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>TestClassBlah</name>

   <dependencies>
      <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
         <version>1.6</version>
      </dependency>
      <dependency>
         <groupId>com.genericname</groupId>
         <artifactId>analytics</artifactId>
         <version>1.5-RELEASE</version>
      </dependency>

      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.7.7</version>
      </dependency>

      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
      </dependency>

      <dependency>
        <groupId>org.skyscreamer</groupId>
        <artifactId>jsonassert</artifactId>
        <version>1.2.3</version>
      </dependency>

      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit-dep</artifactId>
         <version>4.11</version>
         <exclusions>
            <exclusion>
               <groupId>org.hamcrest</groupId>
               <artifactId>hamcrest-core</artifactId>
            </exclusion>
         </exclusions>
      </dependency>

   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
               <source>1.7</source>
               <target>1.7</target>
            </configuration>
         </plugin>

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.11</version>
            <executions>
               <execution>
                  <id>tests</id>
                  <goals>
                     <goal>test</goal>
                  </goals>
                  <configuration>
                     <excludes>
                        <exclude>none</exclude>
                     </excludes>
                     <includes>
                        <include>**/*.java</include>
                     </includes>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>

   </build>
   <repositories>
      <repository>
         <id>bitExpert-nexus-releases</id>
         <name>bitExpert nexus</name>
         <url>http://10.196.32.21:8081/nexus/content/groups/public/</url>
      </repository>
   </repositories>

2 个答案:

答案 0 :(得分:2)

最简单的答案是,你的pom(和/或其父母)中指定了一个执行相同操作的insfire插件,或者有两个插件执行相同的操作(我还没有看到它)使用surefire,但有时另一个组织以不同的名称发布相同的工件,开发人员在进行搜索时会感到困惑并且最终都会进入项目中。如果您有父POM,执行将按其ID合并,如果ID不同,则会有多次执行。

你剪断了日志的重要部分,这是&#34; --- maven-surefire-plugin:2.11:test(tests)@ TestClassBlah ---&#34;,其中包含插件工件ID(maven-surefire-plugin)和执行ID(测试)。如果两次执行中这些行不同,那么你就得到了答案。

答案 1 :(得分:2)

你的pom中指定了maven-surefire-plugin的额外执行。 Maven还默认执行Surefire,它也在运行。如果您的pom中有Surefire下的标记,您可以在maven-surefire-plugin的标记下移动它,它将应用于maven-surefire-plugin的默认执行。然后你可以删除额外的执行。

如果您希望Surefire在桌面上以单向方式运行,而在Jenkins中以另一种方式运行,那么profiles就是一个很好的用例。

编辑:在查看你的pom之后,这肯定会起作用并且只运行一次:

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

您可以根据测试类的命名方式删除整个<configuration>标记 - Maven通常会解释名称以Test开头的src / test / java下的每个类,或者以Test或TestCase结尾考试班。如果您的所有测试类都已遵循该约定,那么将Maven配置为将每个类作为测试类进行操作只是多余的。