我希望对SWTBot内容进行简单的UI测试(即不使用NatTable或其他UI测试框架)。
我的方法是创建一个shell,添加自定义的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)
}要测试我的其他组件,只需创建shell和父组合就足够了;打包和设置可视化并不是我的测试所必需的。但是,使用NatTable,如果单元格不可见,getCellByPosition()会返回null --因此我添加了打包代码并将外壳设置为可见的。这适用于小表(有2行和几列)。
遗憾的是,它不适用于大桌子。我怀疑这是因为视口层没有创建不在可见区域的单元格(我知道,这是NatTable的强度--它只根据需要创建所需的结构)。当然,这是正常运行时行为所需要的。
但是,是否有(另一种)方法可以保证以一种保证的方式获得单元格(换句话说,我是否可以让NatTable/ViewportLayer相信该单元格是可见的,这样只要单元格存在内容,我就不会得到null )?
当然,我可以直接测试我的标签累加器、数据提供者等,但是我想从黑匣子的角度来更多地处理这个问题。
发布于 2016-04-28 07:18:40
这个问题本身是矛盾的。您需要一种用于测试NatTable的黑匣子方法,但您希望在测试时更改NatTable的行为。那不是黑匣子的方法!
如果确实希望使用黑匣子方法进行测试,则需要确保呈现单元格。这可以通过触发滚动来实现,例如通过执行ShowCellInViewportCommand。这是真正的黑匣子方法,因为对不可见单元格返回null是正确的结果。
如果你需要一种真正的黑箱方法和一种利用内部知识(这是你所要求的)之间的东西,你必须找到方法去达到这个目的。
ViewportLayer下面的一个层上操作。通常可以使用SelectionLayer。当然,这不需要任何意义,因为层堆栈可能因设置不同而有所不同。ViewportLayer是将虚拟性质引入到NatTable和滚动能力的系统。它避免了对底层的访问。因此,询问其中之一将返回您所期望的值。TurnViewportOffCommand。这基本上是一个黑客,并可能触发额外的东西在背后,你可能不想要。但我在其他情况下看到了这一建议,因此想在这里提出它。反正我也不建议你用!请注意,当我们讨论黑匣子测试时,这两种方法更像黑客,因为您是在对组合进行假设。由于配置能力的不同,它们一般不能应用。
关于为什么需要将Shell设置为可见的隐藏问题。基本上,因为需要触发用于绘制和调整大小的SWT事件,以便根据Shell状态正确地启动NatTable的大小计算和打印。在我们的示例(也是普通的SWT)中,我们称之为Shell#open()。
作为对您的实现的最后一点评论,我不明白您为什么要将NatTable划分为子类。我们的API从未打算这样做。我想你这样做是为了做一些静态的预配置,例如层堆栈。但就我个人而言,我不喜欢这种方式。每当有人扩展我们的类以覆盖某些内部方法时,它就会出现问题或错误报告,因为行为会发生变化。但我认为,这通常是一个开放API的问题,以使开发人员在定制方面获得最大的灵活性。
发布于 2016-06-23 08:38:38
我也试图从不可见的细胞中读取数据。我试图按以下方式使用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小部件会腐蚀到可攻击的实例。
调用之后,UI中什么都不会发生。单元格不显示。我还需要做什么吗?
我该如何去读不可见的细胞。
https://stackoverflow.com/questions/36888212
复制相似问题