关闭

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

229人阅读 评论(0) 收藏 举报
分类:

这个部分,我们将了解如何测试 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的中间记录一个片段。





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38938次
    • 积分:1164
    • 等级:
    • 排名:千里之外
    • 原创:78篇
    • 转载:0篇
    • 译文:2篇
    • 评论:2条
    文章分类
    最新评论