JUnit5 控制台启动器未找到测试

Posted

技术标签:

【中文标题】JUnit5 控制台启动器未找到测试【英文标题】:JUnit5 Console Launcher not finding tests 【发布时间】:2021-01-30 23:07:39 【问题描述】:

我看过很多关于这方面的帖子,但似乎没有一个解决方案适合我。

问题是 JUnit5 控制台启动器似乎无法找到我的测试,无论我尝试什么语法。我尝试使用 --scan-classpath 扫描它们并直接使用 -c 指定类,包括生成 NoClassDefFound 的包说明符。

使用 --scan-classpath 控制台启动器成功运行,但不包括任何单元测试执行 - 由于某种原因找不到测试类。

树看起来像这样:

junit-5-jars  (the console standalone jar is in here) 
src   
   mypackage
     MyClass.java
     MyClass.class 
test   
   mypackage
     MyClassShould.java
     MyClassShould.class

从根本上说,我尝试的第一个也是最基本的命令:

java -jar junit5-jars/junit-platform-console-standalone-1.7.0-all.jar --class-path=test --class-path=src --scan-classpath

我尝试过的所有变体都给了我:

Test run finished after 27 ms
[         2 containers found      ]
[         0 containers skipped    ]
[         2 containers started    ]
[         0 containers aborted    ]
[         2 containers successful ]
[         0 containers failed     ]
[         0 tests found           ]
[         0 tests skipped         ]
[         0 tests started         ]
[         0 tests aborted         ]
[         0 tests successful      ]
[         0 tests failed          ]

这是在 bash 的 Mac 上。在我运行命令的根目录中包含所有类文件的项目中,我可以使用控制台启动器成功运行测试。但是如果类文件在这样的子目录中,那就不行了。有人有想法吗? (注意 - 请参阅下面的答案,子目录不是问题 - 测试类名称中的“应该”是)。

【问题讨论】:

你试过不带“mypackage”后缀吗?此外,如果我没记错的话,“-classpath”的拼写中间没有破折号。最后,两个类路径组件应该用分号分隔。 是的 - 它隐藏在文本中,但我已尝试删除 mypackage 并仅使用 --class-path 测试。我认为这实际上是正确的方法 - 包不包含在类路径条目中。但同样的结果 - 没有找到测试。根据 JUnit5 ConsoleLauncher 文档,-cp、--classpath 和--class-path 都是可以接受的(我已经尝试了这三个)。请记住,这是传递给 ConsoleLauncher 的类路径参数,而不是 java 命令本身。他们的文档在这里:junit.org/junit5/docs/current/user-guide/… 【参考方案1】:

我想我已经找到了这个问题的根源——它是测试类名称中的“Should”,JUnit5 ConsoleLauncher 不包括默认扫描。

这行得通:

java -jar junit5-jars/junit-platform-console-standalone-1.7.0-all.jar --class-path=test:src --include-classname=.* --scan-classpath

include classname 选项采用正则表达式,但在我的情况下,我只是让它扫描类路径上的所有文件以进行测试,然后它会按应有的方式找到它们。

如果他们文档中的 --scan-classpath 描述引用了 include-classname 选项和/或他们的默认扫描包含项,将会很有帮助。很容易在选项墙中错过那个论点。

【讨论】:

您可以根据需要更改默认的类路径模式。之所以存在模式,是因为类路径扫描是一项非常昂贵的操作。当您处理成千上万个类时,能够按名称过滤掉大多数类是性能提升器。 是的,我现在在“-include-classname=PATTERN”参数中看到了这一点。他们的 Launcher 文档顶部或“scan-classpath”参数的描述中关于默认值是什么以及如何更改它的一些声明会节省我一些时间。我只是希望它能够像我认为通常那样工作的 IDE、Maven 和 Gradle 那样工作,这不是基于测试类名称而是基于注释和/或目录约定来发现测试。 至少在 Gradle 中你会看到相同的行为,而无需更改默认模式,结束于 Should 的测试不会被执行。

以上是关于JUnit5 控制台启动器未找到测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Junit5 / spring boot 中命令执行控制器测试类?

sh (未测试)如果没有控制台访问权限(如drac,ilo等),则销毁服务器,并且无法启动实时系统

Gradle 没有找到我使用 Kotlin 和 JUnit 5 进行的测试

TestServer 返回 404 未找到

在 Android 中测试订阅:未找到项目

使用grunt运行jest时未找到任何测试