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代理。

这时如果成功加载Qt代理,模型管理器的状态条上会显示侦测到的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 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();
})

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

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

使用第三方工具Process Explorer确定

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

results matching ""

    No results matching ""