4

我想对 NatTable 内容进行简单的 UI 测试(即,不使用 SWTBot 或其他 UI 测试框架)。

我的方法是创建一个外壳,添加我的自定义NatTable,然后访问单元格并检查其内容(数据值、配置标签等):

// Note: this is Xtend code
@Before
def void setup()
{
    shell = new Shell(Display.getCurrent)
    shell.layout = new FillLayout
    parent = new Composite(shell, SWT.NONE)
    parent.layout = new GridLayout
    fixture = new MyNatTableViewer(parent) // this is my custom nattable impl under test
    shell.pack
    shell.visible = true
}

@Test
def void testLabel() 
{ 
    assertCellLabel(2, 2, "test-label");
}

def assertCellLabel(int row, int col, String expected)
{
    val labels = parameterTable.getCellByPosition(col, row)?.configLabels
    assertThat(labels).describedAs("Labels for row " + row + " col " + col).isNotNull
    assertThat(labels.labels).describedAs("Labels for row " + row + " col " + col).contains(expected)
}

要测试我的其他组件,只需创建外壳和父组合就足够了;我的测试不需要打包和设置可见。然而,使用 NatTable,如果单元格不可见,则getCellByPosition()返回null- 所以我添加了代码来打包并将 shell 设置为可见。这适用于小表(有 2 行和几列)。

可悲的是,它不适用于大桌子。我怀疑这是因为视口层不会创建不在可见区域中的单元格(我知道,这就是 NatTable 的优势——它只根据需要创建所需的结构)。当然,这是正常运行时行为所需要的。

但是有没有(另一种)方法可以保证以保证的方式获取单元格(换句话说,我可以让 NatTable/ViewportLayer 相信单元格是可见的,所以null只要单元格在内容方面存在,我就不会得到? )

当然,我可以直接测试我的标签累加器、数据提供者等,但我想在这里更多地从黑盒的角度来解决这个问题。

4

2 回答 2

1

这个问题本身就是矛盾的。您要求使用黑盒方法来测试 NatTable,但您想更改 NatTable 在测试中的行为。这不是黑盒方法!

如果你真的想用黑盒方法进行测试,你需要确保单元格被渲染。这可以通过触发滚动来完成,例如通过执行ShowCellInViewportCommand. 这是真正的黑盒方法,因为为不可见的单元格返回 null 是正确的结果。

如果您需要介于真正的黑盒方法和利用内部知识(您所要求的)的方法之间的东西,您必须找到实现目标的方法。

  1. ViewportLayer. 通常SelectionLayer可以使用。但当然这并不意味着什么,因为层堆栈可能因设置而异。这ViewportLayer是将虚拟性质引入 NatTable 和滚动能力的一种。它避免了对底层的访问。因此,询问其中之一将返回您期望的值。

  2. 通过执行禁用 ViewportLayer TurnViewportOffCommand。这基本上是一种黑客攻击,可能会在后面触发您可能不想要的其他事情。但我在其他情况下看到过这个建议,因此想在这里命名。反正我不建议使用!

请注意,当我们谈论黑盒测试时,这两种方法都更像是 hack,因为您正在对组合进行假设。由于各种配置能力,它们不能被普遍应用。

关于为什么需要将 Shell 设置为可见的隐藏问题。好吧,基本上是因为需要触发用于绘制和调整大小的 SWT 事件,以便根据 Shell 状态正确启动 NatTable 的大小计算和打印。在我们的示例(也是普通的 SWT)中,我们调用Shell#open().

作为对您的实施的最后评论,我不明白您为什么要进行子类化NatTable。我们的 API 从未打算这样做。我想你这样做是为了做一些静态的预配置,例如层堆栈。但就个人而言,我不喜欢这种方法。每次有人扩展我们的类以覆盖一些内部方法时,它最终都会出现问题或错误报告,因为行为发生了变化。但我认为这通常是一个开放 API 的问题,以便为开发人员提供最大可能的定制灵活性。

于 2016-04-28T07:18:40.220 回答
0

我也在尝试从 nattable 的不可见单元格中读取数据。我正在尝试按如下方式使用 ShowCellInViewportCommand:

widget.doCommand(new ShowCellInViewportCommand(gridlayer.getBodyLayer(), column, row)); 
//where row is say 50 and column is 20 and the cell is invisible.

我也试过,

widget.doCommand(new ShowRowInViewportCommand(widget.getLayer(), row)); 
//here the default value given by nattable.getLayer is passed

小部件对应于 nattable 实例。

通话后,UI 中没有任何反应。单元格不显示。我还需要做什么吗?

我应该如何去阅读 nattable 的隐形单元格。

于 2016-06-23T08:38:38.007 回答