【问题标题】:JUnit: how to avoid "no runnable methods" in test utils classesJUnit:如何避免测试工具类中的“无可运行方法”
【发布时间】:2010-10-14 22:06:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: java ant junit testing


【解决方案1】:

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

【讨论】:

  • 看起来skipNonTests 属性仅在 ant 1.9+ 中可用,这很可惜,因为它看起来非常有用。它还将排除抽象测试超类。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

例如,它必须是 import org.junit.Test 而不是 import org.testng.annotations.Test。如果你做后者,你会得到“no runnable methods”错误。

【讨论】:

  • 这应该是评论而不是答案。
  • 我不明白为什么。这是一个有效的解决方案。
  • Intellij Idea 2017 通过导入 org.junit.jupiter.api.Test 代替了我的想法!不过多亏了你,现在解决了
  • 非常感谢,我在遇到“没有可运行的方法”的问题时很困惑。
【解决方案4】:
  1. 如果这是您的基础测试类,例如 AbstractTest 并且您的所有测试都扩展了它,则将此类定义为 abstract
  2. 如果是 Util 类,最好从类中删除 *Test,将其重命名为 MyTestUtil 或 Utils 等。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      要防止 JUnit 实例化您的测试基类,只需创建它

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

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

      【讨论】:

      • JUnit 运行者也经常尝试实例化抽象类,然后因实例化错误而失败。
      • 非常适合我的基础测试类
      • 这是因为名称(它不以 Test 结尾)而不是因为 abstract 修饰符而起作用。将类名更改为 MyBaseClassTest ,它将尝试按@HollyCummins 所述进行实例化(并且失败)
      • 就我而言,应该是protected abstract class
      【解决方案7】:

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

      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 方法并认为,这很好,然后我读了这个答案并拍了拍自己的额头,“当然当然!”
      【解决方案8】:

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

      【讨论】:

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

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

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

      【讨论】:

      • 但这错误地增加了我们的测试数量:) 这不是什么大不了的事
      【解决方案10】:

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

      【讨论】:

      • 我认为这不会有帮助,因为他迁移到了 JUnit 4.4,这应该没关系。
      • 您似乎错过了我回答的重点。他有一个名称过滤器来确定要被视为测试的类。如果他更改过滤器,他可以轻松地排除辅助类。
      • 您的建议是有效的,但是我检查了我的测试类,有些以 Test 开头,有些以 Test 结尾。实用程序类和实际测试类之间没有明确的区别。您认为您建议的约定是一种好的做法吗? (即 utils 以 Test 开头,测试以 Test 结尾)
      • 在测试用例类后面加上 *Test 几乎是一种惯例。您可能需要通过适当地重命名测试类并重命名帮助程序来重构,以便它们不会使用该后缀约定。
      • 我同意 Spoike 的观点——如果你无法从类的名称中判断它是测试还是助手,你应该重命名类。约定更多的是“当且仅当它以 Test 结尾时,该类才是测试。”实用程序类可能会或可能不会以 Test 开头 - 没关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多