java - 不产生不同输出的单元测试方法

标签 java unit-testing vaadin

在我的 Vaadin GUI 应用程序中,有很多如下所示的方法。

@Override
protected void loadLayout() {
    CssLayout statusLayout = new CssLayout();

    statusLayout.addComponent(connectedTextLabel);
    statusLayout.addComponent(connectedCountLabel);
    statusLayout.addComponent(notConnectedTextLabel);
    statusLayout.addComponent(notConnectedCountLabel);

    connectionsTable.getCustomHeaderLayout().addComponent(statusLayout);
    connectionsTable.getCustomHeaderLayout().addComponent(commandLayout);
    connectionsTable.getCustomHeaderLayout().addComponent(historyViewCheckbox);

    bodySplitter.addComponent(connectionsTable);
    bodySplitter.addComponent(connectionHistoryTable);
    bodySplitter.setSplitPosition(75, Sizeable.Unit.PERCENTAGE);
    bodySplitter.setSizeFull();
    bodyLayout.addComponent(bodySplitter);

    if (connectionDef.getConnectionHistoryDef() == null) {
        historyViewCheckbox.setVisible(false);
    }
    if (connectionDef.getConnectionStatusField() == null || connectionDef.getConnectedStatusValue() == null || connectionDef.getConnectedStatusValue().isEmpty()) {
        connectedTextLabel.setVisible(false);
        connectedCountLabel.setVisible(false);
        notConnectedTextLabel.setVisible(false);
        notConnectedCountLabel.setVisible(false);
    }
}


protected void setStyleNamesAndControlIds() {
    mainLayout.setId("mainLayout");
    header.setId("header");
    footer.setId("footer");
    propertyEditorLayout.setId("propertyEditorLayout");
    propertyEditor.setId("propertyEditor");

    mainLayout.setStyleName("mainLayout");
    propertyEditorLayout.setStyleName("ui_action_edit");
    header.setStyleName("TopPane");
    footer.setStyleName("footer");
}

这些方法用于设置 GUI 的布局。它们不产生单一的不同输出。这些方法中的几乎每一行都在执行单独的工作,与其他行几乎不相关。

通常,在对方法进行单元测试时,我会检查该方法的返回值,或验证对有限数量的外部对象(例如数据库连接)的调用。

但是,对于上面这样的方法,没有这样的单一输出。如果我为此类方法编写单元测试,我的测试代码会检查方法中每一行中发生的每个方法调用,最后,它看起来几乎就像方法本身一样。

如果有人以任何方式更改了代码,测试就会中断,他们必须更新测试以匹配更改。但是,不能保证更改实际上不会破坏任何内容,因为测试不会检查浏览器中绘制的实际 UI。

例如,如果有人更改了控件的样式名称,他将必须使用新的样式名称更新测试代码,测试才会通过。但是,为了让事情真正顺利进行,他还必须更改相关的 scss 样式文件。但测试并没有对检测这个问题做出任何贡献。这同样适用于布局设置代码。

除了将代码覆盖率保持在较高水平之外,编写上述单元测试还有什么好处吗?对我来说,感觉没用,编写一个测试来将方法的反编译字节码与测试中保存为字符串的原始反编译字节码进行比较,看起来比此类测试要好得多。

最佳答案

Is there any advantage of writing unit tests like above, other than keeping the code coverage rating at a higher level?

是的,如果您采取明智的方法。正如您所说,测试控件是否具有特定样式可能没有意义。因此,请将测试重点放在代码中可能损坏的部分上。如果生成 UI 时需要任何条件逻辑,请测试该逻辑。然后,测试将保护您的代码免受 future 可能破坏逻辑的更改的影响。

至于您对不返回值的测试方法的评论,您可以通过多种方式解决这个问题。

  1. 这是您的代码,因此您可以对其进行重组以使其更易于测试。考虑将其分解为更小的方法。将您的逻辑隔离为可在测试中调用的单独方法。
  2. 间接验证 - 不要关注返回值,而应关注您的方法对系统中其他对象的影响。

最后考虑 UI 的单元测试是否适合您和您的组织。 UI 通常很难进行单元测试(正如您所指出的)。许多公司为其 UI 编写功能测试。这些是驱动实际产品 UI 的测试。这与不需要完整产品并且针对非常小的功能单元的单元测试有很大不同。

关于java - 不产生不同输出的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49765720/

相关文章:

java - 测试Java方法输出的 "right"方式是什么?

java - 在 Swing 中使用单例设计模式

spring - 如何为通过 Spring 注入(inject)的 mapstruct 抽象映射器编写 Junit 测试

java - 构建多文物以进行Vaadin应用[Gradle]

java - 部署到 Web 容器、捆绑 Web 容器或嵌入 Web 容器

java - 添加了新的bean.xml并获取类路径资源[Spring-Mail.xml]无法打开,因为它不存在],其根本原因

.net - 如何对私有(private)方法进行单元测试?

unit-testing - 如果单元测试如此出色,为什么没有更多的公司这样做呢?

Vaadin - 表列顺序

java - 使用 Vaadin 和 Spring (MySQL DB) 运行应用程序时出现问题