AWTK UI 自动化 提供了兼容 Appium 的接口,可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦,用的人不多,所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium,这个工具有下列特点:

不依赖额外的库。无需安装额外的软件。无需学习额外的编程语言和 API。支持串口和网络两种方式连接 APP。更加适合 AWTK 的测试方式。

主要用途:

自动化测试。自动化演示。压力测试。查看系统状态(辅助调试)。

1. 启用 UI 自动化

包含头文件

#include "remote_ui/service/remote_ui_service.h"

启动服务

tk_service_start(main_loop_get_event_source_manager(main_loop()), REMOTE_UI_URL, remote_ui_service_create, NULL);

完整示例请参考 demo_ui_old_app.c

2. 编写测试配置

测试用 ini 文件格式编写。通常一个应用程序需要多组测试用例,每个测试用例放到一个配置文件中,并取一个有意义的文件名。

下面给出一个简单的例子,后面会详细介绍每个命令的含义。

[create]

url=tcp://localhost:2233

[move_widget]

target=window_manager.top

x=100

y=200

[get_prop]

target=window_manager.top

name=x

value=100

[get_prop]

target=window_manager.top

name=y

value=200

[resize_widget]

target=window_manager.top

w=200

h=100

[get_prop]

target=window_manager.top

name=w

value=200

[get_prop]

target=window_manager.top

name=h

value=100

[close_window]

name=top

3. 运行测试

先启动被测试的应用程序。如

./bin/demouiold

再运行测试程序。如

./bin/ui_test tests/ui_test_data/demouiold/overlay.ini

如果存在多组测试用例,可以把它们放到一个批处理中。

4. 测试命令

4.0 常用参数

部分参数在很多命令中都会出现,这里统一说明。

4.0.1 target

通常用来指定被操作的控件。它的值可以是控件的名字,也可以是控件的路径。如果是控件的路径,可以使用 . 来分隔控件的名字。如 window_manager.top。

有几个特殊的名称:

window_manager 代表窗口管理器。window 代表当前主窗口。比如 window.close 表示当前窗口上名为 close 的控件。路径默认为当前窗口,比如 close 也表示当前窗口上名为 close 的控件。global 代表全局对象。用来设置语言和主题之类的全局属性。[序数] 表示第几个子控件。如果序数为非负表示正向序数,为负数表示反向序数。如果按名称查找失败,将名字作为控件类型进行查找。

示例:

close_button 表示名为 close_button 的控件。window_manager.top 表示 window_manager 窗口中名为 top 的窗口。window_manager.top.close_button 表示 window_manager 窗口中,名为 top 的窗口中名为 close_button 的控件。window.[0] 表示当前窗口中第一个控件。window.[-1] 表示当前窗口中倒数第一个控件。window.slide_view,如果窗口中存在名为 slide_view 的控件,则表示该控件,否则表示窗口中第一个 slide_view 类型的控件。

4.1 create

功能:创建连接。 参数:

url - 连接地址,如 tcp://localhost:2233。 示例:

[create]

url=tcp://localhost:2233

url 参数可以为串口名,通过串口连接到开发板。如:serial:///dev/ttyUSB0

4.2 take_snapshot

功能:截屏。如果指定的文件不存在,则将截屏保存为指定的文件。如果存在,则与之进行比较,如果不一致,则提示测试失败。 参数:

target - 目标。filename - 截屏文件名 (.png)。 示例:

[take_snapshot]

filename=win1.png

[take_snapshot]

target=window

filename=win2.png

[take_snapshot]

target=window_manager

filename=wm.png

[take_snapshot]

target=window_manager.top

filename=top.png

4.2 get_source

功能:获取控件源码。如果指定的文件不存在,则将源码保存为指定的文件。如果存在,则与之进行比较,如果不一致,则提示测试失败。 参数:

target - 目标。filename - 源码文件名 (.xml)。 示例:

[get_source]

filename=win1.xml

[get_source]

target=window

filename=win2.xml

[get_source]

target=window_manager

filename=wm.xml

[get_source]

target=window_manager.top

filename=top.xml

4.3 open_window

功能:打开窗口。 参数:

name - 窗口名。xml - xml 文件(可选,以@开头表示从文件读取),如果指定,表示从 XML 内容加载窗口,通常不需要。init - 初始化数据 (JSON 格式,可选,以@开头表示从文件读取)。

[open_window]

name=basic

[open_window]

name=foo

xml=@tests/ui_test_data/demouiold/data/foo.xml

init=@tests/ui_test_data/demouiold/data/foo.json

xml 文件可以用 AWTK designer 生成,也可以手工编写。

初始化数据,第一级为控件名称(路径),第二级为控件的属性和值。如:

{

"bar1": {

"value":50

},

"bar2": {

"value":80

}

}

在上面的例子中,bar1 和 bar2 是窗口中的两个进度条控件,这里分别设置它们的值为 50 和 80。

4.4 close_window

功能:关闭窗口。

参数:

name - 窗口名。

[close_window]

name=top

4.5 back

功能:关闭当前窗口,返回上一级窗口。

参数:无。

[back]

4.6 home

功能:关闭除主窗口外的窗口,返回主窗口。

参数:无。

[home]

4.7 exec_fscript

功能:执行脚本。

参数:

fscript - 脚本内容(以@开头表示从文件读取)。

示例:

[exec_fscript]

fscript=print("hello");

fscript 的用法请参考 FSCRIPT 参考文档

4.8 create_widget

功能:创建控件。

参数:

target - 目标(父控件)。xml - xml 内容(以@开头表示从文件读取)。

示例:

[create_widget]

target=window

xml=@tests/ui_test_data/demouiold/data/quit.xml

控件的 xml 比较简单,一般手写就可以了。如下面的例子在窗口的中间创建一个按钮: