鸿蒙5.0开发【自定义性能脚本测试(基于python)】测试框架

框架概述

性能测试框架属于hypium自动化测试的的增强能力,设备操作的api能力与hypium一致。性能测试框架主要控制性能自动化测试模型流程执行、控制测试步骤中trace资源与视频资源的抓取以及自动化测试完成后的指标分析。

场景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个原则:

  • AW/接口使用 _perf方法
  • 必须带上场景Tag
  • 每个步骤必须是单独的tag,不能多个步骤共用一个tag

场景tag类型

为了采集器能准确识别场景,明确采集性能指标,定义了如下场景tag:

class SceneType(Enum):
    # 冷启
    COLD_START = "COLD_START"

    # 热启
    HOT_START = "HOT_START"

    # 有页面切换
    WITH_PAGE_SWITCH = "WITH_PAGE_SWITCH"

    # 无页面切换
    NO_PAGE_SWITCH = "NO_PAGE_SWITCH"

注:滑动操作和无页面切换的场景不测完成时延;冷启前需要杀掉该后台应用,热启前需要拉起该应用并置于后台

hypium_perf常用接口和用法

在hypium的界面操作接口上封装一套perf接口,提供给性能测试使用。

备注:以下所有示例代码中driver都是UiExplorerPerf对象, 所有带_perf的操作,tag一定不能遗漏

点击

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)

接口说明

根据选定的控件或者坐标位置执行点击操作

参数说明

序号参数名称参数描述
1target需要点击的目标,可以为控件(通过By类指定)或者屏幕坐标(通过tuple类型指定,例如(100, 200), 其中100为x轴坐标,200为y轴坐标), 或者使用find_component找到的控件对象
2mode点击模式,目前支持: “normal” 点击"long" 长按(长按后放开)“double” 双击
3scroll_target指定可滚动的控件,在该控件中滚动搜索指定的目标控件target。仅在target为By对象时有效
4wait_time点击后等待响应的时间,默认0.1s
5tag对应性能场景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))

滑动

用于执行不太精准的滑动操作

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的滑动操作。该接口用于执行不太精准的滑动操作。

序号参数名称参数描述
1direction滑动方向,目前支持:“LEFT” 左滑"RIGHT" 右滑"UP" 上滑"DOWN" 下滑
2distance相对滑动区域总长度的滑动距离,范围为1-100, 表示滑动长度为滑动区域总长度的1%到100%, 默认为60
3area通过控件指定的滑动区域
4side滑动位置, 指定滑动区域内部(屏幕内部)执行操作的大概位置,支持:UiParam.LEFT 靠左区域UiParam.RIGHT 靠右区域UiParam.TOP 靠上区域UiParam.BOTTOM 靠下区域
5start_point滑动起始点, 默认为None, 表示在区域中间位置执行滑动操作, 可以传入滑动起始点坐标,支持使用(0.5, 0.5)这样的比例坐标。当同时传入side和start_point的时候, 仅start_point生效
6swipe_time滑动时间(s), 默认0.3s
7tag对应性能场景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))

执行精准的滑动操作

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)

接口说明

根据指定的起始和结束位置执行滑动操作,起始和结束的位置可以为控件或者屏幕坐标。该接口用于执行较为精准的滑动操作。

参数说明

序列参数名称参数描述
1start滑动起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用find_component找到的控件对象
2end滑动结束位置,可以为控件BY.text(“最大值”)或者坐标(100, 200), 或者使用find_component找到的控件对象
3area滑动操作区域,可以为控件BY.text(“画布”)。目前仅在start或者end为坐标时生效,指定区域后,当start和end为坐标时,其坐标将被视为相对于指定的区域的相对位置坐标。
4slide_time滑动操作总时间,单位秒
5tag对应性能场景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))

拖拽

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)

接口说明

根据指定的起始和结束位置执行拖拽操作,起始和结束的位置可以为控件或者屏幕坐标

参数说明

序号参数名称参数描述
1start拖拽起始位置,可以为控件BY.text(“滑块”)或者坐标(100, 200), 或者使用find_component找到的控件对象
2end拖拽结束位置,可以为控件BY.text(“最大值”)或者坐标(100, 200), 或者使用find_component找到的控件对象
3area拖拽操作区域,可以为控件BY.text(“画布”), 或者使用find_component找到的控件对象。目前仅在start或者end为坐标时生效,指定区域后,当start和end为坐标时,其坐标将被视为相对于指定的区域的相对位置坐标。
4press_time拖拽操作开始时,长按的时间, 默认为1s(设置暂时无效)
5drag_time拖动的时间, 默认为1s(整个拖拽操作总时间 = press_time + drag_time)
6tag对应性能场景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))

屏幕侧边滑动返回

def swipe_to_back_perf(self, side=UiParam.RIGHT, times: int = 1, height: float = 0.5, tag: Tag = None)

接口说明

滑动屏幕右侧返回,设备预置:设备开启触摸屏手势导航

参数说明

序号参数名称参数描述
1side滑动的位置, "RIGHT"表示在右边滑动返回,"LEFT"表示在左边滑动返回
2times滑动次数, 默认1次, 某些场景可能需要两次才能返回
3height滑动位置在屏幕中Y轴的比例高度(从屏幕顶部开始计算)
4tag对应性能场景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))

从屏幕底部上滑返回桌面

def swipe_to_home_perf(self, times: int = 1, tag: Tag = None)

接口说明

屏幕低端上滑回到桌面,设备预置:设备开启触摸屏手势导航

参数说明

序号参数名称参数描述
1times上滑次数, 默认1次, 某些场景可能需要两次上滑才能返回桌面
2tag对应性能场景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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值