• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.test.PerfTest
2
3<!--Kit: Test Kit-->
4<!--Subsystem: Test-->
5<!--Owner: @inter515-->
6<!--Designer: @inter515-->
7<!--Tester: @laonie666-->
8<!--Adviser: @Brilliantry_Rui-->
9
10PerfTest提供白盒性能测试能力,供开发者在测试场景使用,支持对指定代码段或指定场景的性能数据测试,支持自动化执行测试代码段,并采集耗时、CPU、内存、时延、帧率等性能数据。
11
12> **说明:**
13> - 本模块首批接口从API version 20开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
14> - 本模块接口在<!--RP1-->[自动化测试脚本](../../application-test/arkxtest-guidelines.md)<!--RP1End-->中使用。
15> - 本模块接口不支持并发调用。
16> - 本模块接口适用于手机、平板、PC/2in1、智慧屏、车机。
17
18
19## 导入模块
20
21```ts
22import { PerfMetric, PerfTest, PerfTestStrategy, PerfMeasureResult } from '@kit.TestKit';
23```
24
25## PerfMetric
26
27框架支持采集的性能指标。
28
29**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
30
31**系统能力**:SystemCapability.Test.PerfTest
32
33| 名称       | 值   | 说明     |
34| ---------- | ---- | -------- |
35| DURATION                  | 0 | 代码段执行耗时,单位:ms。  |
36| CPU_LOAD                  | 1 | 应用进程CPU负载,取值为百分比。  |
37| CPU_USAGE                 | 2 | 应用进程CPU使用率,取值为百分比。  |
38| MEMORY_RSS                | 3 | 代码段单次执行结束时,应用进程占用物理内存(含共享库),单位:KB。  |
39| MEMORY_PSS                | 4 | 代码段单次执行结束时,应用进程占用物理内存(不含共享库),单位:KB。  |
40| APP_START_RESPONSE_TIME   | 5 | 应用启动的响应时延,单位:ms。  |
41| APP_START_COMPLETE_TIME   | 6 | 应用启动的完成时延,单位:ms。  |
42| PAGE_SWITCH_COMPLETE_TIME | 7 | 应用内页面切换的完成时延,单位:ms。  |
43| LIST_SWIPE_FPS            | 8 | 应用内列表滑动的帧率,单位:fps。 |
44
45> **说明**
46>
47> 1. 以上指标均用于采集指定应用进程的性能数据,非系统整机性能数据。
48> 2. CPU(CPU_LOAD/CPU_USAGE)、内存(MEMORY_RSS/MEMORY_PSS)数据采集说明如下:
49> - 测试过程中,代码段执行开始前和代码段执行结束后,会分别采集指定应用进程的CPU和内存数据,因此测试过程中需要保证被测应用进程一直存在。
50> 3. 应用启动时延(APP_START_RESPONSE_TIME/APP_START_COMPLETE_TIME)数据采集说明如下:
51> - 应用启动时延数据受系统打点上报限制,开始时间为点击事件上报时间点,响应时延结束时间为点击后系统响应首帧的上屏时间点(首帧显示在屏幕上的时间点),完成时延结束时间为应用启动后的首帧上屏时间点,与端到端用户感知时延存在差异。
52> - 应用启动时延数据采集支持的场景:桌面点击应用图标启动、Dock栏点击应用图标启动、应用中心点击应用图标启动。
53> - 单次测试期间,仅第一次指定应用启动的时延数据会被采集。
54> 4. 页面切换时延(PAGE_SWITCH_COMPLETE_TIME)数据采集说明如下:
55> - 页面切换时延计算受系统打点上报限制,开始时间为点击事件上报时间点,完成时延结束时间为页面切换后的首帧上屏时间点,与端到端用户感知时延存在差异。
56> - 页面切换时延数据采集支持的场景:Router、Navigation控件内的页面切换。
57> - 单次测试期间,仅指定应用内第一次页面切换的时延数据会被采集。
58> 5. 列表滑动帧率(LIST_SWIPE_FPS)数据采集说明如下:
59> - 列表滑动帧率:指的是在列表滑动时,屏幕每秒钟渲染更新帧的次数。
60> - 列表滑动帧率数据采集支持的场景:ArkUI子系统List、Grid、scroll、waterflow滚动控件列表的滑动。
61> - 单次测试期间,仅指定应用内第一次列表滑动的帧率数据会被采集。
62
63
64## PerfTestStrategy
65
66性能测试执行策略。
67
68**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
69
70**系统能力**:SystemCapability.Test.PerfTest
71
72| 名称 | 类型   | 只读 |  可选 | 说明        |
73| ---- | ------ | ---- | ---- |-----------|
74| metrics     | Array\<[PerfMetric](#perfmetric)>           | 否 | 否 | 被测性能指标列表。  |
75| actionCode  | Callback\<Callback\<boolean>> | 否 | 否 | 测试代码段。  |
76| resetCode   | Callback\<Callback\<boolean>> | 否 | 是 | 测试结束环境重置代码段。默认为空,框架运行时不执行此代码段。  |
77| bundleName  | string                      | 否 | 是 | 被测应用包名。默认为"",框架运行时测试当前测试应用的性能数据。  |
78| iterations  | number                      | 否 | 是 | 测试迭代执行次数,默认值为5。  |
79| timeout     | number                      | 否 | 是 | 单次代码段(actionCode/resetCode)执行的超时时间,默认值为10000ms。  |
80
81> **说明**
82>
83> 属性actionCode和resetCode的入参类型为回调函数"Callback\<boolean>"。在代码段中需要主动调用此回调函数,通知框架代码段执行完成,否则会导致代码段执行超时。
84> 其中,回调函数的参数为boolean类型,true代表代码段执行符合预期,false代码段执行不符合预期。[代码示例](#create)。
85
86## PerfMeasureResult
87
88性能指标对应测量结果数据。
89
90**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
91
92**系统能力**:SystemCapability.Test.PerfTest
93
94| 名称   | 类型   | 只读 | 可选 | 说明                      |
95| ------ | ------ | ---- | ---- | ------------------------- |
96| metric        | [PerfMetric](#perfmetric)    | 是 | 否 | 被测性能指标。  |
97| roundValues   | Array\<number> | 是 | 否 | 被测性能指标的各轮测量数据值。当数据采集失败时返回-1。  |
98| maximum       | number        | 是 | 否 | 各轮测量数据最大值(剔除为-1的数据后计算)。  |
99| minimum       | number        | 是 | 否 | 各轮测量数据最小值(剔除为-1的数据后计算)。  |
100| average       | number        | 是 | 否 | 各轮测量数据平均值(剔除为-1的数据后计算)。  |
101
102
103## PerfTest
104
105PerfTest类为白盒性能测试框架的总入口,提供测试任务创建、测试代码段执行和数据采集、测量结果获取等能力。
106
107### create
108
109static create(strategy: PerfTestStrategy): PerfTest
110
111静态方法,构造一个PerfTest对象,并返回该对象。
112
113**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
114
115**系统能力**:SystemCapability.Test.PerfTest
116
117**参数:**
118
119| 参数名   | 类型   | 必填 | 说明                            |
120| -------- | ------ | ---- | ------------------------------- |
121| strategy | [PerfTestStrategy](#perfteststrategy) | 是   | 性能测试执行策略。 |
122
123**返回值:**
124
125| 类型 | 说明           |
126| -------- | ---------------------- |
127| [PerfTest](#perftest)   | 返回构造的PerfTest对象。 |
128
129**错误码:**
130
131以下错误码的详细介绍请参见[perftest错误码](errorcode-perftest.md)。
132
133| 错误码ID | 错误信息               |
134| -------- | ---------------------- |
135| 32400001 | Initialization failed. |
136| 32400002 | Internal error. Possible causes: 1. IPC connection failed. 2. The object does not exist. |
137| 32400003 | Parameter verification failed. |
138| 32400007 | The API does not support concurrent calls. |
139
140**示例:**
141
142```ts
143import { PerfMetric, PerfTest, PerfTestStrategy } from '@kit.TestKit';
144
145async function demo() {
146  let metrics: Array<PerfMetric> = [PerfMetric.DURATION];
147  let num = 0;
148  let actionCode = async (finish: Callback<boolean>) => { // 定义测试代码段,入参类型'Callback<boolean>',命名为finish
149    for (let index = 0; index < 10000; index++) {
150      num++;
151    }
152    finish(true); // 调用finish回调函数,通知代码段执行结束,且执行符合预期
153  }
154  let resetCode = async (finish: Callback<boolean>) => {  // 定义测试结束环境重置代码段
155    num = 0;
156    finish(true);
157  }
158  let perfTestStrategy: PerfTestStrategy = {
159    metrics: metrics,
160    actionCode: actionCode,
161    resetCode: resetCode,
162    timeout: 30000,
163    iterations: 10,
164  };
165  let perfTest: PerfTest = PerfTest.create(perfTestStrategy); // 构造一个PerfTest对象,创建测试任务
166}
167```
168
169### run
170
171run(): Promise\<void>
172
173运行性能测试,迭代执行测试代码段并采集性能数据,使用Promise回调。
174
175**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
176
177**系统能力**:SystemCapability.Test.PerfTest
178
179**返回值:**
180
181| 类型 | 说明           |
182| -------- | ---------------------- |
183| Promise\<void>   | Promise对象。无返回结果的Promise对象。 |
184
185**错误码:**
186
187以下错误码的详细介绍请参见[perftest错误码](errorcode-perftest.md)。
188
189| 错误码ID | 错误信息               |
190| -------- | ---------------------- |
191| 32400002 | Internal error. Possible causes: 1. IPC connection failed. 2. The object does not exist. |
192| 32400004 | Failed to execute the callback. Possible causes: 1. An exception is thrown in the callback. 2. Callback execution timed out.  |
193| 32400005 | Failed to collect metric data. |
194| 32400007 | The API does not support concurrent calls. |
195
196**示例:**
197
198```ts
199import { PerfMetric, PerfTest, PerfTestStrategy } from '@kit.TestKit';
200
201async function demo() {
202  let metrics: Array<PerfMetric> = [PerfMetric.DURATION];
203  let num = 0;
204  let actionCode = async (finish: Callback<boolean>) => {
205    for (let index = 0; index < 10000; index++) {
206      num++;
207    }
208    finish(true);
209  }
210  let perfTestStrategy: PerfTestStrategy = {
211    metrics: metrics,
212    actionCode: actionCode
213  };
214  let perfTest: PerfTest = PerfTest.create(perfTestStrategy);
215  await perfTest.run(); // 运行性能测试
216}
217```
218
219### getMeasureResult
220
221getMeasureResult(metric: PerfMetric): PerfMeasureResult
222
223获取指定性能指标的测量数据。
224
225**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
226
227**系统能力**:SystemCapability.Test.PerfTest
228
229**参数:**
230
231| 参数名   | 类型   | 必填 | 说明                            |
232| -------- | ------ | ---- | ------------------------------- |
233| metric | [PerfMetric](#perfmetric) | 是   | 性能指标。 |
234
235**返回值:**
236
237| 类型 | 说明           |
238| -------- | ---------------------- |
239| [PerfMeasureResult](#perfmeasureresult)   | 性能指标对应测量结果数据。 |
240
241**错误码:**
242
243以下错误码的详细介绍请参见[perftest错误码](errorcode-perftest.md)。
244
245| 错误码ID | 错误信息               |
246| -------- | ---------------------- |
247| 32400002 | Internal error. Possible causes: 1. IPC connection failed. 2. The object does not exist. |
248| 32400003 | Parameter verification failed. |
249| 32400006 | Failed to obtain the measurement result. |
250| 32400007 | The API does not support concurrent calls. |
251
252**示例:**
253
254```ts
255import { PerfMetric, PerfTest, PerfTestStrategy } from '@kit.TestKit';
256
257async function demo() {
258  let metrics: Array<PerfMetric> = [PerfMetric.DURATION];
259  let num = 0;
260  let actionCode = async (finish: Callback<boolean>) => {
261    for (let index = 0; index < 10000; index++) {
262      num++;
263    }
264    finish(true);
265  }
266  let perfTestStrategy: PerfTestStrategy = {
267    metrics: metrics,
268    actionCode: actionCode
269  };
270  let perfTest: PerfTest = PerfTest.create(perfTestStrategy);
271  await perfTest.run();
272  let res = perfTest.getMeasureResult(PerfMetric.DURATION); // 获取指定性能指标的测量数据
273}
274```
275
276### destroy
277
278destroy(): void
279
280销毁PerfTest对象。
281
282**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
283
284**系统能力**:SystemCapability.Test.PerfTest
285
286**错误码:**
287
288以下错误码的详细介绍请参见[perftest错误码](errorcode-perftest.md)。
289
290| 错误码ID | 错误信息               |
291| -------- | ---------------------- |
292| 32400002 | Internal error. Possible causes: 1. IPC connection failed. 2. The object does not exist. |
293| 32400007 | The API does not support concurrent calls. |
294
295**示例:**
296
297```ts
298import { PerfMetric, PerfTest, PerfTestStrategy } from '@kit.TestKit';
299
300async function demo() {
301  let metrics: Array<PerfMetric> = [PerfMetric.DURATION];
302  let num = 0;
303  let actionCode = async (finish: Callback<boolean>) => {
304    for (let index = 0; index < 10000; index++) {
305      num++;
306    }
307    finish(true);
308  }
309  let perfTestStrategy: PerfTestStrategy = {
310    metrics: metrics,
311    actionCode: actionCode
312  };
313  let perfTest: PerfTest = PerfTest.create(perfTestStrategy);
314  await perfTest.run();
315  perfTest.destroy(); // 销毁PerfTest对象
316}
317```