我希望有人可以告诉我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>
答案 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配置为将每个类作为测试类进行操作只是多余的。