Ⅰ.2.6.6 如何测试Graphics Views、Graphics Scenes 和 Graphics Items (Qt 4)

来源:互联网 发布:仓库平面图制作软件 编辑:程序博客网 时间:2024/05/29 18:01

Qt 4.2介绍了QGraphicsView、QGraphicsScene 和 QGraphicsItem及其子类的的graphics/view 结构。两个附加类被添加到Qt 4.4中,另两个被添加到Qt 4.6中。对于测试使用该结构的应用程序,Squish提供了所有支持。

这个部分我们将测试一个简单的示例应用程序(example/qt/shapes),该应用程序使用一个图形视图作为它的主窗口区域。这幅图包括了标准的widgets,以及一些可以添加QGraphicsItems的部件。下面展示了Shapes应用程序的截图,截图显示Shapes已经添加了几个graphics items。


The Shapes example

Shapes应用程序的buttons,labels,spinbox以及LCD number widgets是标准的QWidget的子类,作为QGraphicsProxyWidgets添加在view中。用户可以通过点击合适的按钮来添加boxes(QGraphicsRectItems),text items QGraphicsTextItem,以及polygons(这些是具体应用程序自定义的RegularPolygonItem items)——它们经常开始是三角形,但有一个context 菜单可以将它们变成正方形或者返回三角形。Rubber band selection已经打开便于选择多个items(当然不是widgets)。用户可以拖拽移动items,选择后删除它们以及点击Delete按钮删除,可以通过操作spinbox对选择的items更改其Z 顺序。

这个部分我们将执行下面简单的测试计划来测试多个Shapes的features,显示Qt的graphics/view结构是如何实现的。

1. 启动时,检验Add Box,Add Polygon,Add Text,以及Quit按钮已被激活,并且Delete按钮和Zspinbox未被激活。

2. 添加两个方形,检验第二个的x和y坐标比第一个多5 pixels,并且第二个的z值比第一个多1。

3. 添加一个Polygon并确认他是三角形,即它的polygon事实上只有三个顶点。

4. 右击三角形,选择context menu的Square选项,然后确认它已经变成了一个square,即它的polygon事实上只有四个顶点,

5. 添加一个text item,确认在输入对话框中输入的text 与显示的一致。

6. 确认Count LCD显示了四个items,Delete 按钮和Z spinbox被激活。

7. 使用Rubber band selection选择所有的items,即双击背景,然后点击并拖动直到选取了所有的items,然后将它们拖动到中间位置。现在使用Rubber band selection选取两个boxes,然后点击Delete,然后点击Yes to All。验证Count 现在显示2个items,Delete 按钮和Z spinbox无效。

8. 退出应用程序。

我们可以使用下面所示新的Squish IDE实施测试计划创建一个新的测试套件和一个新的测试案例(例如,一个测试套件叫做suite_py—或者,更具敏感性的的东西—一个测试案例叫做tst_everything)。现在跟着测试计划中的步骤走,无须担心验证。最后应该有个完整的交互记录,用Python的话是到35行,其他的语言稍微多一些。

下一步是合并验证。我们可以直接在代码中做或者使用Squish IDE来做。使用Squish IDE,在每个要验证的地方插入一个断点,然后运行脚本。Squish IDE 将在每个断点停下来,此时可以插入验证。不用关心使用Squish IDE或者手写代码有没有完成验证,结果应该是一样的。(另一个方法是在记录期测试期间插入验证——自己可以任意选择插入验证的方法)

在这个离职中我们手动写代码插入验证,有四个地方待测试。程序一启动我们就开始了,验证所有的按钮是否被激活,除了Delete按钮和Zspinbox。下面是我们插入的实现此功能的代码:

test.verify(waitForObject(":Add Box_QPushButton").enabled)    test.verify(waitForObject(":Add Polygon_QPushButton").enabled)    test.verify(waitForObject(":Add Text..._QPushButton").enabled)    test.verify(waitForObject(":Quit_QPushButton").enabled)    test.verify(not findObject(":Delete..._QPushButton").enabled)    test.verify(not findObject(":_QSpinBox").enabled
对于这些我们期望被激活的对象,使用waitForObject函数,但对于那些我们期望未被激活的必须使用findObject函数。在所有情况下,我们获取对象并测试它的enabled属性。

在添加了两个box和一个polygon之后,我们插入一些附加的代码来检查第二个box相对于第一个box偏移了合适的距离,并且polygon是一个三角形(即,有三个顶点)。

    rectItem1 = waitForObject(":_QGraphicsRectItem")    rectItem2 = waitForObject(":_QGraphicsRectItem_2")    test.verify(rectItem1.rect.x + 5 == rectItem2.rect.x)    test.verify(rectItem1.rect.y + 5 == rectItem2.rect.y)    test.verify(rectItem1.zValue < rectItem2.zValue)    polygonItem = waitForObject(":_QGraphicsPolygonItem")    test.verify(polygonItem.polygon.count() == 3)
这里我们等待创建完了每个box,然后验证第二个box的x和y坐标比diyigebox的大5,并且第二个box的z值大于第一个box。我们也检查polygon item的polygon有三个顶点。

已记录下的代码右击polygon item,使用它的context menu来将它变成一个square。也将以而新的标有‘Some  Text’的text item添加进去。因此我们已经添加了一个第三块代码,检查是否是如预期值。

    test.verify(polygonItem.polygon.count() == 4)    textItem = waitForObject(":_QGraphicsTextItem")    test.verify(textItem.toPlainText() == "Some Text")    countLCD = waitForObject(":_QLCDNumber")    test.verify(countLCD.intValue == 4)    test.verify(waitForObject(":Delete..._QPushButton").enabled)    test.verify(waitForObject(":_QSpinBox").enabled)

一开始就验证polygon item有四个顶点(即是个方形)。然后获取text item,验证它的text是我们输入的文本。QLCDNumber用于显示有多少个item展示出来,因此我们检查它显示的数字是正确的。最后验证delete 按钮和Z spinbox均被激活。

在删除两个item和点击视图(没有item被选择)之后。插入最后几行验证代码。如下:

    countLCD = waitForObject(":_QLCDNumber")    test.verify(countLCD.intValue == 2)    test.verify(not findObject(":Delete..._QPushButton").enabled)    test.verify(not findObject(":_QSpinBox").enabled)

删除了两个item之后应该只剩下两个item了,因此我们验证QLCDNumber显示的数字是正确的。同样的,没有选择任何items的情况下,Delete 按钮和Z spinbox应该未被激活,因此再一次验证一下。

这些验证代码被插入到最后一行记录的脚本之前(即点击Quit按钮)。

整个脚本,包含记录的和手写的部分都在example/qt/shapes/suite_py/tst_everything/test.py下(或者对于JavaScript在suite_js/tst_everything/test.js下,其他语言以此类推)。尽管我们添加了自己的手写的验证脚本,也可以简单的加入断点,导航到我们感兴趣的widgets或者items,点击我们想验证的属性,然后插入一个脚本验证点。或者我们也可以在记录期间点击Control Bar上的按钮插入验证点。(通常最好使用脚本验证因为以后想更改的话他们是最容易编辑的。)

测试graphics/view场景不必测试任何其他的Qt Widget或者item难。Squish给每个graphics item 一个 symbolic names,因此不难识别他们,当然,我们也可以插入断点和使用Spy工具来识别任何一个item,并将它们添加到Object Map中。

想获取跟多测试graphics/view items的信息,参考castToQObject 函数。

0 0
原创粉丝点击