ChatGPT解决这个技术问题 Extra ChatGPT

JUnit:如何避免测试工具类中的“无可运行方法”

我已经从 JUnit3.8 切换到 JUnit4.4。我使用 ant 运行测试,我的所有测试都成功运行,但测试实用程序类失败并出现“无可运行方法”错误。我使用的模式是在 test 文件夹下包含名称为 *Test* 的所有类。

我知道跑步者找不到任何用 @Test 属性注释的方法。但它们不包含此类注释,因为这些类不是测试。令人惊讶的是,在 eclipse 中运行这些测试时,它并没有抱怨这些类。

在 JUnit3.8 中,这根本不是问题,因为这些实用程序类没有扩展 TestCase,因此运行程序不会尝试执行它们。

我知道我可以在 ant 脚本的 junit 目标中排除这些特定类。但是我不想在我添加的每个新实用程序类上都更改构建文件。我也可以重命名课程(但给课程起好名字一直是我最薄弱的天赋:-))

这个问题有什么优雅的解决方案吗?

您的测试是否在 Eclipse/NetBeans/您最喜欢的 IDE 中工作?
我使用日食。实际上那里没有问题,不知何故eclipse不会尝试运行这些类。我想知道怎么做?
我不知道我们是否理解你的问题。请重新阅读您的问题,并可能添加更多信息。
@guerda:这个问题对我来说似乎很清楚。他的 Ant 任务是查找不包含测试的类,因为过滤器正在挑选实用程序类。因此,我的回答仍然是完全相关的。
LiorH:感谢您的澄清,所以我的回答是浪费:)

J
JoelPM

使用@Ignore 注释您的实用程序类。这将导致 JUnit 不尝试将它们作为测试运行。


其实,不,不应该。 @Ignore 用于暂时禁用测试。
抱歉,这是个坏主意。您想开始使用与测试相关的注释来注释您的生产代码,只是因为它们可能与测试模式匹配?正确的答案是修复类名,如果它们触发了测试的模式匹配。并确保模式只找到以 Test 结尾的类。这是一个普遍接受的模式
是的,这很糟糕,直到贡献了另一个我无法删除的赞成票后,我才意识到这一点。使您的基类抽象,然后 JUnit 将忽略它。请参阅下面的@gmoore 的回答。
g
gmoore

我的具体情况有以下情况。我们的测试

public class VenueResourceContainerTest extends BaseTixContainerTest

全部展开

BaseTixContainerTest

JUnit 试图运行 BaseTixContainerTest。可怜的 BaseTixContainerTest 只是试图设置容器,设置客户端,点一些披萨,然后放松一下……伙计。

如前所述,您可以使用

@Ignore

但这导致 JUnit 将该测试报告为已跳过(而不是完全忽略)。

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1

这让我很恼火。

所以我做了 BaseTixContainerTest 抽象,现在 JUnit 真正忽略了它。

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

@Ignore好得多
我尝试了@Ignore 方法并想,那很好,然后我读了这个答案并拍了拍自己的额头,“当然!”
J
Jon Skeet

假设您可以控制用于查找测试类的模式,我建议将其更改为匹配 *Test 而不是 *Test*。这样 TestHelper 不会匹配,但 FooTest 会。


我认为这不会有帮助,因为他迁移到了 JUnit 4.4,而这无关紧要。
您似乎错过了我回答的重点。他有一个名称过滤器来确定要被视为测试的类。如果他更改过滤器,他可以轻松地排除辅助类。
您的建议是有效的,但是我检查了我的测试类,有些以 Test 开头,有些以 Test 结尾。实用程序类和实际测试类之间没有明确的区别。您认为您建议的约定是一种好的做法吗? (即 utils 以 Test 开头,而 tests 以 Test 结尾)
使用 *Test 为测试用例类添加后缀几乎是一种惯例。您可能需要通过适当地重命名测试类并重命名帮助程序来重构,以便它们不会使用该后缀约定。
我同意 Spoike 的观点——如果你不能从类名中分辨出它是测试还是助手,你应该重命名这个类。约定更多的是“当且仅当它以 Test 结尾时,该类才是测试。”实用程序类可能会或可能不会以 Test 开头 - 没关系。
f
froh42

为了防止 JUnit 实例化您的测试基类,只需让它

public abstract class MyTestBaseClass { ... whatever... }

(@Ignore 将其报告为已忽略,我将其保留用于暂时忽略的测试。)


JUnit 运行器也经常尝试实例化抽象类,然后由于实例化错误而失败。
非常适合我的基础测试类
这是因为名称(它不以 Test 结尾)而不是因为 abstract 修饰符而起作用。将类名更改为 MyBaseClassTest ,它将尝试按@HollyCummins 所述进行实例化(并失败)
就我而言,它应该是 protected abstract class
R
Raghu K Nair

如果这是您的基本测试类,例如 AbstractTest 并且您的所有测试都扩展了它,那么将此类定义为 abstract 如果它是 Util 类,那么最好从类中删除 *Test 重命名为 MyTestUtil 或 Utils 等。


S
Sridhar Sarnobat

使用 IDE 的代码完成添加 @Test 的导入时要小心。

例如,它必须是 import org.junit.Test 而不是 import org.testng.annotations.Test。如果你做后者,你会得到“没有可运行的方法”错误。


这应该是评论而不是答案。
我不明白为什么。这是一个有效的解决方案。
Intellij Idea 2017 通过导入 org.junit.jupiter.api.Test 来搞乱我的想法!但多亏了你,现在解决了
非常感谢,在遇到“没有可运行的方法”问题时我很困惑。
m
mc1arke

Ant 现在带有 skipNonTests 属性,该属性旨在完全满足您的需求。无需更改基类以对其进行抽象或添加注释。


看起来 skipNonTests 属性仅在 ant 1.9+ 中可用,这很遗憾,因为它看起来非常有用。它还将排除抽象测试超类。
a
akuhn

给这些类添加一个空的测试方法怎么样?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() {
    assertTrue(true); // do nothing;
}

但这错误地增加了我们的测试数量:) 这不是什么大不了的事
i
illuminatos

如果在你的测试类中写了 import org.junit.jupiter.api.Test;删除它并写入 import org.junit.Test;在这种情况下,它也对我有用。


令人惊讶的是,它奏效了。我在 Windows 命令行中手动执行。但是,另一个问题是 @BeforeAll@AfterAll 没有运行。
看起来,JUnit4 工作(与 @BeforeClass@AfterClass,但 JUnit5 没有。参考:junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
R
Rahul Vig

在运行最简单的简单代码(使用@Test、@Before 等)时,我也遇到了类似的问题(“没有可运行的方法……”),但无处可寻。我使用的是 Junit4 和 Eclipse SDK 版本 4.1.2。通过使用最新的 Eclipse SDK 4.2.2 解决了我的问题。我希望这可以帮助那些在类似问题上苦苦挣扎的人。