【问题标题】:Code coverage does not reach class declaration代码覆盖率未达到类声明
【发布时间】:2018-03-10 16:50:57
【问题描述】:

有没有办法让代码覆盖率覆盖这样的类的类声明?

public class MyClass{

    public static void foo(int bar){
        System.out.println("The Number is: "+bar);
    }
}

我可以通过 JUnit 测试轻松地使用 foo 方法,但 MyClass 声明保持红色。这是因为类本身没有构造函数吗?如果是这样,有没有办法覆盖那段代码,而不改变类本身的代码?

谢谢

【问题讨论】:

  • 不相关,但是该类是要实例化的吗?如果没有,它可能应该有一个私有构造函数。
  • 代码覆盖率告诉你什么是执行。声明不是可执行代码。
  • 对此持保留态度:从一个在商店工作过一段时间的人那里强制执行代码覆盖要求,知道他们很愚蠢,因为您的覆盖工具想要突然拿起类声明.
  • 因此,可能将“类”行标记为已执行,作为标记不可见默认构造函数的不良替代品。但这是一种艺术选择,在实践中几乎不重要,因为默认构造函数不做任何事情,而且您无法做很多有用的测试。我还遇到了希望将类之间的空白行标记为已覆盖的商店,以便在极端情况下文件获得 100% 的覆盖率。当你坚持 line 覆盖时,你会得到这个。如果您改为使用分支覆盖率,您可以获得 100% 的覆盖率,而无需过多地覆盖声明或空白行。
  • @IraBaxter 实际上,我今天发现自己在 StackOverflow 上寻找的原因是我有一个代码覆盖案例说我没有覆盖一个分支,其中那行代码是类声明。所以我想它仍然会发生,但我一直在四处寻找是否有其他人看到它发生过。

标签: java unit-testing junit code-coverage


【解决方案1】:

这可能取决于您的特定环境。但我刚刚检查了 Eclipse/EclEmma 并看到了你描述的行为。

记住,类确实有一个构造函数——它是默认构造函数。如果你做一个简单地调用new MyClass()的测试,看起来红色标记消失了。

但是 - 对于只有静态方法的类,首选方法是将类标记为 final 并创建一个私有构造函数。当然,如果你创建了一个私有构造函数,它会在代码覆盖中显示为红色——因为你不能调用私有构造函数!

最后,请记住代码覆盖率是一种工具。我不会因为查看器中的红色标记而烦恼。

【讨论】:

  • 当您在工作中没有强制使用 SonarQube 时,说“不要为红色标记而生气”之类的话一定很容易,所以红色标记现在意味着您的 PR进不去。
【解决方案2】:

你的问题迫使我给出两个 cmets 而不是直接回答:

  1. 除非有充分的理由,否则不要使用 static 关键字。

    一种常见的误解是,用于提供通用功能的类应该(仅)具有static 方法。这是因为习惯将只有static 方法的类称为实用程序类

    这样的所有静态实用程序类将使您的代码难以扩展和重用。而且你抛弃了 OOP 中最强大的工具之一:多态。而您唯一的优势是不需要编写构造函数调用...

  2. 寻找 CodeCoverage 很容易,因为我们有工具为我们提供数字,而且经理们喜欢根据开发人员产生的数字来判断他们......

    但更重要的是需求范围。不幸的是,我们没有衡量需求覆盖率的工具。我们必须达到 100%需求覆盖率的唯一工具是测试/行为驱动开发 (TDD/BDD)。

【讨论】:

  • 这里的第 1 点真的取决于。也许您正在完全以函数式风格编写代码,在这种情况下,在静态方法中包含许多纯函数对我来说似乎非常好。您仍然可以获得可重用性,只是处于不同的水平。
  • @Trejkaz 您的观点只是短期的。如果需求发生变化并且您必须支持支持不同数据处理的某种方法的不同版本怎么办?使用您的方法,您必须更改方法签名以添加不需要它的选择性参数 braking existing code。如果您没有static 访问权限,您可以简单地在需要的地方使用子类,而其他人甚至都不会注意到。 (开闭原则)
  • 通常,即使以函数式风格编写,我也会将所有选项集中到某种容器中(即使是散列也可能足够),这样您就不必更改实际的方法参数。
  • @Trejkaz “我会将所有选项集中到某种容器中[...],这样您就不必更改实际的方法参数” -- 这意味着你永远不会通过查看方法签名来知道需要什么参数。这不是你老师告诉你的那种信息隐藏...;o)
  • 如果您正在创建其方法需要比超类更多参数的子类,您可以使用继承同样轻松地创建相同的问题。有没有见过一个类层次结构,其中一些子类需要你关闭它们而其他的不需要? ¯\_(ツ)_/¯
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多