【问题标题】:Unit testing: allow for false-positive or bring duplication单元测试:允许误报或带来重复
【发布时间】:2017-07-10 06:40:28
【问题描述】:

我正在测试一个类(除了与其他人交互)创建一个对象,该对象的字段由调用者传递的常量和值组成:

private String createService(Long organizationId, String prototypeId,
    MedicalService medicalService)
{
    ServiceType service = new ServiceType();

    service.setClinic(organizationId.toString());
    service.setType("0");
    service.setPrototype(prototypeId);
    service.setCode(medicalService.getCode());
    service.setName(medicalService.getName());
    service.setIndependent(true);
    service.setRepeated(false);

    return remoteWS.createService(service);
}

我是否应该测试每个字段的设置是否正确?

我怀疑的原因是它会引入重复并降低可读性。特别是我倾向于做反射断言。

这只允许检测一些“愚蠢”的输入错误,例如如果两者都是String 类型,则将code 写入name 字段。

这种重复合理吗?

【问题讨论】:

    标签: unit-testing testing tdd


    【解决方案1】:

    解决此问题的一种方法:如果您有“数据”以某种方式“共同”属于,那么该数据值得其拥有类。

    对于这种情况,你可以使用 scala 为 scala 调用的 value class,或者 kotlin 提供的 data class。换句话说:一个只存在于包装“一组”值的容器。

    那里的核心方面:例如,您为 equals() 方法提供了合理的实现(在考虑 Java 术语时)。换句话说:您启用像dataObjectA.equals(dataObjectB) 这样的比较,它依次比较该类的所有字段。

    然后您通过在单元测试中创建该数据类的此类实例来使用它,并携带所有预期值。

    这种努力是否值得这个问题不是别人可以告诉你的。您必须评估 A) 在该角落发生错误的可能性 B) 此类错误的成本。

    从 TDD 的角度来看,您测试这些细节。

    我个人的想法:有时必须务实。在我看来,仅“记录”生产代码正在做什么的单元测试并没有太大帮助。尽管如此,有时除了像这样写下来之外别无他法。从这个意义上说:我建议测试这些细节,但是我会退后一步,设计一个解决方案,使编写相应的测试尽可能简单和直接。

    换句话说:我会测试这些东西,但要确保我可以用最少的努力做到这一点。

    【讨论】:

    • 对,这就是我会使用反射 equals 所做的:创建一个具有预期字段值的预期实例,并使用 Unitils 与实际对象进行比较。但我更担心重复:我将有一个地方编写几乎相同的代码来测试设置值的琐碎(无逻辑)例程。后来我不得不在这两个地方修改它。有道理吗?
    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2011-09-30
    • 2016-08-13
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多