Ⅰ.2.6.4 如何测试 Table Widgets,以及使用外部数据文件(Qt 4)

原创 2015年11月18日 13:58:44

这个部分,我们将了解如何测试 csvtable 程序。这个程序使用了 QTableWidget 来展现一个 .csv(以逗号间隔开值)文件的内容,它提供了基本的处理数据的功能——插入行、删除行、编辑格子 和交换列。这个测试使我们了解了如何导入测试数据,处理数据以及比较QTableWidget展示的值和其期望值。因为 csvtable 程序是一个主窗口风格的应用程序,我们也会学习如何测试menu选项和toolbar按钮的表现是否和预期一致。(含蓄的说,就是它们的基础动作得到了执行。)另外,我们将开发一些泛型函数用于不同的测试。


The csvtable example

这个例子的源代码在目录:SQUISHROOT/example/qt/csvtable下面,测试套件在其子目录下面,例如Python版本的额测试在目录:SQUISHROOT/example/qt/csvtable/suite_py。

表验证点

注意从Squish 4.2开始,有可能使用表验证点来检查整个表。参考17.2。

我们将要看的第一个测试看似很简单,仅由四个可执行语句组成。将几乎所有的功能函数放在公用脚本中即可实现其简单性,这样也可以避免代码重复。代码如下:

Example 6.13 The tst_loading Test Script

def main():
    startApplication("csvtable")
    source(findFile("scripts", “comon.py”))
    doFIleOpen("suite_py/shared/testdata/before.csv")
    tableWidget = waitForObject("{type='QTableWidget' unnamed='1' visible='1'}")
    compareTableWithDataFile(tableWidget, "before.csv")
我们在脚本中通过加载开始,该脚本中包含公用的函数。然后我们调用一个自定义的函数 doFileOpen,该函数通知程序打开指定的文件,这些操作都是通过UI实现的。下一步,使用 waitForObject 函数获取一个指向table widget的引用,最后检查table widget的内同是否和数据文件的内容一致。注意csvtable程序和Squish使用它们自己完全独立的代码来加载和解析数据。(参见18 如何将测试数据导入Squish。)

现在我们来看一下上面用到的自定义的函数:

Example 6.14 Extracts from the Shared Scripts

def doFileOpen(path_and_filename):
    chooseMenuOptionByKey("File", "F", "o")
    waitForObject(":fileNameEdit_QLineEdit")
    components = path_and_filename.split("/")
    for component in components:
        type(":fileNameEdit_QLineEdit", component)
        waitForObject(":fileNameEdit_QLineEdit")
        type(":_QListView", "<Return>")
    

def chooseMenuOptionByKey(menuTitle, menuKey, optionKey):
    windowName = ("{type='MainWindow' unnamed='1' visible='1' "
                  "windowTitle?='CSV Table*'}")
    waitForObject(windowName)
    type(windowName, "<Alt+%s>" % menuKey)
    menuName = ("{title='%s' type='QMenu' unnamed='1' " +
                "visible='1'}") % menuTitle
    waitForObject(menuName)
    type(menuName, optionKey)

    
def compareTableWithDataFile(tableWidget, filename):
    for row, record in enumerate(testData.dataset(filename)):
        for column, name in enumerate(testData.fieldNames(record)):
            tableItem = tableWidget.item(row, column)
            test.compare(testData.field(record, name), tableItem.text())
doFileOpen 函数以通过UI打开一个文件开始,该功能是通过chooseMenuOptionByKey函数实现的。对于chooseMenuOptionBykey函数需要注意的一点是它使用了通配符匹配windowTitle属性(使用?=代替=)。这个对于展示当前文件名或者其他可变文本的windows特别有用。这个函数模仿用户点击Alt-k(k是一个字符,例如"F "代表文件名),然后该字符与所需的动作(如,“o”对应“Open”)通信。一旦弹出打开文件的对话框,对于path中的每个部件和文件,在Return之后doFileOpen 函数键入一个部件,这个样就能引导打开文件了。
当文件已打开,程序加载数据。通过比较table widget显示的数据和文件本身的数据,我们检查数据是否正确加载。这个比较动作由 compareTableWithDataFile 函数实现。这个函数使用Squish的 testData.dataset 函数加载到数据中,所以该数据可以被Squish的API访问。我们期望table中的每个格子符合数据中相应的item,我们通过使用test.compare函数实现这个功能。

既然我们知道了如何比较一个table的数据和文件的数据,我们可以做一些其他的胆大的测试。我们将加载到before.csv文件,删除第一个行、最后一行以及中间一行,在开始和中间部位插入一行新数据,然后在最后添加一行。然后我们调换三对列数据。数据的最后部位应该符合after.csv文件。

与其写代码来做这些事情不如简单的记录一个打开文件执行所有删除、插入以及列交换的测试脚本。然后我们编辑记录下来的测试脚本,添加一些代码用以比较实际结果和期望结果。添加的代码如下:

Example 6.15 Extracts from the tst_editing Script

    # Added by hand
    source(findFile("scripts", "common.py"))
    tableWidget = waitForObject("{type='QTableWidget' " +
                                "unnamed='1' visible='1'}")
    compareTableWithDataFile(tableWidget, "after.csv")
    # End of added by hand
    waitForObject(":CSV Table - before.csv.File_QTableWidget")
    type(":CSV Table - before.csv.File_QTableWidget", "<Alt+F>")
    waitForObject(":CSV Table - before.csv.File_QMenu")
    type(":CSV Table - before.csv.File_QMenu", "q")
    waitForObject("{type='QPushButton' unnamed='1' text='No'}")
    clickButton("{type='QPushButton' unnamed='1' text='No'}")
正如上面摘录出来的脚本所示,添加的几行代码没有插在已记录脚本的最后,而是在程序结束之前。

当然我们可以做其他的测试,例如,检查table的一些属性。这里有一个例子,该例检查行和列的数量是否与期望值一致:

Example 6.16 Testing a Table Widget's Property

    tableWidget = waitForObject("{type='QTableWidget' unnamed='1' visible='1'}")
    test.verify(tableWidget.rowCount == 12)
    test.verify(tableWidget.columnCount == 5)
这个代码片段假设我们已经用了source 函数(对于Ruby来说是require函数)使自定义函数可用。(Tcl的使用者注意,尽管test.verify方法可用,但是通常使用test.compare更方便些)。

这个例子展示了在比较记录代码和手写的代码方面的强大性。如果以后有一个新的特性要加到程序中,我们可以用许多的方法来混合tests。最简单的就是添加另一个测试脚本,做记录,然后加入三行代码来比较table数据是否符合期望值。另一个方法是在临时的test中记录下使用新特性的动作,然后将记录的内容拷贝粘贴到已经存在的test中合适的位置,然后将待比较的文件变成这样的文件:负责对原始数据做了许多改变,同时使用了新特性。或者我们可以使用Squish的IDE在已存在的test的中间记录一个片段。





版权声明:本文为博主原创文章,未经博主允许不得转载。

Ⅰ.20 如何创建和访问应用程序的绑定

这一部分讨论Squish的一个先进并且强大的特性——如何创建提供应用程序绑定的包装套。 自动动态绑定: 从Squish4.0开始,已经加强了对Squish绑定的支持。对于Java和基于Qt的应用程序,...
  • dzh0622
  • dzh0622
  • 2015年12月16日 10:54
  • 373

Ⅰ.2.8 如何做自动压力测试(Automatic Stress Testing)

这个部分解释了如何使用Squish为应用程序实现完全的自动化压力测试。 这里实现的压力测试的类型叫做“Monkey Testing”。这个名字来源于这样的想法:如果你有一屋子的猴子和打字机,不限制时间...
  • dzh0622
  • dzh0622
  • 2015年11月19日 11:36
  • 677

零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用

声明: 《零基础学Qt4编程》中的专栏文章是qter_wd007的原创技术文章。 本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的...

ISE 利用外部数据文件做测试的方法

利用外部文件数据作为模块的输入数据,将文件数据保存在reg里

hadoop学习之-使用ODCH工具实现oralce外部表访问HDFS数据文件

实验说明: 本实验目的是通过使用Oracle的HDFS直接连接器从oracle数据库的外部表中直接访问HDFS的数据文件。支持的数据文件格式取决于ORACLE_LOADER的驱动程序。   一、...

[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间

我们写一个简单的控制台程序。在用到标准库中的函数时,需要添加对标准库的引用。 按照市面上大多数C++程序设计教科书推荐的做法,可以使用#include 或者是#include “iostream.h...

使用Qt 4如何设置QLabe中字体的颜色

Link   : http://blog.csdn.net/qter_wd007/article/details/5919006 (一般设置字体,线条的颜色用setPen(), 设置背景色用setB...

零基础学Qt 4编程之中心窗口部件的使用总结

Qt程序中的主窗口通常具有一个中心窗口部件。从理论上来讲,任何继承自QWidget的类的派生类的实例,都可以作为中心窗口部件使用。 几种常见情形 QMainWindow的中心区...

Qt 4使用MySQL的中文问题解决方法

Qt 4使用MySQL的中文问题解决方法 2011-03-18 18:47 鉴客 oschina 我要评论(0) 字号:T | T Qt 4使用MySQL的中文问题解决方法。在M...

零基础学Qt 4编程实例之如何设置Qt应用程序的观感-使用QStyle类

Qt样式表是专为设置应用程序的观感(look and feel)而生的,它是从Qt 4.2开始引入的描述窗口部件观感的强大机制,允许你按照自己的需求定制应用程序的观感。并且从Qt 4.5开始,Qt样式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ⅰ.2.6.4 如何测试 Table Widgets,以及使用外部数据文件(Qt 4)
举报原因:
原因补充:

(最多只允许输入30个字)