使用QtTesting建立可视化软件的自动化测试系统

自动化测试是现代大型软件的必要组成部分。通过使用大量的无人值守的自动化测试算例,达到维护大型软件产品的稳定性的目的。对于可视化软件,建立自动化测试系统难度大,相关资料少,笔者曾经写过关于工程仿真CAE软件的自动化测试文章,参见《自动化测试大型通用工程仿真CAE软件》《快速创建WELSIM的回归测试算例》,《大型工程仿真CAE软件的自动化回归测试》。本文从软件开发角度,讨论如何使用QtTesting快速实现可视化软件的自动化测试系统。

QtTesting是一款开源测试框架,协议友好,类似BSD3可以用于商业产品。实际应用于VTK, ParaView, Slider3D,WELSIM等大型可视化软件中。是被实践证明的有效且好用的测试框架。只要产品是使用QT作为可视化框架的软件,都可以使用QtTesting作为测试系统的基础组件。QtTesting的源代码可以从https://gitlab.kitware.com/paraview/qttesting或https://github.com/Kitware/QtTesting直接下载得获得。

虽然QtTesting官方定位其用于UI的测试,但在实际使用中,QtTesting不仅测试GUI,也可以通过GUI提供的属性,来测试产品的其他任何功能,如计算结果的精确性等。WELSIM中的大量数值结果都可以通过QtTesting的功能来验证。

QtTesting框架结构

QtTesting的测试模块含有录制与运行两大模块。两个模块都是通过与QT框架中的元器件(Widget)建立连接,来实现与可视化框架的互动。录制功能是通过捕捉元器件的事件或信号,运行是通过遍历的方式获取当前元器件的对象,实现对控件的控制。

录制测试

录制模块为用户提供了快速建立测试文件的方式,本质上是一种鼠标,键盘与窗口控件的宏命令。当用户在界面上进行某种低级 Qt 事件如“鼠标移动”,“按下按钮”,“释放按钮”等,所产生的信号将会被捕捉到,并转换为可以序列化和播放的高级事件,例如“按钮激活”。QtTesting中的pqWidgetEventTranslator类及其派生类从中承担的重要的工作。pqWidgetEventTranslator 的派生类会需要实现translateEvent()方法,用于处理Qt的事件,同时转换信号为由两个字符串组成的高级事件:一个命令和一个命令参数(参数可能为空)。最后,通过发射 recordEvent() 信号一次或多次将高级事件传递给其输出容器,并保存到XML文件上,完成一条宏命令的录制。

在程序运行时,pqEventTranslator 会接收到整个应用程序在运行时发生的每个 Qt 事件,并将 Qt 事件依次传递给其每个 pqWidgetEventTranslator 实例。由 pqEventTranslator 发射的高级事件可以被对应的观察者捕获。观察者可以将高级事件序列化打印输出,或者保存。目前,QtTesting包含两个观察者,pqEventObserverStdout 和 pqEventObserverXML,它们分别将高级事件序列化到标准屏幕输出和 XML 文件中。开发人员还可以创建自己的观察者来实现自定义功能,例如将事件序列化到日志文件、Python 脚本等。

录制模块也可以记录检验事件,如验证某个属性。在检查时,一个覆盖层会在鼠标悬停的小部件上绘制。如果覆盖层为绿色,则表示可以检查该小部件,如果为红色,则表示不可以。当点击小部件进行检查时,将记录一个检查事件,并输出一个相关的QString 值。此功能也是WELSIM自动化测试中验证数值计算准确性的重要部分。

运行测试

在运行自动化测试时,其本质就是播放录制好的宏命令。在QtTesting框架中,pqEventSource 提供了一个抽象接口,用于提供“高级事件”流的对象。pqXMLEventSource 继承pqEventSource ,并实现具体功能,它能够读取由 pqEventObserverXML 生成的 XML 文件。

pqEventPlayer 维护了一组 pqWidgetEventPlayer 对象,负责将高级事件转换为低级事件。pqEventDispatcher 从 pqEventSource 获取事件,并将其传递给 pqEventPlayer 的一个实例进行运行。运行时,每个高级事件都被编码为三个字符串(地址、命令和参数),这些字符串被传递给 pqEventPlayer::playEvent()。pqEventPlayer 解码地址字符串,并使用它查找相应的小部件。然后,高级事件和小部件依次传递给每个 pqWidgetEventPlayer,直到其中一个发出事件已被处理的信号。

创建新的录制器和运行器

一个新的录制器至少必须重新实现 translateEvent(QObject object, QEvent event, int eventType, bool& error) 方法。首先,它必须检查对象是否是正确的类。然后,它应该处理 pqEventTypes::ACTION_EVENT 情况,保存命令和相关参数。并且有时它还应该能够处理 pqEventTypes::CHECK_EVENT的情况。

类似的,一个新的运行器至少应重新实现 playEvent(QObject* object, const QString& command, const QString& arguments, int eventType, bool& error) 方法。首先,它应该处理 pqEventTypes::ACTION_EVENT,将读取的命令和参数转换为 Qt 指令,对于它能处理的事件返回 true。在检查命令时,它应该能够处理 pqEventTypes::CHECK_EVENT事件类型,使用提供的命令和参数检查 Qt 对象的当前值,在值不同的情况下将错误变量定位为 false,但对于所有处理的检查事件,甚至是失败的事件,都应返回 true。

有时录制器和运行器的类是一一对应的,开发者可以查看 pqLineEditEventTranslator 和 pqLineEditEventPlayer 以获取简单示例,以及 pqAbstractItemViewEventTranslatorBase/pqAbstractItemViewEventPlayerBase 以获取高级示例。

运行基于QtTesting的测试

QtTesting的源码包易于编译,提供的CMake程序,可以快速地将其编译成静态库或者动态库。由于测试模块在产品中调用的位置较少,编译成静态库来使用是个不错的选择。

QtTesting在VTK、ParaView等软件上已经成功的应用,但是并没有公开测试案例。幸运的是,通用工程仿真软件WELSIM不仅使用QtTesting作为可视化测试框架,同时开源了全部测试算例,用户可以下载WELSIM和测试算例,体验基于QtTesting的自动化测试。

WELSIM的自动化测试用户界面基本沿用了QtTesting的界面。同时增加了一些实用功能,如:

1. 支持读取*.wstb文件,此文件包含一组*.xml文件,实现更简单的一次性读取多个测试案例。

2. 保存测试失败的算例保存至*.wstb文件。用户无需手动选择测试案例保存。

3. 增加右键弹出菜单,用于选择或取消选择测试案例。

开发者也可以根据需要,增加其他的功能。

总结

QtTesting是一款免费的,用于Qt可视化框架的测试系统。不仅提供了核心的QT事件与信号捕捉功能,还提供了易于使用的可视化界面,对开发者和最终用户友好。QtTesting可以帮助软件开发者快速建立测试系统。自带控件捕捉与控制功能可以满足大多数产品的测试需求,同时易于拓展,开发者可以根据自己产品的控件增加新的测试模块。

我们将QtTesting实际应用于通用仿真软件WELSIM的自动化测试,取得了很好的效果。本文所讨论的内容不仅可以应用于CAE仿真软件,也可以用于任何使用QT框架建立的可视化软件。

WelSim与作者不隶属于Qt, QtTesting。和Qt, QtTesting开发团队与机构没有直接关系。这里引用Qt, QtTesting仅用作技术博客文章与软件使用的参考。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容