Qt应用的启动

启动应用

由于跨平台Qt的Qt自动化机制,普通的手动启动方式并不能让Qt应用直接被CukeTest自动化。自动化Qt应用或侦测Qt对象时,需要通过特定的方式打开。下面介绍在不同场景下启动Qt应用的方式。

一. 从界面中启动

  1. 点击CukeTest的主界面菜单“工具”->“启动应用...”;或是点击模型管理器界面的菜单“操作”->“启动应用...”。
  2. 指定一个可执行文件.exe文件的路径,并勾选插件列表中的qt选项。
  3. 点击“运行”按钮。

另外,主界面还提供一些特殊的启动入口。

1. 启动自带样例

在菜单“工具”->“启动样例”中,提供了各个技术类型的样例应用,用于调试或学习。

2. 监听已运行的应用(仅限Windows系统)

对于通过其他方式启动的应用,默认是不进行监听的,但可以使用以下方式让CukeTest开始监听该应用:

  1. 点击模型管理器菜单栏的“操作”→“启动应用...”。
  2. 在“启动应用”对话框中,选择“已运行应用”标签页。点击侦测按钮,启动侦测。
  3. 移动光标到目标Qt应用窗口,这时工具会高亮鼠标悬停位置的窗口,点击鼠标左键。
  4. 对话框会显示侦测到的应用及其进程ID。点击运行按钮,为目标Qt应用加载Qt Agent。

如果成功加载Qt Agent,模型管理器的状态条上会显示侦测到的Qt信息。

二. 从脚本中启动应用

在脚本中有两种方式可以启动应用:

  1. 使用leanpro.qt库中QtAuto模块提供的launchQtProcessAsync()方法。
  2. 使用Application控件上的launch()方法。

启动应用的脚本通常写在测试用例运行之前,示例如下:

JavaScript
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();
})

Python
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依赖,则会视作不包含该技术而跳过加载。因此可以通过模型管理器启动应用或监听已启动应用,通过成功监听的自动化插件类型,推断被测应用使用的技术。

  1. 首先打开被测应用。
  2. 打开模型管理器,在菜单“操作”->“启动应用”中选择“已运行应用”,并点击粉色按钮,侦测被测应用,并确认“Qt”插件已勾选,点击确定。
  3. 观察状态栏变化。如果状态栏没有变化,表示Qt自动化未开始监听,可能是以下两种原因:
    • 被测应用不是由Qt技术开发。可以改用其他技术进行自动化。
    • 被测应用尚未加载Qt组件。可以切换到应用的其他部分重复以上流程。

使用第三方工具Process Explorer确定

使用第三方工具Process Explorer可以查看被测应用的依赖库,通过依赖库推断被测应用使用的技术。

results matching ""

    No results matching ""