JUnit:如何避免测试实用程序类中的“无可运行方法”


117

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

我知道,运行程序找不到任何带有@Test属性注释的方法。但是它们不包含此类注释,因为这些类不是测试。令人惊讶的是,当在Eclipse中运行这些测试时,它不会抱怨这些类。

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

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

有没有解决这个问题的优雅方法?


您的测试是否可以在Eclipse / NetBeans /您最喜欢的IDE中工作?
guerda

我用日食。实际上,那里没有问题,eclipse不会尝试运行这些类。我想知道如何?
LiorH

我不知道我们是否理解您的问题。请重新阅读您的问题,并可能添加更多信息。
guerda

1
@guerda:这个问题对我来说似乎很清楚。他的Ant任务是查找不包含测试的类,因为过滤器选择了实用程序类。因此,我的回答仍然是完全相关的。
乔恩·斯基特

LiorH:感谢您的澄清,所以我的回答很浪费:)
guerda

Answers:


49

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


1
我认为这不会有所帮助,因为他转而使用JUnit 4.4,那没关系。
guerda

2
您似乎错过了我的答案。他具有名称过滤器来确定要视为测试的类。如果他更改过滤器,则可以轻松排除助手类。
乔恩·斯基特

1
您的建议是有效的,但是我签出了我的测试课程,有的以Test开头,有的以Test结尾。实用程序类和实际测试类之间没有明确区分。您认为您建议的惯例是一种好习惯吗?(即utils以Test开头,而测试以Test结尾)
LiorH 2009年

4
用* Test作为测试用例类的后缀几乎是一种惯例。您可能需要通过适当地重命名测试类来进行重构,并重命名帮助器,以使它们不会使用该后缀约定。
Spoike

2
我同意Spoike的观点-如果您无法从班级名称中分辨出这是测试还是帮助者,则应重命名该班级。约定更多是“该类是测试,当且仅当它以Test结尾时才是。” 实用程序类可能会或可能不会以Test开头-没关系。
乔恩·斯基特

142

用@Ignore注释您的util类。这将导致JUnit不要尝试将其作为测试运行。


6
实际上,不,不应该。@Ignore用于暂时禁用测试。
爱丽丝·杨

1
对不起,但这不是一个好主意。您是否要开始使用与测试相关的注释来注释生产代码,仅仅是因为它们可能与测试模式匹配?正确的答案是修复类名,如果它们触发了测试的模式匹配。并确保模式仅找到以Test结尾的类。这是一种普遍接受的模式
Kevin M,

是的,这很糟糕,直到我贡献了我无法删除的另一个投票后,我才意识到这一点。使您的基类抽象,然后JUnit将忽略它。请参阅下面的@gmoore答案。
Ryan Shillington

83

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

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

7
@Ignore
neworld 2015年

我尝试了@Ignore的方法并认为,很好,然后我阅读了此答案并将自己拍在额头上,“ 当然!”
燕窝

38

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

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

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


3
JUnit运行程序也经常尝试实例化抽象类,然后由于实例化错误而失败。
Holly Cummins 2014年

非常适合我的基础测试课程
ruX

3
之所以起作用,是因为名称(它不会在Test中结束),而不是因为abstract修饰符。将类名称更改为MyBaseClassTest,它将尝试实例化@HollyCummins提到的(并且失败)
Hutch

就我而言,应该是protected abstract class
Mystic Lin

18
  1. 如果这是您的基本测试类(例如AbstractTest),并且所有测试都对此进行了扩展,则将该类定义为抽象
  2. 如果它是Util类,则最好从该类中删除* Test,将其重命名为MyTestUtil或Utils等。

10

使用IDE的代码补全添加的导入时请务必小心@Test

例如,它必须是,import org.junit.Test而不是import org.testng.annotations.Test。如果您选择后者,则会收到“无可运行方法”错误。


这应该是评论而不是答案。
Swaranga Sarma

3
我不明白为什么。这是一个有效的解决方案。
Sridhar Sarnobat '16

4
Intellij Idea 2017通过导入org.junit.jupiter.api.Test代替了我的思维!但多亏了您,现在它已经解决了
AmiNadimi

非常感谢,在遇到“没有可运行的方法”问题时,我感到困惑。
Peter S.

7

Ant现在带有该skipNonTests属性,该属性旨在完全按照您的期望进行操作。无需将您的基类更改为抽象或向其添加批注。


2
skipNonTests属性似乎仅在ant 1.9+中可用,这很可惜,因为它看起来非常有用。它还将排除抽象测试超类。
Holly Cummins 2014年

4

向这些类添加空的测试方法呢?

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

8
但这错误地增加了我们进行的测试的数量:)并不是什么大不了的事
Sudarshan 2012年

1

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


1
令人惊讶的是,它有效。我在Windows命令行中手动执行。但是,另一个问题是,@BeforeAll并且@AfterAll未运行。
BingLi224

貌似,JUnit4可以使用(和@BeforeClass和一起使用@AfterClass,但JUnit5不能。参考:junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.