性能测试框架属于hypium自动化测试的的增强能力,支持开发者使用python语言为应用编写自动化测试性能脚本,在DevEco Testing提供的场景化性能测试进行性能指标检测并查看测试报告。本指南主要介绍性能测试脚本的开发。
DevEco Testing场景化性能测试详情介绍,请参考指导:场景化性能测试。
hypium基本AW接口功能介绍,请参考指导:Hypium框架-API使用方法。
1、系统要求
Windows
操作系统:Windows 10/11 64 位
内存:推荐使用16GB及以上(可用内存大于8G)
处理器:i7-10700@2.9GHz或者同等性能的型号
硬盘:可用硬盘空间100GB以上
Mac
操作系统:macOs 13及以上
内存:推荐使用16GB及以上(可用内存大于8G)
处理器:i7-10700@2.9GHz及以上或Apple silicon M系列
硬盘:可用硬盘空间100GB以上
2、安装Python及Hypium
性能测试框架基于Python环境,依赖Hypium环境搭建,Python推荐3.10版本,其他版本可能出现兼容性问题。
相关环境搭建与基本AW使用,请参考指导:应用UI测试。
安装hypium_perf
1、获取安装包:
1)通过Deveco Testing客户端场景化性能测试获取安装包。操作如下:
进入DevEco Testing客户端-场景化性能测试,选择自定义场景测试,点击获取安装包。随后会跳转至华为开发者联盟官网。

2)访问华为开发者联盟官网下载页面:DevEco Testing Hypium

找到DevEco Testing Hypium,下载解压后找到其中的hypium-5.0.7.200.zip(请以实际版本号为准)。
3)下载解压完成后,由于存在依赖关系,请先安装hypium、xdevice等库,再安装hypium_perf、perf_analyzer等库。
您需要将hypium及xdevice系列库与hypium_perf系列库安装到同一个python环境,且python版本为3.10 一键安装:从安装包所在目录打开终端窗口,Windows环境下运行 install.bat 脚本,或Mac环境下运行install.sh脚本,跟随提示确认安装。
4)安装完成后,将提示所有包安装成功,环境安装成功。
以下版本仅供示例,具体版本号请参照实际下载版本。

如脚本执行失败,可使尝试手动安装。确保用python3.10版本,在终端窗口输入 python -m pip install --upgrade pip 更新pip后,进入对应的路径,手动安装依赖包。
以下命令的版本仅供示例,具体版本号请参照实际下载版本。
pip install xdevice-5.0.5.100.tar.gz pip install xdevice-devicetest-5.0.5.100.tar.gz pip install xdevice-ohos-5.0.5.100.tar.gz pip install hypium-5.0.5.100.tar.gz pip install hypium_perf-5.0.5.100-py3-none-any.whl pip install perf_collector-4.2.1b0-py3-none-any.whl perf_analyzer-4.2.1b0-py3-none-any.whl perf_common-4.2.1b0-py3-none-any.whl perf_resource-4.2.1b0-py3-none-any.whl
安装完成后,可前往查看PyCharm-设置-项目-Python解释器中的软件包与已安装版本是否一致。
1、下载脚本模板
1)进入DevEco Testing 场景化性能测试,选择自定义场景测试,点击创建工程模板。

2)填写工程项目名称,选择工程存放路径,点击开始生成。

3)在指定的文件夹路径下,将自动生成用例模板。

已下载的脚本工程模板,可在PyCharm中可直接调试验证,调试验证成功后,即可在DevEco Testing上运行脚本做性能测试。详情可查看 本地脚本调试及测试执行章节。
也可基于已下载的工程模板,参考后续章节,根据应用实际测试场景,进行脚本写作及调试。
2、场景用例和原子用例使用说明
(1)测试步骤
我们把用户一次操作定义为一个测试步骤。
(2)原子用例
多个测试步骤组合,完成一套操作,我们称为原子用例,存放于models目录,对应脚本中一个model(模型),有独立的原子用例编号。
原子用例可以被重用,是最小的用例单元。
(3) 场景用例
我们把用户完成一件事情定义为一个场景。比如:用户在小红书浏览后去淘宝搜索购物。
一个场景对应一条场景用例,场景用例编号与用例文件名一致,存放在testcase目录下,场景用例是测试执行的入口,一个场景用例可以由多个原子用例组成,比如上述场景:用户在小红书浏览后去淘宝搜索购物,可由两个原子用例组成:1)用户浏览小红书 2)用户在淘宝搜索并购物。这两个原子用例独立且可被重用。假设有另一个场景用例:用户在小红书浏览后去京东购物,那么用户浏览小红书这个原子用例即可被重用。
工程执行的入口、结果的反馈,都是以一个个场景用例为单位。
3、场景用例写作指导
Testcase编写规范:
Testcase对应的是测试场景中的一系列相关的原子用例操作序列,在脚本编写时对应一个testcase。
(1)命名规范:
一个testcase是一个独立的python文件,testcase文件命名为可区分的场景编号名称,例:
OH_PerfDemoTest.py。
(2)继承规范:
testcase必须继承PerfBaseCase类,PerfBaseCase会负责用例开始时的初始化流程,进行一些设备环境检查操作。
(3)注释规范:
将场景用例的场景描述放置在用例最上方,方便审视测试场景所包含的原子用例执行步骤对应关系。
场景用例模板:
class OH_PerfDemoTest(PerfBaseCase): # 继承PerfBaseCase
def __init__(self, controllers): # 初始化操作
self.TAG = self.__class__.__name__
self.tests = [
"test_step"
]
self.case_id = os.path.splitext(os.path.basename(__file__))[0] # 文件名, 类名, case_id 三者保持一致
case_pkg = 'com.huawei.hmos.settings' # 指定被测试应用,用于采集应用资源使用信息,默认不采
PerfBaseCase.__init__(self, controllers, case_pkg) # 调用父类初始化方法
self.log.info("Case id is %s" % self.case_id)
def setup(self):
# 场景用例前置化操作,在test_step前执行一些操作
self.log.info("预置工作:初始化设备开始................." + self.devices[0].device_sn)
def test_step(self):
# 组装需要调用的原子用例,使用原子化用例构建场景步骤,可以一个场景用例可添加多个原子用例
steps = [
# 原子用例需要传入driver,case_id
SettingInterfaceBrowering(self.driver, self.case_id)
]
# 按顺序执行原子用例
for item in steps:
item.execute()
def teardown(self):
# 获取用例测试结果
result = self.get_case_result()
# 场景用例结束后执行该teardown操作
self.log.info("收尾工作................., result is {}".format(result))
# 此处为用例结尾时执行的PerfBaseCase的teardown方法,处理一些结束操作
PerfBaseCase.teardown(self) OH\_PerfDemoTest.json 配置文件模板
{
"description": "Config for OpenHarmony devicetest test cases",
"environment": [
{
"type": "device"
}
],
"driver": {
"type": "DeviceTest",
"py_file": ["OH_PerfDemoTest.py"]
}
}
{... ,"py\_file" : ["OH\_PerfDemoTest.py"]},此处文件路径是testcases的相对路径。
4、原子用例写作指导
Model编写规范:
Model对应的是原子用例操作中的一组操作序列,在脚本编写时对应一个model。
(1)命名规范:
一个model是一个独立的python文件,model文件命名为有一定业务含义的名称,例如:设置界面浏览->
setting_interface_browsing.py。
(2)继承规范:
model必须继承基类ModelBase,ModelBase会负责与采集器的交互,并且处理model模型中如果执行出错出现
的异常场景。
(3)注释规范:
将原子用例操作步骤放置在用例最上方,方便审视模型步骤和用例执行步骤对应关系。
原子用例模板:
'''
@原子用例
设置界面浏览
@预置条件
无
@用例步骤
1.冷启动设置
2.上滑1次浏览界面
3.下滑1次浏览界面
4.点击蓝牙
5.侧滑返回
6.再次点击蓝牙
7.侧滑返回
8.点击显示和亮度
9.侧滑返回
10.上滑返回桌面
'''
APP_NAME = "设置"
class SettingInterfaceBrowering(ModelBase): # 原子用例统一继承ModelBase
def __init__(self, uidriver: IDriverPerf, case_id): # 进行初始化操作
ModelBase.__init__(self, uidriver, case_id) # 调用父类初始化方法
self.scene_no = "SettingInterfaceBrowering" # 原子用例id
self.scene_name = "设置界面浏览" # 原子用例名字
self.scene_type = "系统设置场景" # 原子用例类型
self.scene_path = "日常高频操作-基础操作场景-系统通用操作场景-系统设置场景" # 原子用例所属路径
self.set_model_pkg("com.huawei.hmos.settings") # 设置当前原子用例测试应用的包名
self.driver = uidriver
def setup(self): # 原子用例预置动作
# 停止指定的应用
self.driver.stop_app('com.huawei.hmos.settings')
# 返回手机桌面主页
self.driver.go_home()
@ModelBase.scene_recover # 此修饰器为必带
def execute(self):
# 1.冷启动设置
# find_app_in_launcher 从主页开始滑动查找对应APP名的应用,应用需要在桌面上可见,返回的是(x,y)坐标值元组
icon_pos = self.driver.find_app_in_launcher(APP_NAME)
# 创建性能场景Tag, 使用继承ModelBase的方法create_tag,设置step_name步骤描述,step_type对应性能tag类型
Tag = self.create_tag(step_name="冷启动设置", scene_type=SceneType.COLD_START)
# touch_perf 模拟手指点击
self.driver.touch_perf(icon_pos, tag=Tag)
# 等待指定时间,等待界面稳定,再进行下一步操作
self.driver.wait(1)
# 2.上滑1次浏览界面
# swipe_perf 在屏幕上或者指定区域area中执行朝向指定方向direction的滑动操作
self.driver.swipe_perf(UiParam.UP,
tag=self.create_tag("上滑1次浏览界面", SceneType.NO_PAGE_SWITCH))
# 3.下滑1次浏览界面
self.driver.swipe_perf(UiParam.DOWN,
tag=self.create_tag("下滑1次浏览界面", SceneType.NO_PAGE_SWITCH))
# 4.点击蓝牙
# 使用find_component查找控件,返回的是一个UiComponent类型的值(控件文本为蓝牙)
com = self.driver.find_component(BY.text('蓝牙'))
# 可将UiComponent类型传入touch_perf,会自动识别并转换为坐标点击
self.driver.touch_perf(com, tag=self.create_tag("点击蓝牙", SceneType.WITH_PAGE_SWITCH))
# 5.侧滑返回
# swipe_to_back_perf 滑动屏幕右侧返回
self.driver.swipe_to_back_perf(tag=self.create_tag("侧滑返回", SceneType.WITH_PAGE_SWITCH))
# 6.再次点击蓝牙
# 返回所有符合条件的控件,返回值是多个UiComponent类型的值组成的列表,也可添加参数index=0,返回第一个控件
coms = self.driver.find_all_components(BY.text('蓝牙'))
self.driver.touch_perf(coms[0], tag=self.create_tag("再次点击蓝牙", SceneType.WITH_PAGE_SWITCH))
# 7.侧滑返回
self.driver.swipe_to_back_perf(tag=self.create_tag("侧滑返回", SceneType.WITH_PAGE_SWITCH))
# 8.点击显示和亮度
# 可将BY类型传入touch_perf,会自动查找指定条件的控件,并转换为坐标点击
self.driver.touch_perf(BY.text('显示和亮度'),
tag=self.create_tag("点击显示和亮度", SceneType.WITH_PAGE_SWITCH))
# 9.侧滑返回
self.driver.swipe_to_back_perf(tag=self.create_tag("侧滑返回", SceneType.WITH_PAGE_SWITCH))
# 10.上滑返回桌面
# swipe_to_home_perf 从屏幕底部上滑返回桌面
self.driver.swipe_to_home_perf(tag=self.create_tag("上滑返回桌面", SceneType.WITH_PAGE_SWITCH))
def teardown(self):
# 原子用例结束清理步骤
pass 5、使用UiViewer查看控件
可使用控件查看工具,辅助脚本写作。DevEco Testing->实用工具->UIViewer

1、功能介绍
性能测试框架属于hypium自动化测试的的增强能力,设备操作的api能力与hypium一致。性能测试框架主要控制性能自动化测试模型流程执行、控制测试步骤中trace资源与视频资源的抓取以及自动化测试完成后的指标分析。
AW接口功能介绍,可以参考指导:Hypium框架-API使用方法
注:若测试场景包含隐私界面无法录屏,则无法进行测试,例如银行类应用、密码界面等
2、场景tag
场景tag是测试框架定义的一套用于标注测试步骤使用场景的标签。
def create_tag(self, step_name="", scene_type="", pkg_name="", wait_time=0)
参数名称 | 参数描述 |
|---|---|
step_name | 必填,测试步骤中文名字 |
scene_type | 必填,对应性能tag类型,从SceneType中选择 |
pkg_name | 非必填,测试应用相关包名 |
wait_time | 非必填,增加采集时长,避免采集未包含全部动效 |
所有性能测试的需要采集指标的步骤,有以下3个原则:
3、场景tag类型
class SceneType(Enum):
# 冷启
COLD_START = "COLD_START"
# 热启
HOT_START = "HOT_START"
# 有页面切换
WITH_PAGE_SWITCH = "WITH_PAGE_SWITCH"
# 无页面切换
NO_PAGE_SWITCH = "NO_PAGE_SWITCH" 注:滑动操作和无页面切换的场景不测完成时延;冷启前需要杀掉该后台应用,热启前需要拉起该应用并置于后台
4、hypium_perf常用接口和用法
在hypium的界面操作接口上封装一套perf接口,提供给性能测试使用。
以下所有示例代码中driver都是UiExplorerPerf对象, 所有带_perf的操作,tag一定不能遗漏
Phone常用接口
1) 点击
def touch_perf(self, target: Union[By, UiComponent, tuple], mode: str = "normal", scroll_target: Union[By, UiComponent] = None, wait_time: float = 0.1, tag: Tag = None)
接口说明
根据选定的控件或者坐标位置执行点击操作。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | target | 需要点击的目标,可以为控件(通过By类指定)或者屏幕坐标(通过tuple类型指定,例如(100, 200), 其中100为x轴坐标,200为y轴坐标), 或者使用find_component找到的控件对象 |
2 | mode | 点击模式,目前支持: "normal" 点击"long" 长按(长按后放开)"double" 双击 |
3 | scroll_target | 指定可滚动的控件,在该控件中滚动搜索指定的目标控件target。仅在target为By对象时有效 |
4 | wait_time | 点击后等待响应的时间,默认0.1s |
5 | tag | 对应性能场景tag,点击如果进入新界面,需使用WITH_PAGE_SWITCH有界面切换的场景类型 |
使用示例
# 点击文本为"hello"的控件 driver.touch_perf(BY.text("hello"), tag=self.create_tag("点击hello", SceneType.NO_PAGE_SWITCH)) # 点击(100, 200)的位置 driver.touch_perf((100, 200), tag=self.create_tag("点击(100, 200)", SceneType.NO_PAGE_SWITCH)) # 双击确认按钮(控件文本为"确认", 类型为"Button") driver.touch_perf(BY.text("确认").type("Button"), mode=UiParam.DOUBLE, tag=self.create_tag("双击确认按钮", SceneType.WITH_PAGE_SWITCH)) # 在类型为Scroll的控件上滑动查找文本为"退出"的控件并点击 driver.touch_perf(BY.text("退出"), scroll_target=BY.type("Scroll"), tag=self.create_tag("点击退出", SceneType.NO_PAGE_SWITCH)) # 冷启动相机 icon_pos = self.driver.find_app_in_launcher(APP_NAME) driver.touch_perf(icon_pos, tag=self.create_tag("相机冷启动", SceneType.COLD_START))
2) 用于执行不太精准的滑动操作
def swipe_perf(self, direction: str, distance: int = 60, area: Union[By, UiComponent] = None, side: str = None, start_point: tuple = None, swipe_time: float = None, tag: Tag = None, check_scroll=False)
接口说明
在屏幕上或者指定区域area中执行朝向指定方向direction的滑动操作。该接口用于执行不太精准的滑动操作。
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | direction | 滑动方向,目前支持:"LEFT" 左滑"RIGHT" 右滑"UP" 上滑"DOWN" 下滑 |
2 | distance | 相对滑动区域总长度的滑动距离,范围为1-100, 表示滑动长度为滑动区域总长度的1%到100%, 默认为60 |
3 | area | 通过控件指定的滑动区域 |
4 | side | 滑动位置, 指定滑动区域内部(屏幕内部)执行操作的大概位置,支持:UiParam.LEFT 靠左区域UiParam.RIGHT 靠右区域UiParam.TOP 靠上区域UiParam.BOTTOM 靠下区域 |
5 | start_point | 滑动起始点, 默认为None, 表示在区域中间位置执行滑动操作, 可以传入滑动起始点坐标,支持使用(0.5, 0.5)这样的比例坐标。当同时传入side和start_point的时候, 仅start_point生效 |
6 | swipe_time | 滑动时间(s), 默认0.3s |
7 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 在屏幕上向上滑动, 距离40 driver.swipe_perf(UiParam.UP, distance=40, tag=self.create_tag("向上滑动", SceneType.NO_PAGE_SWITCH)) # 在屏幕上向右滑动, 滑动事件为0.1秒 driver.swipe_perf(UiParam.RIGHT, swipe_time=0.1, tag=self.create_tag("向右滑动", SceneType.NO_PAGE_SWITCH)) # 在屏幕起始点为比例坐标为(0.8, 0.8)的位置向上滑动,距离30 driver.swipe_perf(UiParam.UP, 30, start_point=(0.8, 0.8), tag=self.create_tag("向上滑动", SceneType.NO_PAGE_SWITCH)) # 在屏幕左边区域向下滑动, 距离30 driver.swipe_perf(UiParam.DOWN, 30, side=UiParam.LEFT, tag=self.create_tag("向下滑动", SceneType.NO_PAGE_SWITCH)) # 在屏幕右侧区域向上滑动,距离30 driver.swipe_perf(UiParam.UP, side=UiParam.RIGHT, tag=self.create_tag("在右侧向上滑动", SceneType.NO_PAGE_SWITCH)) # 在类型为Scroll的控件中向上滑动 driver.swipe_perf(UiParam.UP, area=BY.type("Scroll"), tag=self.create_tag("在滑动区域向上滑动", SceneType.NO_PAGE_SWITCH))
3)执行精准的滑动操作
def slide_perf(self, start: Union[By, tuple], end: Union[By, tuple], area: By = None, slide_time: float = 2, tag: Tag = None, check_scroll=False)
接口说明
根据指定的起始和结束位置执行滑动操作,起始和结束的位置可以为控件或者屏幕坐标。该接口用于执行较为精准的滑动操作。
参数说明
序列 | 参数名称 | 参数描述 |
|---|---|---|
1 | start | 滑动起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用find_component找到的控件对象 |
2 | end | 滑动结束位置,可以为控件BY.text(“最大值”)或者坐标(100, 200), 或者使用find_component找到的控件对象 |
3 | area | 滑动操作区域,可以为控件BY.text("画布")。目前仅在start或者end为坐标时生效,指定区域后,当start和end为坐标时,其坐标将被视为相对于指定的区域的相对位置坐标。 |
4 | slide_time | 滑动操作总时间,单位秒 |
5 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 从类型为Slider的控件滑动到文本为最大的控件
driver.slide_perf(BY.type("Slider"), BY.text("最大"),tag=self.create_tag("滑动到最大", SceneType.NO_PAGE_SWITCH))
# 从坐标100, 200滑动到300,400
driver.slide_perf((100, 200), (300, 400), tag=self.create_tag("向上滑动", SceneType.NO_PAGE_SWITCH))
# 从坐标100, 200滑动到300,400, 滑动时间为3秒
driver.slide_perf((100, 200), (300, 400), slide_time=3, tag=self.create_tag("向上滑动", SceneType.NO_PAGE_SWITCH))
# 在类型为Slider的控件上从(0, 0)滑动到(100, 0)
driver.slide_perf((0, 0), (100, 0), area = BY.type("Slider"), tag=self.create_tag("向上滑动", SceneType.NO_PAGE_SWITCH)) 4)拖拽
def drag_perf(self, start: Union[By, tuple], end: Union[By, tuple], area: By = None, press_time: float = 1, drag_time: float = 1, tag: Tag = None)
接口说明
根据指定的起始和结束位置执行拖拽操作,起始和结束的位置可以为控件或者屏幕坐标
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | start | 拖拽起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用find_component找到的控件对象 |
2 | end | 拖拽结束位置,可以为控件BY.text(“最大值”)或者坐标(100, 200), 或者使用find_component找到的控件对象 |
3 | area | 拖拽操作区域,可以为控件BY.text("画布"), 或者使用find_component找到的控件对象。目前仅在start或者end为坐标时生效,指定区域后,当start和end为坐标时,其坐标将被视为相对于指定的区域的相对位置坐标。 |
4 | press_time | 拖拽操作开始时,长按的时间, 默认为1s(设置暂时无效) |
5 | drag_time | 拖动的时间, 默认为1s(整个拖拽操作总时间 = press_time + drag_time) |
6 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 拖拽文本为"文件.txt"的控件到文本为"上传文件"的控件 driver.drag_perf(BY.text("文件.txt"), BY.text("上传文件"), tag=self.create_tag("拖拽文件", SceneType.NO_PAGE_SWITCH)) # 拖拽id为"start_bar"的控件到坐标(100, 200)的位置, 拖拽时间为2秒 driver.drag_perf(BY.key("start_bar"), (100, 200), drag_time=2, tag=self.create_tag("拖拽start_bar", SceneType.NO_PAGE_SWITCH)) # 在id为"Canvas"的控件上从相对位置(10, 20)拖拽到(100, 200) driver.drag_perf((10, 20), (100, 200), area = BY.id("Canvas"), tag=self.create_tag("拖拽Canvas", SceneType.NO_PAGE_SWITCH)) # 在滑动条上从相对位置(10, 10)拖拽到(10, 200) driver.drag_perf((10, 10), (10, 200), area=BY.type("Slider"), tag=self.create_tag("拖拽滑动条", SceneType.NO_PAGE_SWITCH))
5)屏幕侧边滑动返回
def swipe_to_back_perf(self, side=UiParam.RIGHT, times: int = 1, height: float = 0.5, tag: Tag = None)
接口说明
滑动屏幕右侧返回,设备预置:设备开启触摸屏手势导航。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | side | 滑动的位置, "RIGHT"表示在右边滑动返回,"LEFT"表示在左边滑动返回 |
2 | times | 滑动次数, 默认1次, 某些场景可能需要两次才能返回 |
3 | height | 滑动位置在屏幕中Y轴的比例高度(从屏幕顶部开始计算) |
4 | tag | 对应性能场景tag,侧边返回有界面切换时,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 侧滑返回 self.driver.swipe_to_back_perf(tag=self.create_tag("侧滑返回", SceneType.WITH_PAGE_SWITCH)) # 侧滑2次返回 self.driver.swipe_to_back_perf(times=2, tag=self.create_tag("侧滑2次返回", SceneType.WITH_PAGE_SWITCH)) # 设置侧滑位置的高度比例为屏幕高度的80%,即在屏幕靠下的位置侧滑返回 self.driver.swipe_to_back_perf(height=0.8, tag=self.create_tag("屏幕靠下的位置侧滑返回", SceneType.WITH_PAGE_SWITCH))
6)从屏幕底部上滑返回桌面
def swipe_to_home_perf(self, times: int = 1, tag: Tag = None)
接口说明
屏幕低端上滑回到桌面,设备预置:设备开启触摸屏手势导航。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | times | 上滑次数, 默认1次, 某些场景可能需要两次上滑才能返回桌面 |
2 | tag | 对应性能场景tag,返回桌面一般带有界面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 上滑返回桌面 self.driver.swipe_to_home_perf(tag=self.create_tag("上滑返回桌面", SceneType.WITH_PAGE_SWITCH)) # 连续上滑2次返回桌面 self.driver.swipe_to_home_perf(times=2, tag=self.create_tag("上滑返回桌面", SceneType.WITH_PAGE_SWITCH))
PC常用接口
1)鼠标点击
def mouse_click_perf(self, pos: Union[tuple, UiComponent, By], button_id: MouseButton = MouseButton.MOUSE_BUTTON_LEFT, key1: Union[KeyCode, int] = None, key2: Union[KeyCode, int] = None, tag: Tag = None)
接口说明
根据选定的控件或者坐标位置执行鼠标点击操作,支持键鼠组合操作。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | pos | 需要点击的位置, 支持坐标, UiComponent对象以及By, 例如(100, 200), BY.text("确认") |
2 | button_id | 需要点击的鼠标按键,默认为鼠标左键MouseButton.MOUSE_BUTTON_LEFT 鼠标右键:MOUSE_BUTTON_RIGHT,鼠标中键:MOUSE_BUTTON_MIDDLE |
3 | key1 | 需要组合按下的第一个键盘按键,按键参数可以从KeyCode枚举类中选取 |
4 | key2 | 需要组合按下的第二个键盘按键 |
5 | tag | 对应性能场景tag,点击如果进入新界面,需使用WITH_PAGE_SWITCH有界面切换的场景类型 |
使用示例
# 使用鼠标左键点击(100, 200)的位置 driver.mouse_click_perf((100, 200), MouseButton.MOUSE_BUTTON_LEFT, tag=self.create_tag("鼠标左键点击", SceneType.NO_PAGE_SWITCH)) # 使用鼠标右键点击文本为"确认"的控件 driver.mouse_click_perf(BY.text("确认"), MouseButton.MOUSE_BUTTON_RIGHT, tag=self.create_tag("鼠标右键点击‘确认’", SceneType.NO_PAGE_SWITCH)) # 使用鼠标右键点击比例坐标(0.8, 0.5)的位置 driver.mouse_click_perf((0.8, 0.5), MouseButton.MOUSE_BUTTON_RIGHT, tag=self.create_tag("鼠标右键点击", SceneType.NO_PAGE_SWITCH))
2)滚轮滑动
def mouse_scroll_perf(self, pos: Union[tuple, UiComponent, By], scroll_direction: str, scroll_steps: int, key1: int = None, key2: int = None, tag: Tag = None):
接口说明
鼠标滚轮滑动,支持键鼠组合操作。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | pos | 滚动的位置, 例如(100, 200) |
2 | scroll_direction | 滚动方向"up" 向上滚动"down" 向下滚动 |
3 | scroll_steps | 滚动的鼠标格数 |
4 | key1 | 需要组合按下的第一个键盘按键,按键参数可以从KeyCode枚举类中选取 |
5 | key2 | 需要组合按下的第二个键盘按键 |
6 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 鼠标滚轮在(100, 200)的位置向下滚动10格 driver.mouse_scroll_perf((100, 200), UiParam.DOWN, scroll_steps=10, tag=self.create_tag("滚轮向下滑动", SceneType.NO_PAGE_SWITCH)) # 鼠标滚轮在类型为Scroll的控件上向上滚动10格 driver.mouse_scroll_perf(BY.type("Scroll"), UiParam.UP, scroll_steps=10, tag=self.create_tag("滚轮向上滑动", SceneType.NO_PAGE_SWITCH)) # 按住ctrl键, 鼠标滚轮在类型为Scroll的控件上向上滚动10格 driver.mouse_scroll_perf(BY.type("Scroll"), UiParam.UP, scroll_steps=10, key1=KeyCode.CTRL_LEFT, tag=self.create_tag("滚轮向上滑动", SceneType.NO_PAGE_SWITCH)) # 按住ctrl和shift键, 鼠标滚轮在类型为Scroll的控件上向上滚动10格 driver.mouse_scroll_perf(BY.type("Scroll"), UiParam.UP, scroll_steps=10, key1=KeyCode.CTRL_LEFT, key2=KeyCode.SHIFT_LEFT, tag=self.create_tag("按住ctrl和shift滚轮向上滑动", SceneType.NO_PAGE_SWITCH))
3)鼠标拖拽
def mouse_drag_perf(self, start: Union[tuple, UiComponent, By], end: Union[tuple, UiComponent, By], speed: int = 3000, tag: Tag = None):
接口说明
根据指定的起始和结束位置执行拖拽操作,使用鼠标进行拖拽操作(按住鼠标左键移动鼠标)。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | start | 拖拽起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用控件对象 |
2 | end | 拖拽结束位置,可以为控件BY.text(“最大值”)或者坐标(200, 200), 或者使用控件对象 |
3 | speed | 鼠标移动速度,像素/秒 |
4 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 鼠标从控件1拖拽到控件2 driver.mouse_drag_perf(BY.text("控件1"), BY.text("控件2"), tag=self.create_tag("鼠标从控件1拖拽到控件2", SceneType.NO_PAGE_SWITCH))
4)鼠标移动
def mouse_move_perf(self, start: Union[tuple, UiComponent, By], end: Union[tuple, UiComponent, By], speed: int = 3000, tag: Tag = None):
接口说明
鼠标指针从起始位置移动到结束位置,模拟移动轨迹和速度。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | start | 拖拽起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用控件对象 |
2 | end | 拖拽结束位置,可以为控件BY.text(“最大值”)或者坐标(200, 200), 或者使用控件对象 |
3 | speed | 鼠标移动速度,像素/秒 |
4 | tag | 对应性能场景tag,若该操作不涉及页面切换,需使用NO_PAGE_SWITCH场景类型 |
使用示例
# 鼠标从控件1移动到控件2 driver.mouse_move_perf(BY.text("控件1"), BY.text("控件2"), tag=self.create_tag("鼠标从控件1移动到控件2", SceneType.NO_PAGE_SWITCH))
5)键盘单按键
def press_key_perf(self, key_code: Union[KeyCode, int], mode="normal", tag: Tag = None):
接口说明
键盘按下指定单个按键。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | key_code | 需要按下的按键编码,按键参数可以从KeyCode枚举类中选取 |
2 | mode | 按键模式, 仅在进行单个按键时支持,支持:UiParam.NORMAL 默认, 按一次UiParam.LONG 长按UiParam.DOUBLE 双击 |
3 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 按下电源键 driver.press_key_perf(KeyCode.POWER, tag=self.create_tag("按电源键唤醒屏幕", scene_type=SceneType.WITH_PAGE_SWITCH)) # 长按电源键 driver.press_key_perf(KeyCode.POWER, mode=UiParam.LONG, tag=self.create_tag("长按电源键", scene_type=SceneType.WITH_PAGE_SWITCH)) # 按下音量下键 driver.press_key_perf(KeyCode.VOLUME_DOWN, tag=self.create_tag("按下音量下键", scene_type=SceneType.NO_PAGE_SWITCH))
6)键盘组合键
def press_combination_key_perf(self, key1: Union[KeyCode, int], key2: Union[KeyCode, int], key3: Union[KeyCode, int] = None, tag: Tag = None):
接口说明
键盘按下组合键, 支持2键或者3键组合。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | key1 | 组合键第一个按键,按键参数可以从KeyCode枚举类中选取 |
2 | key2 | 组合键第二个按键 |
3 | key3 | 组合键第三个按键 |
4 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 按下音量下键和电源键的组合键
driver.press_combination_key_perf(KeyCode.VOLUME_DOWN, KeyCode.POWER,
tag=self.create_tag("按下音量下键和电源键的组合键", scene_type=SceneType.NO_PAGE_SWITCH))
# 同时按下ctrl, shift和F键
driver.press_combination_key_perf(KeyCode.CTRL_LEFT, KeyCode.SHIFT_LEFT, KeyCode.F,
tag=self.create_tag("同时按下ctrl, shift和F键", scene_type=SceneType.NO_PAGE_SWITCH)) 7)从应用中心启动APP
def start_app_from_panel_perf(self, app_name, package_name, tag: Tag = None):
接口说明
基于APP名称和包名,启动对应的app。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | app_name | 窗口的APP名称,例:“设置” |
2 | package_name | 窗口的App的包名,例:"com.huawei.hmos.settings" |
3 | tag | 对应性能场景tag,冷启动App,scene_type一般使用SceneType.COLD_START |
使用示例
APP_NAME = "设置" PACKAGE_NAME = "com.huawei.hmos.settings" # 冷启动设置app driver.start_app_from_panel_perf(APP_NAME, PACKAGE_NAME, tag=self.create_tag("从应用中心冷启动设置", scene_type=SceneType.COLD_START))
8)关闭APP窗口
def close_window_by_app_perf(self, app_name, package_name, tag: Tag = None):
接口说明
基于APP名称和包名,关闭对应app的窗口。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | app_name | 窗口的APP名称,例:“设置” |
2 | package_name | 窗口的App的包名,例:"com.huawei.hmos.settings" |
3 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
APP_NAME = "设置" PACKAGE_NAME = "com.huawei.hmos.settings" # 关闭设置app的窗口 driver.close_window_by_app_perf(APP_NAME, PACKAGE_NAME, tag=self.create_tag("点击右上角×关闭设置", scene_type=SceneType.WITH_PAGE_SWITCH))
9)调整窗口大小
def resize_window_perf(self, width_diff: int, height_diff: int, direction: ResizeDirection, window: Union[str, UiWindow, WindowFilter] = None, tag: Tag = None):
接口说明
根据传入的宽、高和调整方向来调整窗口的大小。适用于支持调整大小的窗口。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | width_diff | 窗口宽度的变化量 |
2 | height_diff | 窗口高度的变化量 |
3 | direction | 窗口调整的方向,方向参数可在ResizeDirection中选取 |
4 | window | 指定需要操作的窗口 |
5 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 查找需要操作的窗口 window = driver.find_window(WindowFilter().bundle_name(package_name)) # 鼠标置于窗口右下角,拖动对角线进行扩大窗口大小 driver.resize_window_perf(width_diff=200, height_diff=200, direction=ResizeDirection.RIGHT_DOWN, window, tag=self.create_tag("鼠标置于窗口右下角,拖动对角线进行扩大窗口大小", scene_type=SceneType.NO_PAGE_SWITCH))
10)最大化窗口
def maximize_window_perf(self, window: Union[str, UiWindow, WindowFilter] = None, tag: Tag = None):
接口说明
最大化窗口。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | window | 指定需要操作的窗口 |
2 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 查找需要操作的窗口
window = driver.find_window(WindowFilter().bundle_name(package_name))
# 点击窗口最大化
driver.maximize_window_perf(window, tag=self.create_tag("点击窗口最大化",
scene_type=SceneType.WITH_PAGE_SWITCH)) 11)最小化窗口
def minimize_window_perf(self, window: Union[str, UiWindow, WindowFilter] = None, tag: Tag = None, **kwargs):
接口说明
最小化窗口。
参数说明
序号 | 参数名称 | 参数描述 |
|---|---|---|
1 | window | 指定需要操作的窗口 |
2 | tag | 对应性能场景tag,若该操作有页面切换,需使用WITH_PAGE_SWITCH场景类型 |
使用示例
# 查找需要操作的窗口
window = driver.find_window(WindowFilter().bundle_name(package_name))
# 点击窗口最小化
driver.minimize_window_perf(window, tag=self.create_tag("点击窗口最小化",
scene_type=SceneType.WITH_PAGE_SWITCH)) 1、main.py实现
方法一:在main.py中修改cmd命令,将参数替换为本地调试的场景用例名称。

main.py 示例:
import time
from xdevice.__main__ import main_process
if __name__ == "__main__":
try:
pass_dict = dict()
pass_dict['task_id'] = time.strftime('%Y%m%d%H%M%S', time.localtime())
cmd = 'run -l OH_PerfDemoTest -ta pass_through:' + str(pass_dict)
main_process(cmd)
time.sleep(10)
except Exception as e:
print(e)
finally:
print("Task is End") 方法二:在main.py同级目录下,新建一个json文件,命名为action_testsuite.json,并在main.py中修改cmd命令。

action_testsuite.json 示例:
{
"description": "hypium test case",
"environment": [
{
"type": "device"
}
],
"driver": {
"type": "DeviceTest",
"py_file": [
"OH_PerfDemoTest.py"
]
},
"kits": [
]
} 2、本地多用例执行方式
一个测试任务执行多个场景用例,而不必每个场景用例单独执行,任务会按照顺序依次执行指定的场景用例。
方法一:在main.py 的cmd命令中指定多个case,用';'分割

方法二:在json文件配置,并在main.py的cmd命令参数中指定json文件

示例: action_testsuite.json
{
"description": "hypium test case",
"environment": [
{
"type": "device"
}
],
"driver": {
"type": "DeviceTest",
"py_file": [
"Open_Perf_Test.py",
"OH_PerfDemoTest.py"
]
},
"kits": [
]
} 性能脚本本地调试验证成功后,可在DevEco Testing上运行脚本做性能测试,执行过程及报告查看请跳转到文档:DevEco Testing—性能测试—场景化性能测试—测试执行