最近老板提出桌面应用要上自动化测试,让我研究研究。研究了一阵,这里做一下分享。

我们公司是国产化平台的软件企业,主要做国产 Linux 系统平台的产品。本公司产品主要是 Qt 做的,跨平台地图应用,也包括国产平台,如银河麒麟,搜了一下国内外软件。国外有一家 Squish 能做,国内有 CukeTest 能做。但因为是国产化平台,所以找了国内的这家。申请 CukeTest 试用版,看官方的说明是支持全平台的自动化工具。今天分享一下试用心得。

背景介绍

公司环境主要是银河麒麟、中标麒麟和 Ubuntu。我试用电脑上装了 Ubuntu 18.04,环境里面除了从 apt 安装的默认 qt4.8 跟 5.9,另外手动安装了最新版的 qt 5.15 用于开发桌面应用。

安装

申请了 Linux 完整版试用,拿到了 CukeTest 1.5.14.deb安装包,直接使用dpkg -i命令安装上去,打开了界面如下:

安装界面

示例学习

初见

在欢迎界面右下角提供了几个示例,但是一个个点开看过去都是 Web 跟 API 的示例,而我要的是 Qt 也就是桌面自动化的示例,似乎这里还没有提供。好在官网里面提供了不少 Linux 平台 Qt 测试的文档跟视频,照着视频教程里面提供的示例代码,从 github 拷了一份到电脑准备跑一跑学习一下。

选择了提供的 Qt table 的示例,看描述是针对表格应用的,恰好公司应用里面也涉及到很多表格的正确性测试。示例项目内容如下:

table示例项目

项目的结构如下:

项目结构

因为没看到项目文件之类的可以直接关联打开项目的文件,只有一个package.json文件,检查了一下里面是版权信息跟模版之类的内容。所以直接从 CukeTest 界面打开 table 示例所在的文件夹,打开后如下所示:

打开table示例项目

table示例主界面

试着点击一下工具栏上的运行按钮,CukeTest 就最小化进入运行状态了,弹出一个应用,运行时似乎还有字幕显示。因为很快就运行完了,总共跑了十几秒,运行结束以后跳出了一个图表,应该就是描述刚刚的运行情况了。

运行结果

仔细看了一下跟项目,至少我大概明白了这个软件的测试方式,也就是它根据这一个个场景与步骤的定义来执行,如果步骤的执行有问题,就会呈现在这个报表上,好让测试人员查看。

步骤比对

模型管理器

接着看教程视频,了解到这个软件还有一个管理控件识别的模块,叫作模型管理器,用于把要操作的控件加进去以便进行自动化,而保存这些控件信息的文件就叫作模型文件,位于项目中的features/step_definitions/*.tmodel文件中。双击该文件打开了模型管理器,如下:

模型管理器

第一次启动的用模型管理器侦测控件时,我从 CukeTest 的安装目录下找到了被测的表格应用,就是 Qt 自带的样例 Dock Widget。手动把它打开了,但是却出现了控件识别不到的问题: 识别应用中的控件没有识别到。高亮模型管理器中已有的控件都不生效,会出现了错误1003: 无法找到匹配的应用:

识别与高亮失败

接着看视频,找到了问题的所在,是由于自动化的机制决定了要通过特殊的方式启动被测应用,这里我们通过模型管理器启动一下这个表格应用,之后才能识别到。因为它会在被测应用中加载一个名为Qt Agent的服务。之后才看到这篇文档中有讲解:启动应用

完美解决了问题!识别跟高亮功能都能正常的运作,如下所示:

识别新的控件

并且在模型管理器左下角也出现了被测应用的信息:

![应用信息

接着在识别到的控件中控件操作标签页,看到了提供的一些自动化操作,而且工具看起来是针对不同的控件都有不一样的操作方法,文档中也提供了这些操作方法的参考手册对象操作 API。下面是用工具提供的set方法修改单元格数据的结果:

修改单元格数据

好了,现在我觉得我已经部分掌握了自动化桌面软件的基础了,让我开始来试试完整的自动化流程。

编写自动化

补课

打开主要的代码文件definition1.js,刚了解了一下 CucumberJS 框架,所以这个代码也比较容易看懂,大致就是每个场景的步骤对应一个函数。里面有好多 async/await 的关键字,之前了解 Node.js 的语法时好像没看到这部分。为了看懂这些代码,我又把 Node.js 中的异步调用一章看了一下,主要是 Promise 和 async/await 的用法,node 果然很先进啊,async/await 可以完成异步调用,相当于是通过这种方式实现多线程的效果,这下涨经验了。

脚本界面

再次回去复习了视频教程,发现里面提到了,表格控件因为是复杂控件,CukeTest 提供了额外的自动化方法来应对不同的自动化场景,这里实际上只要再掌握一个getItem操作方法就可以应对了。

getItem操作方法能够根据传入的行列信息获取目标位置的单元格对象(类似 Excel 中定位单元格的方式),获取到这个对象以后再去执行它的操作方法即可。更多内容可以查看表格的参考手册

自己动手丰衣足食

看完视频,脑子说:噢我会了,手说:你会了个啥?这大概是自己模仿视频教程写一个自动化项目的真实感受了。创建项目的第一步就栽了个跟头,做到后面发现我这项目怎么没有.tmodel文件呢?回头看了下视频发现没改模版,选择了 Basic 模版,又赶忙重新建了一个,选择 Qt 模版。

注意选择Qt模版

这回创建的味儿对了:

有tmodel了

接着是我自己写的一个简单的自动化流程,或者说自动化剧本,总体上是跟示例项目的结构一致的,自己只新建了一个hooks.js文件。

我的自动化流程

hooks.js文件

开始运行

在运行的过程中,因为表格比较长,其中一个步骤要执行很久(因为我在步骤里面遍历了整个表),以至于误触了超时时间。在hooks.js文件中设置了超时时间为 30 秒,所以当运行某个步骤时超过了这个时间,就会触发timeout的错误然后退出。按照文档超时里的方法,把hooks.js文件中设置的超时时间调为-1 来禁用掉超时(虽然官方不建议这么做)来完整的执行完自动化。

自动化的结果如下:

被测应用的运行结果

控制台的输出

运行结束后获得了一个运行报告:

被测应用的运行结果

总结

这次的试用体验总体来说还不错,尤其是现在 Linux 平台的自动化测试工具还没有流行的软件,CukeTest 算是 Linux 平台做桌面自动化测试的一种选择。而且去了解了一下这个工具的背景,它其实一直都是支持全平台的,但是桌面自动化这一块原先是在 Windows 平台耕耘了很久,在不久前才正式宣布支持 Linux 平台的 Qt 桌面自动化,但是从体验上来说已经具有相当的成熟的机制跟体系了。在我用的国产软件中算是不错的水平,可以赞一下。后面如果再有些试用心得再跟大家分享。


↙↙↙阅读原文可查看相关链接,并与作者交流