Qt应用的启动
启动应用
由于跨平台Qt的Qt自动化机制,普通的手动启动方式并不能让Qt应用直接被CukeTest自动化。自动化Qt应用或侦测Qt对象时,需要通过特定的方式打开。下面介绍在不同场景启动Qt应用的方式。
一. 从界面中启动
- 点击CukeTest的主界面菜单“工具”->“启动应用...”;或是点击模型管理器界面的菜单“操作”->“启动应用...”;
- 指定一个可执行文件
.exe
文件的路径,接着勾选插件列表中的qt选项; - 点击“运行”按钮。
另外主界面还提供一些特殊的启动入口。
1. 启动自带样例
在菜单“工具”->“启动样例”里,里面提供了各个技术类型的样例应用,用于调试或是学习。
2. 监听已运行的应用(仅限Windows系统)
对于通过其它方式启动的应用,默认是不进行监听的,但是可以使用下面的方式来让CukeTest开始监听该应用:
- 点击模型管理器菜单栏的“操作”→“启动应用...”
- 在“启动应用”对话框中,选择“已运行应用”标签页。点击侦测按钮,启动侦测。
- 移动光标到目标Qt应用窗口,这时工具会高亮鼠标悬停位置的窗口,这是点击鼠标左键。
- 对话框会显示侦测到的应用和它的进程ID。这时点击运行按钮,可以为目标Qt应用加载Qt代理。
这时如果成功加载Qt代理,模型管理器的状态条上会显示侦测到的Qt信息。
二. 从脚本中启动应用
在脚本中有两种方式可以启动应用:
leanpro.qt
库中QtAuto
模块提供的launchQtProcessAsync() 方法;Application
控件上的launch()方法;
由于启动应用的脚本通常写在测试用例运行之前,因此该脚本通常写作如下:
const { BeforeAll } = require('cucumber');
const { Util } = require('leanpro.common');
const { QtAuto } = require('leanpro.qt');
let model = QtAuto.loadModel("<model file path>");
BeforeAll(async function () {
// 第一种方式
await QtAuto.launchQtProcessAsync("/usr/lib/cuketest/bin/sample");
await model.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对象。这样的hook就能够实现在每次项目启动前将sample
应用启动的功能了。
如果希望监听其它方式打开的应用(类似上文的监听已运行的应用(仅限Windows系统),可以调用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
文件并设置执行权限。 如果被测应用本身就是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技术开发。可以改用其它技术进行自动化。
- 被测应用还未加载Qt组件。可以切换到其它部分的组件重复以上流程。
使用第三方工具Process Explorer确定
使用第三方工具Process Explorer可以查看被测应用的依赖库,通过依赖库来推断被测应用使用了哪些技术。