Qt应用的启动
启动应用
由于跨平台Qt的Qt自动化机制,普通的手动启动方式并不能让Qt应用直接被CukeTest自动化。自动化Qt应用或侦测Qt对象时,需要通过特定的方式打开。下面介绍在不同场景下启动Qt应用的方式。
一. 从界面中启动
- 点击CukeTest的主界面菜单“工具”->“启动应用...”;或是点击模型管理器界面的菜单“操作”->“启动应用...”。
- 指定一个可执行文件
.exe
文件的路径,并勾选插件列表中的qt选项。 - 点击“运行”按钮。
另外,主界面还提供一些特殊的启动入口。
1. 启动自带样例
在菜单“工具”->“启动样例”中,提供了各个技术类型的样例应用,用于调试或学习。
2. 监听已运行的应用(仅限Windows系统)
对于通过其他方式启动的应用,默认是不进行监听的,但可以使用以下方式让CukeTest开始监听该应用:
- 点击模型管理器菜单栏的“操作”→“启动应用...”。
- 在“启动应用”对话框中,选择“已运行应用”标签页。点击侦测按钮,启动侦测。
- 移动光标到目标Qt应用窗口,这时工具会高亮鼠标悬停位置的窗口,点击鼠标左键。
- 对话框会显示侦测到的应用及其进程ID。点击运行按钮,为目标Qt应用加载Qt Agent。
如果成功加载Qt Agent,模型管理器的状态条上会显示侦测到的Qt信息。
二. 从脚本中启动应用
在脚本中有两种方式可以启动应用:
- 使用
leanpro.qt
库中QtAuto
模块提供的launchQtProcessAsync()方法。 - 使用
Application
控件上的launch()方法。
启动应用的脚本通常写在测试用例运行之前,示例如下:
const { BeforeAll } = require('cucumber');
const { Util } = require('leanpro.common');
const { QtAuto } = require('leanpro.qt');
let modelQt = QtAuto.loadModel("<model file path>");
BeforeAll(async function () {
// 第一种方式
await QtAuto.launchQtProcessAsync("/usr/lib/cuketest/bin/sample");
await modelQt.getApplication('<App Name>').exists(10);
// 第二种方式
await modelQt.getApplication("<App Name>").launch();
})
from leanproAuto import QtAuto
modelQt = QtAuto.loadModel("model1.tmodel")
QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe")
modelQt.getApplication("basiclayouts").exists(10)
# 上面两行与下面这行的调用效果一致:
modelQt.getApplication("basiclayouts").launch()
上述脚本中,两种方式都可以启动被测Qt应用并等待目标应用成功启动(最长等待10秒)。<App Name>
表示在模型中侦测到的Application对象。通过这些脚本,可以在每次项目启动前启动sample
应用。
如果希望监听其他方式打开的应用(类似上文的监听已运行的应用),可以调用winHookProcess()
方法并传入应用的进程对象或进程号PID
来开始监听,详情查看winHookProcess()
方法介绍。
三. 从命令行启动应用
命令行直接启动的方式只适用于Linux平台,Windows平台不支持。
方法1:在CukeTest菜单中选择"操作"→"Qt启动终端"。在打开的终端中输入被测应用的路径或命令来启动。
从CukeTest界面启动的这个终端中,会设置好必要的环境变量。如果希望在其他终端中自己设置变量,可以参考下面的方法2。
方法2:在任意命令行中启动应用前先设置一个全局变量
LD_PRELOAD
,默认的路径值为:/usr/lib/cuketest/bin/agents/libqtagent.so
(部分系统中为/opt/apps/com.leanpro.cuketest/files/lib/cuketest/bin/agents/libqtagent.so
)。假设目标应用的路径为/usr/lib/cuketest/bin/sample
,那么启动应用的命令为:export LD_PRELOAD=/usr/lib/cuketest/bin/agents/libqtagent.so /usr/lib/cuketest/bin/sample
使用
export
指令设置的环境变量只会在当前命令行环境中生效。如果在设置该环境变量后启动的不是一个Qt应用,则不会生效,详见Qt自动化机制。
sudo启动被测应用
如果被测应用需要sudo权限运行,而使用sudo时,环境变量会切换为root用户,导致设置的LD_PRELOAD
失效,因此需要在sudo运行时指定LD_PRELOAD
环境变量,例如:
sudo LD_PRELOAD=/usr/lib/cuketest/bin/agents/libqtagent.so ./yourAppName
如果已设置过LD_PRELOAD
的值(使用echo $LD_PRELOAD
可以查看路径),则sudo启动命令可以写作:
sudo LD_PRELOAD=$LD_PRELOAD ./yourAppName
yourAppName
是被测应用的名称或路径。
通过命令行脚本文件*.sh
启动被测应用
在Linux操作系统中,可以将启动被测应用写成一个sh
文件,通过这个sh
文件直接启动被测应用并加载插件,效果与在CukeTest界面或终端中启动被测应用一致。编写步骤如下:
1. 新建sh
文件并设置执行权限。
touch startByCuke.sh
chmod a+x startByCuke.sh
如果被测应用本身就是sh
文件则可以复制一份:
cp start.sh startByCuke.sh
2. 在应用启动前设置LD_PRELOAD
环境变量。假设被测应用路径为/usr/lib/cuketest/bin/sample
,则在sh
文件中可以这样写:
export LD_PRELOAD=/usr/lib/cuketest/bin/agents/libqtagent.so # 设置环境变量
/usr/lib/cuketest/bin/sample # 启动被测应用
接着只需运行这个sh
文件,就可以看到被测应用启动,同时在CukeTest左下角的状态栏中可以看到应用正在被监听。
Qt应用的查看
如果Qt应用按照上述方式启动,在CukeTest的状态条上及模型管理器的状态条上会显示侦测到的Qt信息。点击后会显示Qt应用的相关信息,包括应用名称、路径、PID及使用的Qt版本。
如何确定Qt应用使用的技术?
如果不确定当前待测应用是用何种Qt技术开发的,比如Qt Widget还是Qt Quick技术,甚至不能确定是否为Qt应用,可以通过以下两种方式确定。
使用模型管理器确定
模型管理器在侦听被测应用时,会向被测应用中加载相应的自动化插件。如果被测应用不包含某个技术的DLL依赖,则会视作不包含该技术而跳过加载。因此可以通过模型管理器启动应用或监听已启动应用,通过成功监听的自动化插件类型,推断被测应用使用的技术。
- 首先打开被测应用。
- 打开模型管理器,在菜单“操作”->“启动应用”中选择“已运行应用”,并点击粉色按钮,侦测被测应用,并确认“Qt”插件已勾选,点击确定。
- 观察状态栏变化。如果状态栏没有变化,表示Qt自动化未开始监听,可能是以下两种原因:
- 被测应用不是由Qt技术开发。可以改用其他技术进行自动化。
- 被测应用尚未加载Qt组件。可以切换到应用的其他部分重复以上流程。
使用第三方工具Process Explorer确定
使用第三方工具Process Explorer可以查看被测应用的依赖库,通过依赖库推断被测应用使用的技术。