JUnit:如何在test utils类中避免"没有runnable方法"

Lio*_*orH 114 java ant testing junit

我已经从JUnit3.8切换到JUnit4.4.我使用ant运行我的测试,所有测试都成功运行,但测试实用程序类失败并显示"No runnable methods"错误.我使用的模式是在测试文件夹下包含名称为*Test*的所有类.

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

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

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

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

Joe*_*lPM 141

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

  • 谢谢.这应该是公认的答案! (10认同)
  • 实际上,不,它不应该.@Ignore用于暂时禁用测试. (6认同)
  • 抱歉,这是个坏主意。您想开始使用与测试相关的注释来注释您的生产代码,只是因为它们可能与测试模式匹配?正确的答案是修复类名,如果它们触发测试的模式匹配。并确保模式只找到以 Test 结尾的类。这是一个普遍接受的模式 (2认同)

gmo*_*ore 81

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

public class VenueResourceContainerTest extends BaseTixContainerTest
Run Code Online (Sandbox Code Playgroud)

一切都延伸

BaseTixContainerTest
Run Code Online (Sandbox Code Playgroud)

和JUnit试图运行BaseTixContainerTest.可怜的BaseTixContainerTest只是试图设置容器,设置客户端,订购一些披萨并放松......男人.

如前所述,您可以使用注释对类进行注释

@Ignore
Run Code Online (Sandbox Code Playgroud)

但这导致JUnit报告该测试被跳过(而不是完全被忽略).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1
Run Code Online (Sandbox Code Playgroud)

那种烦恼我.

所以我创建了BaseTixContainerTest抽象,现在JUnit真的忽略了它.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
Run Code Online (Sandbox Code Playgroud)

  • 比`@ Ignore`好多了 (6认同)

Jon*_*eet 48

假设您已经控制了用于查找测试类的模式,我建议将其更改为匹配*Test而不是*Test*.这种方式TestHelper不会匹配,但FooTest会.

  • 使用*Test对测试用例类进行后缀几乎是一种约定.您可能需要通过适当地重命名测试类来重构,并重命名帮助程序,以便它们不会使用该后缀约定. (4认同)
  • 你似乎错过了我的回答.他有一个名称过滤器来确定要被视为测试的类.如果他更改了过滤器,他可以轻松地排除帮助程序类. (2认同)
  • 我同意Spoike - 如果您无法从班级名称中判断出它是测试还是帮助,您应该重命名该类.约定更多"当且仅当它以Test结束时,该类才是测试." 实用程序类可能会也可能不会以Test开头 - 这没关系. (2认同)

fro*_*h42 36

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

public abstract class MyTestBaseClass { ... whatever... }
Run Code Online (Sandbox Code Playgroud)

(@Ignore报告它被忽略了,我保留暂时忽略的测试.)

  • JUnit运行程序也经常尝试实例化抽象类,然后失败并出现实例化错误. (3认同)
  • 这是因为名称(它不在Test中结束),而不是因为abstract修饰符.将类名更改为MyBaseClassTest,它将尝试实例化@HollyCummins所提到的(并失败) (3认同)

Rag*_*air 16

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


Sri*_*bat 8

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

例如,它必须是,import org.junit.Test而不是import org.testng.annotations.Test.如果您执行后者,您将获得"无可运行方法"错误.

  • 我不明白为什么.这是一个有效的解决方案. (2认同)
  • Intellij Idea 2017通过导入`org.junit.jupiter.api.Test`代替了我的思维!但多亏你了,现在解决了 (2认同)

mc1*_*rke 7

Ant现在提供的skipNonTests属性旨在完全按照您的要求进行操作.无需更改基类来抽象或向其添加注释.

  • 看起来`skipNonTests`属性仅在ant 1.9+中可用,这很可惜,因为它看起来非常有用。它还将排除抽象测试超类。 (2认同)