跨平台Qt录制基础
CukeTest 提供的脚本录制功能支持对 Qt 应用程序进行录制。录制过程中,工具将自动生成易于维护和编辑的脚本及模型文件。这些脚本和模型具有跨平台特性,可以在不同操作系统中执行。
录制原理
CukeTest 的录制功能基于对象识别技术。当录制过程中,CukeTest能够访问应用程序中的各个控件,并生成相应的操作脚本。这些脚本通过直接操作控件或调用控件方法来重现用户的操作,从而确保测试脚本的可靠性和稳定性。
此外,录制过程中,CukeTest 会记录操作点的相对坐标,即操作在控件内部的位置。这一机制保证了诸如绘图、画线、标点等对坐标有严格要求的操作的准确性。由于使用的是控件自身的相对坐标,而非传统的桌面坐标,这些操作不易受到不同环境和应用尺寸变化的影响。对于不需要精确坐标的控件(如按钮点击),CukeTest 默认不会记录相对坐标。如果用户只需点击控件的中心区域,可以在录制完成后手动删除这些多余的坐标信息。
录制步骤
以下是使用CukeTest录制Qt应用脚本的详细步骤:
创建Qt项目:打开CukeTest,创建一个新的Qt项目。
配置录制设置:进入录制设置页面,配置Qt录制相关参数。由于录制设置是全局生效的,仅需配置一次即可。
选择Qt录制模式:点击录制按钮旁的下拉箭头,选择“Qt录制”选项,使录制按钮切换到Qt录制模式。
启动录制:点击录制按钮,开始录制操作。
操作Qt应用:在录制过程中,按照实际使用场景对Qt应用进行操作,CukeTest将自动记录这些操作。
停止录制:完成操作后,点击停止录制按钮。
录制完成后,CukeTest 会生成两个文件:脚本文件和模型文件。脚本文件记录了具体的操作内容,而模型文件则保存了被操作控件的定位信息,便于后续维护和管理。
录制生成的脚本代码
CukeTest 生成的脚本简洁明了,易于理解和编辑。以下是生成的脚本示例:
const { RunSettings } = require("leanpro.common");
const { QtAuto } = require("leanpro.qt");
(async () => {
await RunSettings.set({slowMo: 1000, reportSteps: true});
let modelQt = QtAuto.loadModel(__dirname + "/recording.tmodel");
//启动Qt应用文件"standarddialogs"
await QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin\\standarddialogs.exe");
//等待Qt应用"standarddialogs"
await modelQt.getApplication("standarddialogs").exists(10);
//点击 "QInputDialog::getInt()"
await modelQt.getButton("QInputDialog::getInt()").click();
//设置控件值为"12"
await modelQt.getSpinBox("QSpinBox").set("12");
//点击 "OK"
await modelQt.getButton("OK").click();
//关闭Qt应用"standarddialogs"
await modelQt.getApplication("standarddialogs").quit();
})();
import os
from leanproAuto import RunSettings, QtAuto
def recording_3():
RunSettings.set({"slowMo": 1000, "reportSteps": True})
modelQt = QtAuto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/recording.tmodel")
#启动Qt应用文件"standarddialogs"
QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin\\standarddialogs.exe")
#等待Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").exists(10)
#点击 "QInputDialog::getInt()"
modelQt.getButton("QInputDialog::getInt()").click()
#设置控件值为"12"
modelQt.getSpinBox("QSpinBox").set("12")
#点击 "OK"
modelQt.getButton("OK").click()
#关闭Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").quit()
if __name__ == "__main__":
recording_3()
注:JavaScript脚本中的
(async () => { ... })();
被称为异步立即执行函数表达式(IIFE),用于使脚本能够直接运行。
脚本结构
脚本中每个操作步骤都配有注释,便于理解。操作调用通常包括以下三个部分:
- 控件类型:当前操作的控件类型。
- 对象名称:模型文件
tmodel
中目标节点的名称。 - 操作方法:对控件执行的具体操作。
示例:
//---|控件类型|对象名称|操作方法|
await model.getButton("OK").click()
#---|控件类型|对象名称|操作方法|
model.getButton("OK").click()
生成的模型文件
录制完成后,CukeTest 会生成与脚本同名的模型文件(例如,脚本文件为recording.js
,对应的模型文件为recording.tmodel
)。模型文件保存了所有被操作控件的信息,方便后续的维护和管理。
模型文件的使用
打开模型:
- 在CukeTest中双击模型文件,模型管理器将自动打开。
查看控件信息:
- 右击模型中的根节点,选择“启动应用”,此时被测应用将启动。
- 在模型管理器中选中一个控件,对应的应用控件将被高亮显示,便于确认和调试。
生成启动/关闭应用代码
为了确保跨平台Qt应用在自动化操作前正确启动,CukeTest 提供了多种启动方式,录制过程中会自动生成相关代码:
应用启动方式
通过录制设置启动:在录制设置面板中配置应用启动参数,录制时CukeTest将自动启动并记录应用的启动过程。
在录制过程中启动:录制开始后,可以使用Qt应用的启动中的任意一种方式启动应用,启动过程同样会被记录。
预先启动应用:如果在录制前已手动启动应用,CukeTest不会自动生成启动代码。因此,在回放前需确保应用已启动。
启动应用
//启动Qt应用"standarddialogs"
await QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe");
await model.getApplication("standarddialogs").exists(10);
#启动Qt应用"standarddialogs"
QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/standarddialogs.exe")
modelQt.getApplication("standarddialogs").exists(10)
第一行是运行应用,第二行是等待应用真正加载,默认最长等待10秒。如果您的应用实际加载时间超过这个时间,可以手动修改生成代码。
关闭应用
//关闭Qt应用"standarddialogs"
await model.getApplication("standarddialogs").quit();
#关闭Qt应用"standarddialogs"
modelQt.getApplication("standarddialogs").quit()
提示:如果关闭应用的操作是由某个点击事件触发的,且该点击事件已在脚本中生成相应代码,则可以手动删除冗余的关闭代码。
生成回放速度控制代码
CukeTest 录制功能默认启用了slowMo
(慢动作)设置,延长各操作之间的间隔时间,以便用户观察回放过程。默认值为1000毫秒(1秒)。如果希望测试脚本以最快速度运行,可以将slowMo
设置为0,或直接注释掉相关代码。
const { RunSettings } = require("leanpro.common");
// ……
RunSettings.slowMo = 1000;
from leanproAuto import RunSettings
RunSettings.set({"slowMo": 1000})
录制脚本的后续处理
录制生成的脚本记录了所有手工操作,但并非所有操作都是自动化测试所需的。因此,建议在录制完成后对脚本进行必要的编辑和优化:
删除不必要的操作
- 例如,录制过程中鼠标悬停菜单项会生成
hover()
操作。如果实际测试只需点击菜单项,可以手动删除多余的hover()
操作。即便不删除,这些操作通常也不会影响测试结果。
- 例如,录制过程中鼠标悬停菜单项会生成
编辑和优化脚本
- 如果回放过程中出现错误,通常不需要重新录制。可以通过编辑现有脚本或模型文件来修正问题。例如:
- 对象未找到:检查模型文件中对应控件的识别属性,确保其在不同运行环境下的稳定性。
- 调整标识属性:某些控件属性可能在运行期间动态变化,需要手动调整标识属性以提高识别准确性。
- 如果回放过程中出现错误,通常不需要重新录制。可以通过编辑现有脚本或模型文件来修正问题。例如:
验证回放
- 编辑完成后,进行回放验证,确保脚本按预期运行。验证通过后,可以将录制的脚本片段集成到完整的测试项目中。
示例:删除多余操作
假设录制过程中生成了以下代码:
// 鼠标悬停 "MenuItem::File"
await model.getMenuItem("MenuItem::File").hover();
// 点击 "MenuItem::File"
await model.getMenuItem("MenuItem::File").click();
如果测试仅需点击菜单项,可以删除hover()
操作:
// 点击 "MenuItem::File"
await model.getMenuItem("MenuItem::File").click();