Maven/Surefire 找不到要运行的测试

Posted

技术标签:

【中文标题】Maven/Surefire 找不到要运行的测试【英文标题】:Maven/Surefire finds no tests to run 【发布时间】:2011-05-09 15:00:15 【问题描述】:

据我所知,测试文件的位置是正确的。

当我运行“mvn test”时,它会找到四个名为 SomethingTest 的类(它们位于“test”文件夹中)。

但是,它会忽略任何 jUnit 测试(jUnit 4,使用 @Test 注释)。

如何调试?

编辑 - 这可能与包含的 jUnit 版本错误有关。我在运行“mvn -X”时看到了这个

[DEBUG] Retrieving parent-POM: org.codehaus.plexus:plexus:pom:1.0.4 for project: org.codehaus.plexus:plexus-containers:pom:1.0.3 from the repository.
[DEBUG]       org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:runtime (selected for runtime)
[DEBUG]         junit:junit:jar:3.8.1:runtime (selected for runtime)
[DEBUG]         org.codehaus.plexus:plexus-utils:jar:1.0.4:runtime (removed - nearer found: 1.4.1)
[DEBUG]         classworlds:classworlds:jar:1.1-alpha-2:runtime (selected for runtime)

尽管我在根 pom 中的第一个依赖项是在 jUnit 4.8.1 上,但由于某种原因,jUnit 3.8.1 被包含在内。

编辑 2 - 好吧,这似乎不是答案。测试类路径包括正确的 jUnit (4) 和我的测试类。

Edit 3 - 我有一个名为 SomethingTester 的测试类。当我将其更改为SomethingTest时,它起作用了。我检查了 Surefire 的包含模式,确实它没有被配置为捕获Something Tester。呵呵。

【问题讨论】:

这看起来很奇怪。你能发布你的 pom.xml 吗? @seanizer - 你看到编辑 3 了吗?我的检测测试模式根本没有正确配置。 哦,我明白了,那么您应该将其添加为答案并接受它 @seanizer - 我添加了这个作为答案,我还不能接受(我讨厌这个事实 - 我必须等待 2 天)。 我找到了很好的答案。 ***.com/questions/6178583/… 【参考方案1】:

也许这就是问题所在:

https://***.com/questions/2021771?sort=newest#sort-top

mvn -X 会打印一堆这些,所以你可以尝试从上面找出它是否是一些东西 - 比如没有使用正确的 JUnit 版本(例如,当你从快速启动工件创建时,我认为默认值为 3.8 .1),在 JUnit 之前的类路径中包含 TestNG。

编辑:我只是在一个简单的项目中尝试过这个,上面链接中给出的类,它工作得很好。我使用了 junit 4.8 版,这是我项目中唯一的依赖项。只是为了确认一下,您正在使用 @org.junit.Test 注释测试方法,并且这些方法中有一些 org.junit.Assert.assertXXX 语句,对吗?

编辑 2:要将 junit 更改为其他版本,请使用:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8</version>
  <scope>test</scope>
</dependency>

编辑 3:你应该在测试类路径中有这样的东西:

[DEBUG] Test Classpath :
[DEBUG]   /home/icyrock/java/prb/target/test-classes
[DEBUG]   /home/icyrock/java/prb/target/classes
[DEBUG]   /home/icyrock/.m2/repository/junit/junit/4.8/junit-4.8.jar
[DEBUG]   /home/icyrock/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar
[DEBUG]   /home/icyrock/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar
[DEBUG]   /home/icyrock/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar

编辑 4:好的,我刚刚使用 maven quickstart artifact 创建了一个测试项目,在内部添加了两个模块(也是使用 quickstart artifact 创建的),仅向父 pom 添加了源/目标 Java 版本和 junit:junit:4.8 依赖项。我只将其中一项测试更改为 JUnit4(另一项默认为 JUnit3,这是 quickstart 生成的),父文件夹中的 mvn clean test 工作得很好。

这很可能是项目设置问题 - 您能否检查您的项目是否连接正确(即模块指向父项目,父/子项目的组/工件/版本是否正确)。我想到的唯一另一件事是清理您的 maven 存储库(至少是 org/apache/maven),但我怀疑这会有所帮助。

在一个更简单的项目上进行测试可能是明智的。

【讨论】:

mvn -X 显示较旧的 jUnit 版本,但是我的 poms 不包含它们。如何删除它? 只需添加 junit:junit:4.8 作为依赖项 - 即好像你想要那个版本。我编辑了帖子。 检索正常,在“T E S T S”行上方的“Test Classpath”部分是什么意思?如果配置正常,我将进行编辑以指定它应该做什么。 顺便说一句,“root pom”是什么意思?那是相关项目的 pom 还是其他 pom? 确认一下,您的测试课程在src/test/java 文件夹中?你能检查一下target/test-classes中有.class文件吗?【参考方案2】:

完成 icyrock.com 的问题。如果没有编译到目标/测试类的任何测试类,请检查您的 pom 文件并确保打包不是“pom”。

【讨论】:

【参考方案3】:

检查你当前版本的 JUnit 是否在 Maven 存储库中仍然可用,否则会失败

这个答案的当前版本@time是

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

【讨论】:

以上是关于Maven/Surefire 找不到要运行的测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Maven surefire 排除具有给定类别的所有 JUnit4 测试?

使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试

Maven Surefire 插件没有重新运行失败的 Cucumber 测试

SBT 找不到要运行或编译的测试

使用 maven surefire 使用 mpirun 运行 Junit 测试

无法编译 TestNG 测试套件(Maven+Surefire)