演练:操作 Qt 应用中的表格

本文介绍 了针对 Qt 中的 TableView 组件的开发自动化脚本。

背景

有表格数据需要批量导入到目标应用的表格中,手动导入比较繁琐,目标是通过自动化的方式导入。导入的操作包括数据源的读写、应用中表格的修改等。现在我们针对 Qt4 提供的“SpreadSheet”演示应用进行操作。

SpreadSheet应用

本次演练中仍然针对 Windows 7 平台、Qt4.8 的环境实现,然而脚本也适用于更高版本的 Windows 平台。

目标

了解如何使用 CukeTest 进行 Qt 表格(即 TableView 控件)的操作,实现表格的自动化处理。

读取 xlsx 表格文件中的数据;

写入到应用中的表格;

读取应用中的表格数据;

将数据写入到 MySQL 数据库中;

实际操作

用 CukeTest 可以方便的创建 BDD(行为驱动)自动化测试脚本,因此我们在实际演练中会按照 BDD 的方式来开发脚本。

创建项目

打开 CukeTest,在“欢迎”界面选择“新建项目”,项目名称自定义。模版选择 Windows 模版,这是由于 Qt 应用也是一种桌面应用,因此,这个模板会在新建的项目中添加模型文件(*.tmodel)用于管理测试对象。

了解项目结构

假设项目名称为,下面列出了目录树,其中加的文件表示在之后我们需要手动编写的脚本文件。

项目结构

编写 feature 文件

CukeTest 是一个强大的剧本文件(或特性文件)编辑器,后缀名为的文件称作剧本文件特性文件。按照“目标”一节中的自动化步骤,编写文件如下:

编写剧本文件

或者可以直接切换文本模式直接复制以下内容,二者是等效的:

更多剧本文件相关查阅剧本编辑概述[1]

通过 env.js 文件理解项目加载方式

打开文件,可以看到文件中只有一句调用:

该语句是将步骤的超时时限设为 30 秒。缺省超时时间为 5 秒,这可以避免在步骤出现异常时无限期的等待下去。因为有些 Qt 的自动化操作场景可能超过 5 秒,这里设置一个更长的超时时间,即在等待 30 秒以后就会自动停止并报错。

那么这句调用是如何生效的呢?这简单介绍一下 Cucumber 项目的加载方式,在开始运行(包括运行项目、剧本、场景、步骤,但不包括运行脚本)时,项目会加载所有的"features"目录下的文件,如果该文件是 js 文件,则加载过程会使其运行,这时暴露在函数体外的脚本都会运行生效(由于中没有函数,因此所有的代码都在函数体外,会被直接运行)。

可以通过将文件改为如下脚本后,点击运行任意某个剧本文件:

输出结果如下,可以看到文件成功的被加载了:

项目结构使用模型管理器修改模型文件

模型文件中保存的是被测应用的控件的测试对象[2]信息,通过模型管理器识别被测应用中的控件,来得到相应的测试对象。接着我们通过调用测试对象上的 API 来操作控件,实现自动化操作。

因此首先我们需要使用模型管理器添加被测应用的控件,被测应用也就是 spreadsheet 应用。双击 spreadsheet.exe 打开应用,双击项目中的模型文件打开模型管理器进行编辑。

模型管理器

侦测被测应用中的 Table 控件,并添加到模型管理器中即可。事实上,由于 TableView 中的单元格控件的识别属性很有限,无法直接通过识别属性唯一识别某个单元格控件,因此在本次实践中使用了其它的方法。这种方法不依赖模型管理器,因此只需要识别到控件节点类型即可,节点树如下。

节点树

但是我们还是可以通过批量添加控件[3]来了解到该应用的控件结构如下:

表格应用的控件结构编写脚本

接着到了编写脚本,我们需要在步骤定义[4]中编写实现步骤描述的脚本,而为了增加步骤定义的可读性,我们将辅助函数定义在外部。这里我们在 support 文件夹下新建和两个文件,其功能如下:

: 定义了 MySQL 数据相关的操作,包括数据库初始化、连接、查询等。

: 定义了对应用中的表格操作函数,包括取得目标单元格测试对象、修改单元格内容。

表格操作

在编写针对应用中的表格的操作前,我们需要明白两个概念:

测试对象的识别属性:当我们调用目标测试对象的 API 时,会匹配到应用中的一个或多个控件。当匹配到多个控件时(可能由于识别属性不够精确,或者目标控件没有合适的识别属性),接着根据测试对象的属性取出匹配控件数组中的一个控件进行操作。由于的缺省值为 0,因此总是会默认操作识别到的第一个可见控件。在 Qt 中的 TableView 组件中,单元格几乎只有一个值属性,而值有可能动态变化。因此从单元格识别上来说,无法有效识别出各个单元格的差异,因此最后都需要使用属性来取到目标位置单元格对应的测试对象。

getControls(condition)方法:它会匹配当前控件下所有识别属性匹配的子控件。比如以下这个调用:

以上两句调用都代表获得应用中的控件下,所有控件中的第 9 个。

下面编写实际的操作代码:

1. 获取单元格

由于上述的原因,获取表格中的单元格控件需要使用值来索引,但是我们更希望用更加直观的行列坐标来索引目标单元格,因此我们需要一个函数来换算两种索引方式,将以下内容添加到文件中:

2. 表格数据写入

如何将数据写入表格中呢?我们可以细化为单个单元格的写入,再使用上述提供的方法一一索引所有要写入的单元格。

那么单个单元格的写入如何实现?对于其它可以输入的控件类型,比如、、这类控件,可以使用其提供的方法直接修改内容,但是由于在这个应用中,单元格的控件类型为,也就是自定义控件,只提供了部分通用方法。因此我们需要为其定义一个写入内容的方法。

剖析写入单元格的操作,有如下几个步骤:

双击单元格

模拟键盘输入

输入回车/点击单元格外退出单元格编辑

考虑到稳定性,第 3 步建议选择输入回车来退出单元格编辑,并且由于可以在模拟键盘输入这一步输入ENTER信号来实现按下回车键的效果,因此可以与第 2 步一起实现。将以下的代码写入到文件中。

注意这里的是一个异步方法,这是因为完成以上步骤的操作是需要一定时间的,因此我们需要等待操作完成。关于 JavaScript 的异步编程,可以查阅async 函数[5]。

在代码的第 2 行中,通过在输入值后追加“~”符号来输入回车键,这涉及到 KeyCode 的知识,可以查阅附录:输入键对应表[6]。

3. 表格数据读出

除了修改单元格以外,在需要导出数据时,需要读取目标单元格的内容。但是眼尖的读者应该已经发现了,在函数的最后一行,就已经获取了单元格的值——也就是控件的属性,虽然是属性,也同样按照。

是测试对象提供的 API 之一,因此同样是一个异步的方法,需要配合关键字来取得结果。

表格文件操作

CukeTest 的工具箱中提供了 Excel 文件操作的 API,直接拖拽到代码中即可生成代码。工具位于界面左侧“工具箱” -> “协作”。

这次我们针对 xlsx 文件,因此选择第三个“加载 Excel 数据”。

工具箱

更多的 Excel 操作 API 可参考Excel 文件操作[7]。

数据库操作

数据库选用的 MySQL,这里我们将数据库的操作代码全都放在文件中进行管理。

连接到数据库

连接 MySQL 数据库需要使用登录信息,包括用户名、密码、数据库名等,我们将其封装为函数,它传入登录信息并返回数据库连接对象,代码如下:

可能会有读者好奇这里的数据库连接为什么不是异步函数,这个可以通过将鼠标放在方法上观察其返回值是否被包括来分辨。这里只定义了连接的信息,实际的连接行为会发生在运行查询前,因此这里的函数并非异步操作。

运行查询语句

事实上,只要能够在该连接下运行查询语句,我们就可以对数据库为所欲为了。

下面定义的函数,按照包的的参数传递格式,在查询语句中使用作为占位符来传递参数。在之后的步骤定义中我们也会看到用法。或者可以点击查阅查询的执行[8]。

更多的 MySQL 的访问方法可以参考数据库访问[9]。

数据库环境配置

使用以下两句查询语句来创建数据库和表:

步骤定义

下面列出了完整的步骤定义代码:

Q&A

连接数据库出现 ER_NOT_SUPPORTED_AUTH_MODE 错误

这是因为 MySQL 8.0 更新了新的密码加密方式,可以通过将登录用户的加密方式改为兼容 MySQL 5 的类型。使用如下语句:

将和处改为自己的用户名和密码即可。

参考资料[1]

剧本编辑概述:http://cuketest.com/zh-cn/features/overview.html

[2]

测试对象:http://cuketest.com/zh-cn/misc/glossary.html#test_object

[3]

批量添加控件:http://cuketest.com/zh-cn/model_mgr/control_spy.html#batch_add

[4]

步骤定义:http://cuketest.com/zh-cn/cucumber/concepts.html#stepdef

[5]

async函数:http://es6.ruanyifeng.com/#docs/async

[6]

附录:输入键对应表:http://cuketest.com/zh-cn/misc/key_codes.html

[7]

Excel文件操作:http://cuketest.com/zh-cn/shared/excel.html

[8]

查询的执行:https://www.npmjs.com/package/mysql#performing-queries

[9]

数据库访问:http://cuketest.com/zh-cn/shared/database.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200306A0KZ8G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券