检查代码覆盖率的单元测试中的反射

时间:2010-05-20 13:47:54

标签: java testing java-ee tdd junit

这是场景。我有VO(值对象)或DTO对象,它们只是数据的容器。当我把它们分开并将它们分开保存到一个数据库中(由于很多原因)没有优雅地映射到VO时,我想测试是否在数据库中成功创建每个字段并成功读回重建VO。

我有没有办法测试我的测试涵盖了VO中的每个领域?我有一个关于使用反射来迭代VO字段作为解决方案的一部分的想法,但也许你们之前已经解决了这个问题?

当我在VO中添加字段时,我希望此测试失败,并且不记得在我的测​​试中添加对它的检查。

开发环境: 使用JUnit,Hibernate / Spring和Eclipse

3 个答案:

答案 0 :(得分:5)

保持简单:为每个VO / DTO编写一个测试:

  1. 用测试数据填写VO / DTO
  2. 保存
  3. (可选:使用纯JDBC检查所有内容已在数据库级别正确保存)
  4. 加载
  5. 检查加载的VO / DTO和原始的VO / DTO是否匹配
  6. 生产代码将不断发展,并且还需要维护测试。使测试尽可能最简单,即使它们是重复的,恕我直言也是最好的方法。 过度设计测试或测试框架本身使测试通用(例如,通过阅读带反射的字段并自动填充VO / DTO)会导致几个问题:

    1. 编写测试所花费的时间更长
    2. bug可能会在测试中自行引入
    3. 维护测试更难,因为它们更复杂
    4. 测试更难以发展,例如通用代码可能不适用于与其他VO / DTO略有不同的新型VO / DTO,稍后会介绍(仅作为示例)
    5. 测试不能轻易用作生产代码如何工作的示例
    6. 测试和生产代码的性质非常不同。在生产代码中,您尝试避免重复并最大化重用。生产代码可能很复杂,因为它经过测试。另一方面,您应该尝试尽可能简单地进行测试,并且重复是可以的。如果重复的部分被破坏,测试将无论如何都会失败。

      当生产代码发生变化时,这可能需要进行多次测试简单更改。问题是测试被视为无聊的代码片段。但我认为这就是他们的方式。

      如果我的问题错了,请告诉我。

答案 1 :(得分:1)

我建议cobertura执行此任务。 运行测试后,您将获得完整的代码覆盖率报告,如果使用cobertura-check ant任务,则可以添加对覆盖范围的检查,并使用属性haltonfailure停止ant调用。

答案 2 :(得分:0)

您可以将其作为VO验证的一部分。如果在使用getter时未设置字段,则可能会抛出异常。

相关问题