【问题标题】:Emma coverage on Enum types枚举类型的 Emma 覆盖率
【发布时间】:2011-05-29 13:57:14
【问题描述】:

我正在运行 EclEmma,它是 Eclipse 的 Emma 插件,覆盖率报告仅显示我定义的 Enum 的部分覆盖率,即使它显示 Enum 中唯一的值被覆盖。我假设支持 Enum 的隐含方法存在覆盖差距,但我不太确定。

例如,使用此枚举,EclEmma 以绿色突出显示所有内容,但包声明除外:

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

如果我调出课程的覆盖范围详细信息,我会看到:

我的问题是,使用 EclEmma 对我的 Enum 类进行 100% 覆盖的最佳方法是什么?

【问题讨论】:

  • 我以前去过那里的 2 美分,我看到我的开发人员掉进了这个陷阱。感觉你对达到 100% 的代码覆盖率更有热情(超出预期)。这只是浪费时间。覆盖工具报告应仅用于识别代码改进机会(或减少技术部门),不应被视为必须修复。
  • 艾玛没有给你详细说明你错过了什么吗?这似乎有点奇怪。
  • 我同意,但如果有一个简单的方法来获得覆盖,我不会忽略它。这是覆盖率报告中的噪音,我宁愿不必过滤掉以解决实际问题。我认为它没有任何编译器警告。我没有必须修复所有问题,但我不想筛选不太重要的问题来查看我有一个非常重要的新问题。顺便说一句,您的答案是非答案,最好作为评论放置。
  • 同意...我希望我现在可以将它移到评论中...如果这是评论我没想太多;-)
  • 我同意,但你只能用“它有 100% 的测试覆盖率”这句话来推销你的代码/框架/任何东西,如果它真的有的话。悲伤但真实。 +1

标签: java eclipse code-coverage emma


【解决方案1】:

您看到的是由于枚举而生成的一些隐藏字节码。

要解决此问题,请在枚举中添加对 values() 和 valueOf() 方法的调用,正如前面 Carl Manaster 和 Peter Lawrey 所述。

【讨论】:

  • 我发现我只需调用一次 valueOf 即可获得 100% 的覆盖率。我想我必须做的不止这些。
  • 我遇到了与 enumclasses 相同的问题。我能够解决 enum 的情况。但是我的代码覆盖率没有覆盖package 名称。任何建议都会有所帮助
  • @Amolb 你最好的办法是提出一个包含所有相关细节的新问题。这个明确是关于enums,而不是packages。
  • 我针对同一个问题发布了这个解决方案:stackoverflow.com/a/26019028/1279002
【解决方案2】:

我同意其他发帖人的观点,即 100% 的代码覆盖率可能会被误导。 但我不得不承认,对于新编写的核心代码获得 100% 的覆盖率感到满意。

幸运的是,由于所有枚举都扩展了相同的“类”,因此您可以在朋友反思的帮助下实现 100%。

只需在类中添加以下静态方法供测试人员调用,使用 [EnumTypeName].class 作为参数。

  public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) {
    try {
      for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) {
        enumClass.getMethod("valueOf", String.class).invoke(null, o.toString());
      }
    }
    catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }

假设这个静态函数是在一个名为“Shared”的类中实现的,你只需要为每个枚举包含这一行:

Shared.superficialEnumCodeCoverage(UserRole.class);

关键词是“肤浅”。

【讨论】:

  • 反思是最糟糕的朋友。一个背刺者。
  • 只有在枚举类中没有覆盖toString 方法时才有效。在这种情况下,您将不得不调用.name(这使得o 必须为枚举类型(或至少为Enum&lt;?&gt; 类型)。
  • 如果枚举没有任何字段,覆盖仍然不完整
【解决方案3】:

我们遇到了类似的问题,编译器生成的枚举方法(如 values())通常不会在我们的测试代码中被调用。我们通过从最终报告中过滤掉枚举对象的数量来解决这个问题。

这就是为什么我不喜欢使用代码覆盖率来衡量完整性的原因。当我想到更好的指标时,我会告诉你的。 :)

【讨论】:

  • 扯远了:也许您可以编写一个通用的测试方法,它接受任何枚举并练习其固有的方法,只是为了摆脱测试报告的噪音。这有点冒险 - 如果你对所有东西都这样做,你会有 100% 的测试覆盖率并且没有测试值 - 但我认为它可能会满足你的需求。
  • 您可以添加一个通用枚举练习器,该练习器调用 values() 和 valueOf(),您可以使用 exerciseEnum(MyEnum.class) 调用它们
  • 感谢您的反馈。您对覆盖率差距的原因是正确的,但我认为忽略覆盖率报告中的枚举并不是正确的方法。
  • @Carl - 你说得对,风险是正确的,最好直接测试每个枚举的方法,而不是编写神奇的测试算法。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多