# wukong稳定性工具使用指导

## 功能介绍

wukong是系统自带的一种命令行工具，支持Ability的随机事件注入、控件注入、异常捕获、报告生成和对Ability数据遍历截图等特性。通过模拟用户行为，对系统或应用进行稳定性压力测试。wukong分为随机测试、专项测试和专注测试。

随机测试是指随机测试界面内容，支持的能力包括：shell启动、拉起整机应用、多种注入方式、设置随机种子、打印运行日志和生成报告。

专项测试主要提供对指定应用控件进行测试，支持的能力包括：shell启动、顺序遍历及截图、测试休眠唤醒、录制回放、打印运行日志和生成报告。

专注测试主要提供对指定控件的注入测试，支持的能力包括：shell启动、拉起整机应用、多种注入方式、设置随机种子、设置专注控件类型、设置注入控件次数、打印运行日志和生成报告。

## 实现原理

wukong部件架构图以及部件内子模块职责如下所述。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/86/v3/wp9uZbctRnWK5yWXbE__QQ/zh-cn_image_0000002701641040.png?HW-CC-KV=V1&HW-CC-Date=20260914T073630Z&HW-CC-Expire=31536000000&HW-CC-Sign=701597801ECD4B1B5AB73E20EE82D3888A6BDF87FD0CA86AA539F13550DD0AB8)

* 命令行解析：支持命令行获取参数并解析。
* 运行环境管理：根据命令行初始化wukong整体运行环境。
* 系统接口管理：检查并获取指定的mgr，注册controller和dfx的faultlog的回调函数。
* 随机事件生成：通过random函数生成指定种子数的随机序列，生成事件。
* 事件注入：根据支持的事件类型向系统注入事件，依赖窗口、多模、安全等子系统。
* 异常捕获处理/报告生成：通过DFX子系统获取运行中的异常信息并记录log，生成报告。

## 约束与限制

1. wukong测试工具在API 9版本开始预置使用。

2. 所有命令执行前需完成[hdc环境配置](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdc)，并进入shell模式。

## 功能特性及命令说明

|命令|说明|
|:-----------|:----------------------------------|
|-v/--version|获取wukong版本信息。|
|help|获取wukong帮助信息。|
|appinfo|查询支持拉起应用bundleName和对应的mainAbility名。|
|special|wukong专项测试。|
|exec|wukong随机测试。|
|focus|wukong专注测试。|

### 执行命令

* 进入shell模式

  ```bash
  #若连接单个设备，则直接输入如下命令进入shell模式
  C:\Users>hdc shell
  $
  #若同时连接多个设备，则需先获取sn号，先输入hdc list targets获取sn号，然后进入shell模式
  C:\Users>hdc list targets
  15xxx424axxxx345209d94xxxx8fxx900
  C:\Users>hdc -t 15xxx424axxxx345209d94xxxx8fxx900 shell
  $
  ```

* 获取应用的bundle name和ability name

  ```bash
  $ wukong appinfo
  BundleName:  com.ohos.adminprovisioning
  AbilityName:  com.ohos.adminprovisioning.MainAbility
  BundleName:  com.ohos.callui
  AbilityName:  com.ohos.callui.MainAbility
  ```

* 执行查看帮助命令

  ```bash
  C:\Users>hdc shell
  $ wukong help        #wukong帮助菜单
  usage: wukong <command> [<arguments>]
  These are common wukong command list:
    help                       wukong help information
    -v/--version               wukong version
    exec                       run random test
    special                    run special test
    focus                      run focus test
    appinfo                    show all app information
  $ wukong exec -help   #wukong随机测试帮助菜单
  usage: wukong exec [<arguments>]
  These are wukong exec arguments list:
    -h, --help                 random test help
    -a, --appswitch            appswitch event percent
    -b, --bundle               the bundle name of allowlist
    -p, --prohibit             the bundle name of blocklist
    -d, --page                 block page list
    -t, --touch                touch event percent
    -c, --count                test count
    -i, --interval             interval
    -s, --seed                 random seed
    -m, --mouse                mouse event percent
    -k, --keyboard             keyboard event percent
    -H, --hardkey              hardkey event percent
    -S, --swap                 swap event percent
    -T, --time                 test time
    -C, --component            component event percent
    -r, --rotate               rotate event percent
    -e, --allow ability        the ability name of allowlist
    -E, --block ability        the ability name of blocklist
    -Y, --blockCompId          the id list of block component
    -y, --blockCompType        the type list of block component
    -I, --screenshot           get screenshot(only in random input)
    -B, --checkBWScreen        black and white screen detection
    -U, --Uri                  set Uri pages
    -x, --Uri-type             set Uri-type
    -K, --knuckle              set percent of knuckle event
    -f, --finger               set the number of fingers and proportions for tests such as swipe and knuckle gesture
    -P, --pinch                set percent of pinch-to-zoom event
    -D, --direction            set the swipe directions and proportions
    -o, --pause                pause swiping for 1 second
    -w, --crown                set percent of watch crown rotation event
    -g, --gestures             set percent of watch gesture recognition events
    -l, --idle                 set percent of watch idle event
    -j, --keypress             set percent of watch physical button press event
    -F, --float                set percent of float and split event
    -W, --browser              set percent of browser operation event
  $ wukong special -help    #wukong专项测试帮助菜单
  usage: wukong special [<arguments>]
  These are wukong special arguments list:
    -h, --help                 special test help
    -t, --touch[x,y]           touch event
    -c, --count                total count of test
    -i, --interval             interval
    -S, --swap[option]         swap event
                                option is -s| -e| -b
                                -s, --start: the start point of swap
                                -e, --end: the end point of swap
                                -b, --bilateral: swap go and back
    -k, --spec_insomnia        power on/off event
    -T, --time                 total time of test
    -C, --component            component event
    -p, --screenshot           get screenshot(only in component input)
    -r, --record               record user operation
    -R, --replay               replay user operation
    -u, --uitest               uitest dumpLayout
  ```

## 随机测试

### 命令参数

|命令|功能|必选|说明|
|:------------------------------------------|:---------------------------|:-|:----------------------------------------------------------------------------------------------------|
|-h,--help|获取当前测试的帮助信息。|否|-|
|-c,--count|设置执行次数，与测试总时间-T冲突。二者取其一。|否|单位次数，默认值为10次。|
|-i,--interval|设置执行间隔。|否|单位ms，默认值为1500ms。|
|-s,--seed|设置随机种子。|否|配置相同随机种子，会生成相同随机事件序列。|
|-b,--bundle[bundlename,......,bundlename]|设置本次测试的允许应用名单，与-p冲突。|否|默认测试当前设备所有应用（应用名称用英文逗号隔开）。|
|-p,--prohibit[bundlename,......,bundlename]|设置本次测试的禁止应用名单，与-b冲突。|否|默认不禁止任何应用（应用名称用英文逗号隔开）。|
|-d,--page[page,......,page]|设置本次测试的禁止页面名单。|否|系统默认禁止pages/system页面（页面名称用逗号隔开）。|
|-a,--appswitch|设置应用随机拉起测试比例。|否|取值范围0到1，默认值为10%。|
|-t,--touch|设置屏幕随机触摸测试比例。|否|取值范围0到1，默认值为10%。|
|-S,--swap|设置屏幕随机移动测试比例。|否|取值范围0到1，默认值为3%。|
|-m,--mouse|设置屏幕随机鼠标测试比例。|否|取值范围0到1，默认值为1%。|
|-k,--keyboard|设置屏幕随机键盘操作测试比例。|否|取值范围0到1，默认值为2%。|
|-H,--hardkey|设置随机物理按键测试比例。|否|取值范围0到1，默认值为2%。|
|-r,--rotate|设置随机屏幕旋转测试比例。|否|取值范围0到1，默认值为2%。|
|-C, --component|设置随机控件测试比例。|否|取值范围0到1，默认值为70%。|
|-I, --screenshot|控件测试截图。|否|-|
|-T,--time|设置测试总时间，与设置执行次数-c冲突。二者取其一。|否|单位分钟，默认值为10分钟。|
|-e, --allow ability|设置允许测试的ability。|否|-|
|-E, --block ability|设置禁止测试的ability。|否|-|
|-Y, --blockCompId|设置不进行注入的CompId。|否|-|
|-y, --blockCompType|设置不进行注入的CompType。|否|-|
|-B, --checkBWScreen|设置启用黑白屏检测。|否|-|
|-U, --Uri|设置应用拉起页面的URI。|否|-|
|-x, --UriType|设置应用拉起页面的URIType（统一资源标识符类型）。|否|-|
|-K, --knuckle|设置指关节敲击测试比例。|否|取值范围0到1，默认值为0。|
|-f, --finger|设置滑动和指关节敲击测试的参与手指数量及比例。|否|支持配置1-4个手指，格式：-f <手指数1,比例>,<手指数2,比例>,<手指数3,比例>,<手指数4,比例>，例如:-f 1,0.25,2,0.25,3,0.25,4,0.25。|
|-P, --pinch|设置双指捏合测试比例。|否|取值范围0到1，默认值为0。|
|-D, --direction|设置滑动方向及比例。|否|支持配置上(u)、下(d)、左(l)、右(r)四个方向，格式：-D <方向1,比例>,<方向2,比例>,<方向3,比例>,<方向4,比例>，例如:u,0.25,r,0.25,d,0.25,l,0.25。|
|-o, --pause|设置滑动过程中支持暂停。|否|该参数缺省则不支持暂停。|
|-w, --crown|设置表冠操作测试比例。|否|仅Wearable设备支持，取值范围0到1，默认值为0。|
|-g, --gestures|设置手势（如上滑、下滑、左滑、右滑等）操作测试比例。|否|仅Wearable设备支持，取值范围0到1，默认值为0。|
|-l, --idle|设置待机状态下的操作测试比例。|否|仅Wearable设备支持，取值范围0到1，默认值为0。|
|-j, --keypress|设置按键（电源键、智感窗按键）操作测试比例。|否|仅Wearable设备支持，取值范围0到1，默认值为0。|
|-F, --float|设置应用分屏模式和悬浮窗模式的测试比例。|否|取值范围0到1，默认值为0。|
|-W, --browser|设置浏览器操作测试比例。|否|取值范围0到1，默认值为0。|

> 说明
>
> * 上述参数的测试比例表示在当前测试中的操作，所有参数的测试比例之和需小于等于1。
>
> * -K，-f，-P，-D，-o，-w，-g，-l，-j，-F，-W参数从API version 23开始支持。

### 使用示例

* 设置100次事件注入

  ```bash
  $ wukong exec -s 10 -i 1000 -a 0.28 -t 0.72 -c 100
  ```

  命令中各参数含义：

  |命令|参数值|说明|
  |:----------|:---|:---------------------|
  |wukong exec|-|主命令。|
  |-s|10|参数设置随机种子，10为种子值。|
  |-i|1000|参数设置应用拉起间隔为1000ms。|
  |-a|0.28|参数设置应用随机拉起测试比例28%。|
  |-t|0.72|参数设置屏幕随机touch测试比例为72%。|
  |-c|100|参数设置执行次数为100次。|

* 指定页面压测

  ```bash
  > 显式启动
  > hdc_std shell
  $ wukong exec -b bundlename -e abilityname -U uri

  > 隐式启动
  > hdc_std shell
  $ wukong exec -b bundlename -U uri -x uriType
  ```

* 设置允许测试和禁止测试的ability

  ```bash
  $ wukong exec -b com.ohos.settings -e com.ohos.settings.MainAbility -E com.ohos.settings.AppInfoAbility
  ```

  > 说明
  >
  > 若配置-e、-E则须配置-b来指定应用。

## 专项测试

### 命令参数

|命令|功能|必选|说明|
|:------------------|:-------------|:-|:---------------|
|-h, --help|获取当前专项测试的帮助信息。|否|-|
|-k, --spec_insomnia|休眠唤醒专项测试。|否|-|
|-c, --count|设置执行次数。|否|单位次数，默认值为10次。|
|-i, --interval|设置执行间隔。|否|单位ms，默认值为1500ms。|
|-S, --swap|滑动测试。|否|-|
|-s, --start[x,y]|设置滑动测试起点坐标。|否|坐标均为正值。|
|-e, --end[x,y]|设置滑动测试终点坐标。|否|坐标均为正值。|
|-b, --bilateral|设置往返滑动。|否|默认不往返滑动。|
|-t, --touch[x,y]|点击测试。|否|-|
|-T, --time|设置测试总时间。|否|单位分钟，默认值为10分钟。|
|-C, --component|控件顺序遍历测试。|否|需要设置测试应用名称。|
|-r, --record|录制。|否|需要指定录制文件。|
|-R, --replay|回放。|否|需要指定回放文件。|
|-p, --screenshot|控件测试截图。|否|-|

### 测试命令

```bash
$ wukong special -C [bundlename] -p
```

## 专注测试

### 命令参数

|命令|功能|必选|说明|
|:------------------------------------------|:-------------------------|:-|:-------------------------------|
|-n,--numberfocus|设置每个控件注入的次数。|否|单位次数。|
|-f, --focustypes|设置需要专注的控件类型。|否|以英文逗号隔开。|
|-h,--help|获取当前测试的帮助信息。|否|-|
|-c,--count|设置执行次数，与设置执行时间-T冲突。二者取其一。|否|单位次数，默认值为10次。|
|-i,--interval|设置执行间隔。|否|单位ms，默认值为1500ms。|
|-s,--seed|设置随机种子。|否|配置相同随机种子，会生成相同随机事件序列。|
|-b,--bundle[bundlename,......,bundlename]|设置本次测试的允许应用名单，与-p冲突。|否|默认测试当前设备所有应用（应用名称用英文逗号隔开）。|
|-p,--prohibit[bundlename,......,bundlename]|设置本次测试的禁止应用名单，与-b冲突。|否|默认不禁止任何应用（应用名称用英文逗号隔开）。|
|-d,--page[page,......,page]|设置本次测试的禁止页面名单。|否|系统默认禁止pages/system页面（页面名称用逗号隔开）。|
|-a,--appswitch|设置应用随机拉起测试比例。|否|默认值为10%。|
|-t,--touch|设置屏幕随机触摸测试比例。|否|默认值为10%。|
|-S,--swap|设置屏幕随机移动测试比例。|否|默认值为3%。|
|-m,--mouse|设置屏幕随机鼠标测试比例。|否|默认值为1%。|
|-k,--keyboard|设置屏幕随机键盘操作测试比例。|否|默认值为2%。|
|-H,--hardkey|设置随机物理按键测试比例。|否|默认值为2%。|
|-r,--rotate|设置随机屏幕旋转测试比例。|否|默认值为2%。|
|-C, --component|设置随机控件测试比例。|否|默认值为70%。|
|-I, --screenshot|控件测试截图。|否|-|
|-T,--time|设置测试总时间，与设置执行次数-c冲突。二者取其一。|否|单位分钟，默认值为10分钟。|
|-e, --allow ability|设置允许测试的ability。|否|-|
|-E, --block ability|设置禁止测试的ability。|否|-|
|-Y, --blockCompId|设置不进行注入的CompId。|否|-|
|-y, --blockCompType|设置不进行注入的CompType。|否|-|
|-B, --checkBWScreen|设置启用黑白屏检测。|否|-|

### 使用示例

```bash
$ wukong focus -s 10 -i 1000 -a 0.28 -t 0.72 -c 100
```

命令中各参数含义：

|命令|参数值|说明|
|:-----------|:---|:---------------------|
|wukong focus|-|主命令。|
|-s|10|参数设置随机种子，10为种子值。|
|-i|1000|参数设置应用拉起间隔为1000ms。|
|-a|0.28|参数设置应用随机拉起测试比例28%。|
|-t|0.72|参数设置屏幕随机touch测试比例为72%。|
|-c|100|参数设置执行次数为100次。|

## 查看测试结果

### 测试结果输出路径

执行完测试指令后，会自动生成测试结果，测试结果输出根路径如下：

* 2022/9/22之前的DevEco Studio版本，结果存放路径为：/data/local/wukong/report/xxxxxxxx_xxxxxx/
* 2022/9/22之后的DevEco Studio版本，结果存放路径为：/data/local/tmp/wukong/report/xxxxxxxx_xxxxxx/

### 测试报告文件目录

|类型|描述|
|:----------------|:-------------|
|exception/|存放本次测试产生的异常文件。|
|screenshot/|存放测试遍历的截图。|
|wukong_report.csv|测试报告统计汇总。|
|wukong.log|测试操作历程。|

### 查看操作日志

wukong支持通过hdc命令将日志获取到本地，查看操作历程。

```bash
# wukong.log文件对应路径如下
/data/local/tmp/wukong/report/xxxxxxxx_xxxxxx/wukong.log

# 查看wukong测试报告文件目录操作如下
$ cd /data/local/tmp/wukong/report/20170805_170053
$ ls
data.js  exception  wukong.log  wukong_report.csv

# 开启shell窗口，用hdc file recv获取wukong日志
C:\Users\xxx>hdc file recv /data/local/tmp/wukong/report/20170805_170053/wukong.log C:\Users\xxx\Desktop\log
[I][2024-01-03 20:08:02] HdcFile::TransferSummary success
FileTransfer finish, Size:76492, File count = 1, time:16ms rate:4780.75kB/s
```

### 测试报告解析

包含基本信息、事件注入统计、Ability统计、故障统计。

1. 基本信息（Base Info）

   |字段|描述|
   |:----------|:-------------------------|
   |task status|任务状态。success表示成功，fail表示失败。|
   |task time|任务执行时间。单位：秒。|
   |seed|随机种子。|
   |task count|事件注入总次数。|

2. 故障注入统计（Input Message Statistics）

   |类型|描述|
   |:---------------|:-----------------------------------------------------------------------------------------------|
   |type|事件或控件注入的类型，事件注入类型范围请参考[随机测试命令参数](#随机测试)，控件注入类型范围包括ArkUI（方舟UI框架）下的ArkTS组件和ArkWeb（方舟Web）下的ArkTS组件。|
   |execTimes|事件或者控件注入执行次数。|
   |proportion|当前事件操作在事件注入执行总次数里的占比。|
   |inputedTimes|遍历的控件类型个数。|
   |expectInputTimes|应用控件类型总数。|
   |coverage|控件遍历覆盖率。|

3. Ability统计（ability Statistics）

   |字段|描述|
   |:------------------|:-------------|
   |bundleName|应用的bundleName。|
   |inputedAbilityCount|遍历的Ability数量。|
   |abilitiesCount|应用的Ability总数。|
   |coverage|Ability遍历覆盖率。|

4. 故障统计（Exception Message Statistics）

   > 说明
   >
   > 故障日志路径：/data/log/faultlog/faultlogger/

   |字段|描述|
   |:---------|:-----------------------------------------------------|
   |type|故障类型，故障类型包含：CPP_CRASH、JS_CRASH、SYS_FREEZE、APP_FREEZE等。|
   |times|故障次数。|
   |proportion|当前故障在故障总数里的占比。|

## 常见问题

### failed to connect to AAMS

**错误描述**

failed to connect to AAMS.

**可能原因**

AAMS被hypium或者dev testing的UIViewer占用了，AAMS同一时间只能被一个程序连接。

**解决方案**

结束占用AAMS的进程，或直接重启设备。

### Errorcode:(4005)

**错误描述**

Errorcode:(4005).

**可能原因**

因屏幕显示区域大小变化，导致无障碍获取页面信息失败。

**解决方案**

该错误不影响测试流程，无需处理。

### Errorcode:(4007)

**错误描述**

Errorcode:(4007).

**可能原因**

因屏幕显示区域大小变化，导致无障碍获取页面信息失败。

**解决方案**

该错误不影响测试流程，无需处理。

