【问题标题】:Java and JUnit, find missing @Test decoratorsJava 和 JUnit,查找缺少的 @Test 装饰器
【发布时间】:2020-02-26 19:56:12
【问题描述】:

假设我们有一个充满单元测试(数千个)的项目,它们都应该是这样的

@Test
public void testExceptionInBla() {
   // some test
}

但在一种情况下,有人忘记在测试顶部放置一个 @Test 装饰器。

什么是发现这些测试的简单方法,无需手动查看所有代码?

我想找这样的代码,这是一个没有@Test的测试:

public void testExceptionInBla() {
   // some test
}

【问题讨论】:

  • 我会创建一个 perl 或 python 脚本来列出所有出现的/\stest[A-Z]/,其中当前行或上一行不包含@Test。此列表应该足够小,可以访问并修复所有这些问题。

标签: java testing junit decorator


【解决方案1】:

我是你,我会在这里查看一些 Sonnar 规则,我发现一些可能符合要求的内容: https://rules.sonarsource.com/java/RSPEC-2187

【讨论】:

  • 这对我来说似乎是最容易实现的选项。使用 sonarlint。
【解决方案2】:

但在一种情况下,有人忘记将 @Test 装饰器放在 测试。

还有

我想找这样的代码,这是一个没有@Test的测试:

public void testExceptionInBla() { // some test }

使用@Test 注释方法或在方法名称中指定test 前缀在开发人员忘记这样做的后果方面大致相同。
如果@Test 是今天的方式,那不是机会。
@Test 注释在 test 前缀上带来了两个真正的优势:

1) 在编译测试时对其进行检查。例如@Tast 会引发编译错误,而tastWhen...() 不会。

2) @Test 使测试方法名称更易读:它允许使用函数式语言专注于场景。 should_throw_exception_if_blabla() 听起来比 test_should_throw_exception_if_blabla() 更有意义。

关于您的问题:如何确保有效地执行测试,我会以另一种方式看待事情。通常,您希望确保单元测试执行覆盖应用程序源代码的最低级别(如果有意义的话,您可以在包或类级别进行下去)。
这就是覆盖工具的目标(例如 Jacoco)来完成这项工作。 如果至少在指定的最低级别 (look at that post) 未涵盖属于某个包的类的覆盖级别,您甚至可以添加规则以使构建失败。


小添加:
如果您确实确保正确注释了测试方法,那么您有办法:
1) 您必须为测试方法选择一个约定:例如,测试类中的所有实例而非私有方法都是测试方法。
2)创建一个Sonar规则,检索测试类的所有非私有实例方法,并确保所有这些方法都用@Test注解。
3) 将该规则添加到您的声纳规则中。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 2021-02-22
    • 2022-06-28
    • 2011-02-02
    • 2019-11-26
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多