前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用QtTesting建立可视化软件的自动化测试系统

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

原创
作者头像
WelSim的小仿真
发布2024-04-25 02:33:02
820
发布2024-04-25 02:33:02
举报
文章被收录于专栏:WELSIMWELSIM

自动化测试是现代大型软件的必要组成部分。通过使用大量的无人值守的自动化测试算例,达到维护大型软件产品的稳定性的目的。对于可视化软件,建立自动化测试系统难度大,相关资料少,笔者曾经写过关于工程仿真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仅用作技术博客文章与软件使用的参考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档