智能化性能测试
# =============================================
# Attribution :Chengdu Test Team
# Time : 2023/1/3
# =============================================
一、简述
智能化性能测试
通过自动化手段对应用进行性能测试,提供方便的环境部署、运行配置、用例编写等,用于桌面应用的冷热启动、资源拷贝、页面跳转等性能场景测试。
仓库地址:https://gerrit.uniontech.com/admin/repos/autotest-perf-aitest
二、代码结构
autotest-perf-aitest
├── apps # 存放所有应用性能测试脚本
├── conftest.py # pytest hook相关方法
├── CURRENT # 版本内容
├── docs # 文档
│ ├── 键值对照表.pdf # 串口线code与按键的对照
│ ├── 性能自动化测试脚本执行器使用指南.md # 执行器脚本使用指南
│ ├── USB串口转USB键盘鼠标线协议文件V1.0.pdf # 串口协议
│ └── xserver-xorg-input-libinput-0.28.2.zip # Linux下绝对坐标操作依赖的源码,可根据架构打包
├── manage.py # 功能主入口
├── pytest.ini # pytst 配置
├── README.md
├── setting # 设置
│ ├── client.ini # 测试机 IP 设置
│ ├── config.py # 全局配置
│ ├── dev_env.sh # 宿主机环境部署脚本
│ ├── docker-compose_no_relay.yml # 无继电器容器集群
│ ├── docker-compose.yml # 有继电器容器集群
│ ├── docker_login.sh # docker 登陆
│ ├── __init__.py
│ ├── res
│ │ ├── black.png # 全黑图片,用于修改壁纸
│ │ ├── xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 架构鼠标绝对坐标依赖
│ │ ├── xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd 架构鼠标绝对坐标依赖
│ │ ├── xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm 架构鼠标绝对坐标依赖
│ │ ├── xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips 架构鼠标绝对坐标依赖
│ │ └── xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw 架构鼠标绝对坐标依赖
│ ├── server.ini # 服务器配置
│ ├── setup.sh # 容器环境部署脚本
│ ├── template # 创建 app 基础脚本模板
│ │ └── app_template
│ │ ├── ${app_name}_widget.py-tpl
│ │ ├── control-tpl
│ │ ├── images
│ │ │ └── readme
│ │ ├── __init__.py-tpl
│ │ ├── test_${app_name}_01_scene.json-tpl
│ │ └── test_${app_name}_01_scene.py-tpl
│ └── uos_docker # 容器环境配置
│ ├── dockerfile
│ └── requirements.txt
└── src
├── analysis_save.py # 解析图片流结果,汇总生成 excel 报告
├── base_widget.py # 封装的基础操作,应用调用的主入口方法
├── cmdctl.py # 调用命令行使用
├── global_value.py # 全局变量
├── image_utils.py # 图片相关方法
├── __init__.py
├── logger_utils.py # 日志配置
├── pdocr.py # ocr 配置
├── public_method.py # 一些方便的封住
├── record.py # 录屏相关
├── rtk # 运行相关
│ ├── _base.py # 一些枚举
│ ├── __init__.py
│ ├── install_env.py # 安装环境
│ └── local_runner.py # 运行用例
├── serial_communication # 串口相关
│ ├── __init__.py
│ ├── power_control.py # 继电器操作,使用继电器连接主机电源,控制开关机
│ ├── serial_common.py # 串口公共方法
│ └── usb_mk.py # 键鼠操作基础封装
├── shortcut_key.py # 快捷键的封装
├── singleton.py # 单例模式
├── start_app.py # 创建 app
└── write_xlsx.py # 生成 excel
# __init__.py 文件为标识该目录是一个Python的模块包,项目中的__init__.py均为空文件。
三、环境搭建
1、硬件环境
(1)设备清单
- 测试机至少一台。
- 服务端一台。(仅支持
AMD
架构,若需其他架构,咨询相关开发人员) - 采集盒一个。 (
ACASIS
HDMI
视频采集盒,https://item.jd.com/100013302599.html#crumb-wrap ) - USB串口转USB键鼠协议线。(优胜电子科技USB串口转USB键鼠协议线B类,https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 )
(2)硬件环境搭建
- 采集盒,
HDMI
端连接测试机,USB
端连接到服务器上。 USB
串口线,白色端连接服务器,黑色端连接测试机(USB3.0
接口上)。- 如果需要可以接
USB
延长线。 - 测试机上可以不接显示器。
(3)服务端推荐配置
配置越高,解析速度越快。
处理器: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (四核 / 八逻辑处理器)
主板: B460-N2(J)
内存: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))
显示适配器: UHD Graphics 630
存储设备: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)
2、测试机环境搭建
打开控制中心,账户设置为【自动登录】和【无密码登录】,电源管理中使用电源全部设置为【从不】,开启开发者模式。
根据应用性能测试要求,导入相关测试资源,比如:导入相册、影院、音乐的测试资源。
在服务端打开相机应用后,将测试机桌面壁纸更换为纯色壁纸(注意,服务端需提前开启相机后再设置测试机壁纸,建议纯黑壁纸
setting/res/black.png
)在文件管理器中,将选项 主菜单-设置-预览-图片预览 取消勾选(如不取消,会影响截图录屏应用的性能数据)
移动或删除系统 Logo ,排除桌面右下角 Logo 的影响(重启生效)。
shellsudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/
安装鼠标绝对坐标操作依赖(必须安装!!)
AMD
安装setting/res
目录下xserver-xorg-input-libinput_0.28.2-2_amd64.deb
ARM
安装setting/res
目录下xserver-xorg-input-libinput_0.28.2-2_arm64.deb
MIPS
安装 setting/res
目录下xserver-xorg-input-libinput_0.28.2-2_mips64.deb
3A5000
安装setting/res
目录下xserver-xorg-input-libinput_0.28.2-2_5000.deb
安装命令
shellsudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb
安装时会提示已存在相同版本,请忽略,直接覆盖安装,安装完成后,必须重启主机才生效
3、服务端一键环境部署
环境搭建前必须先连接上 USB
串口线和采集盒。
宿主机环境安装
python3 manage.py install --env host
容器环境安装
python3 manage.py install --env docker
四、配置项
1、服务端配置
setting/config/server.ini
用于配置测试过程中的一些配置项,包含了所有服务端所有的可配置项。
- 本地无网络运行
- 将配置项
network=0
即可开始测试。
- 将配置项
- 本地有网络运行
- 配置项
network=1
- (1)配置项
client_alias=
配置为你要测试的测试机别名,如Alias1
测试机别名在setting/config/client.ini
中进行配置,此时,直接运行python3 manager
即可开始测试。 - (2)配置项
client_alias=
为空,测试机别名在config/client.ini
中进行配置,此时,直接运行python3 manager --client_alias Alias1
,即可开始测试。(Alias1
为你配置的测试机别名) - (1)和(2)只要使用其一即可。
- 配置项
- 有网络运行,且需要通过
Jenkins
上运行一个job
,同时控制多台机器。- 配置项
network=1
- 配置项
client_alias=
不用配置,在运行run.sh
的时候直接空格加别名即可,比如:测试机别名为Alias1
,且已经在config/client.ini
中配置了Alias1
的user
ip
password
,则运行bash run.sh Alias1
即可开始测试。 - 在
Jenkins
pipeline
里面通过并行stage
或并行调用下层任务的方式可以实现大规模的性能测试需求。
- 配置项
详细配置项说明:
;=============================== CASE CONFIG ===================================
[case]
;执行的应用名称
;为空表示执行 apps/ 目录下所有应用的用例
APP_NAME =
;执行包含关键词的用例
KEYWORDS =
;执行包含用例标签的用例
TAGS =
;1、KEYWORDS 和 TAGS 都为空表示执行 APP_NAME 的所有用例
;2、KEYWORDS 和 TAGS 都支持逻辑组合,即 and/or/not 的表达式, e.g. TAGS = L1 or smoke
[case_conf]
# 尾帧识别的方式stage按阶段划分,ocr通过文案识别,match 图片匹配,ocr文案识别较慢,不推荐使用
find_by = stage
# 最后一个稳定阶段的帧数识别
# 首帧存在后的第一个大于该配置帧数的阶段的首帧作为性能尾帧
final_stable_num=100
# 从该帧数开始识别文案或图片,减少分析时间
start_num = 150
# 识别的文案
text=
# 识别图片
match=apps/xxx/images/match.png
# 识别相似度
match_rate=0.9
# 用例操作执行之后,停止录屏之前的等待时间,单位秒
# 比如热启动用例,从点击打开到停止录屏,中间等待5秒;
duration = 15
# 单条用例执行的次数
count = 5
# 稳定阶段划分的相似度
stable_similarity = 0.9997
[server]
# 调试模式=1,为开启调试模式,0为关闭。
# 调试模式下默认只执行一次用例,不关机
# 编写用例的过程中建议开启maintain。
MAINTAIN = 0
# 运行的环境docker容器环境,host宿主机环境
ENV = docker
# 服务端密码
PASSWORD=1
# 指定测试机别名
# 测试机别名在 config/client.ini 中进行配置,比如:
# [AMD]
# ip=10.8.15.86
# user=uos
# 其中 AMD 为测试机别名,则client_alias=AMD
CLIENT_ALIAS = x86(Intel-i7)
# 1 开启网络, 0 关闭网络
# (1)服务端与测试机须在同一网段下,你可以尝试在服务端通过ssh连接测试机,如果可以连接,说明网络正常。
# (2)当input_type=FILE_NAME 时,必须开启网络。
NETWORK = 1
# 性能结果统计单位 毫秒—ms, 秒—s
UNIT=ms
# 测试机开机进入桌面后等待时间,单位/秒
STARTUP_DELAY = 60
# 1为删除缓存,0为不删除缓存
# 用例执行完后会在report目录下生成智能解析的一些缓存图片。
CACHE = 0
# 默认为空,报告会保存在项目下report目录中;
# 指定报告目录则存放到指定目录。
REPORT_PATH = report
# 服务端从测试机获取的icon资源会缓存在项目下input目录中
INPUT = input/
# 1为测试完关机,0为测试完不关机
SHUTDOWN = 0
# 解析进程数(不推荐修改)
# 3个进程解析视频已经能够满足,即使增加进程数也不能减少整体耗时
# 另外还要看CPU核数是否支持。
PARSING_PROCESS = 3
# 1为使用继电器开关机,0为使用reboot命令重启。依赖继电器硬件设备,需要使用联系开发者
RELAY = 0
# 获取测试应用的版本, %s 占位应用名
# 如果该配置为空,则不获取应用的版本信息。
COMMAND = apt policy %s 2>/dev/null|grep "已安装"|awk -F ":" "{print \$2}"
# 关机等待开启时间,单位秒
# 根据测试机性能不同,开关机耗时可能不同,根据实际测试机情况配置。
SHUTDOWN_DELAY = 30
# 可用于图像识别的图片格式,以英文逗号隔开。
# 该配置项不建议修改,目前我们仅验证了jpg,jpeg,png这三种常用的图片格式。
INPUT_TYPES = jpg,jpeg,png
# 性能分析补帧,等于或低于该值的不稳定阶段视为稳定阶段,在最后计算性能结果时需要减掉。
UN_STAB_START = 3
# 服务端获取测试机图像的帧率,即每秒获取多少张测试机上的图像。
# 默认帧率为30帧/秒,该配置项不建议修改,可能会对解析结果造成偏差。
FPS = 30
# 以下场景类型会重启测试机,多种场景使用逗号隔开
SCENE = cold
;OCR服务端地址(不可随意修改)
OCR_SERVER_HOST = http://10.8.13.78:8890
#屏幕图片临时存放位置
SCREEN_CACHE = /tmp/screen
# =======================================
[log]
# 日志级别,OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
# 用例执行过程中的一些日志输出,log_cli=INFO表示 仅输出INFO及以上级别的日志。
LOG_LEVEL = DEBUG
# 日志文件保存路径
LOG_PATH= logs
# =======================================
[dockerhub]
# 容器登陆账号
DOCKER_USER = user
# 容器登陆密码
DOCKER_PASSWORD = User1234
2、测试机配置
setting/config/client.ini
用于配置测试机的信息。
有网络的情况下,服务端需要动态获取测试机上的一些资源,因此你需要写入
测试机别名
、user
、ip
、password
。ini# 测试机别名 [Alias1] # 测试机ip ip=10.8.15.86 # 测试机用户名 user=uos
命名建议:
AliasA1
、AliasA2
、AliasB1
、AliasB2
,不要重名。无网络情况下,仅需要关注测试机分辨率配置项
width=
、height=
即可。
详细配置项说明:
[client]
# 默认测试机用户名,密码,ip
ip=
user=
# 测试机密码
password=1
# 测试机主题
theme=bloom
# 测试机icon目录
path=/usr/share/icons
# 系统desktop文件的存放目录,UOS系统默认为/usr/share/applications
desktop_path=/usr/share/applications
# 用于判断测试机是否开机进入桌面的识别标识。
# 1、通过桌面图标识别。
# - type=FILE_NAME时,服务器和测试机必须在同一局域网内。
# - power_on=dde-computer表示通过桌面计算机图标判断开机进入桌面。
# 2、通过本地图片作为开机识别。
# - type= 传入为图片格式,type支持的类型包含在server.ini内配置项input_type=jpg,jpeg,png。
# - power_on= 传入的是本地图片的路径。
type=FILE_NAME
power_on=dde-computer
# 测试机分辨率配置(测试机连接采集盒,采集盒的分辨率)
height=1080
width=1920
[AliasA1]
ip=10.8.15.86
user=uos
# password=1 如果这里不写密码,默认取上面client里面的password
[AliasA2]
ip=10.8.15.20
user=uos
# password=1 如果这里不写密码,默认取上面client里面的password
3、场景个性化配置
随着测试场景的不断引入,发现现有服务端里的配置项并不适用于所有的性能场景,于是将服务端配置进行一个提取,可做单个场景的个性化配置,当然原来的服务端配置功能保留,只是当你配置了场景个性化配置后,优先使用个性化配置里面的内容,以下是对个性化配置的介绍。
目前每一个 py 文件对应一个性能测试场景,于是在同级目录下创建一个与之同名的 json 文件,作为个性化配置文件
apps
├── album
├── test_album_01_start.json # 个性化配置文件
└── test_album_01_start.py # 性能场景文件
以下是对 json 文件中配置的解释,若某项配置不需要,可以缺失,但不能为空;
{
"title": "test_album_start", # 标题;必须
"app_name": "deepin-album", # 场景所属的应用;必须
"scene": "hot", # 场景别名;必须
"icon": ["deepin-album"], # 这条用例里面需要用到的所有icon,用例执行之前会从测试机上拷贝所有需要用的icon到服务端,用于图像识别。;可缺失
# 注意:列表中元素为应用desktop文件的文件名,相册的desktop文件名为deepin-album.desktop,
# 只需要写deepin-album即可,“.desktop”已经在底层做了拼接。
"size": { # 图片对比的区域设置项,某些应用当前屏幕的部分区域需要将其去掉,可以设置此项,如果没有则可不写;可确实
"x-coordinate": 0, # 左上角横坐标
"y-coordinate": 0, # 左上角纵坐标
"width": 850, # 横向长度
"height": 1920 # 纵向高度
},
"count": 5, # 场景执行的次数;必须
"duration": 5, # 该条用例操作执行之后,停止录屏之前的等待时间,单位秒,针对于某些特定场景,该配置为可选项,覆盖 server.ini 中的配置;可缺失
"stable_similarity": 0.9997, # 性能场景分阶段时的图片相似度对比,前后图片低于该值,则分为不稳定阶段;可缺失
"find_by": "stage", # 尾帧识别的方式stage按阶段划分,ocr通过文案识别,match 图片匹配
"final_stable_num": 100, # 查找最后一个大于该值的稳定阶段的首帧作为性能的尾祯;可缺失
"start_num": 150,
"text": "", # ocr识别的文案
"match": "apps/xxx/images/match.png", # 图像匹配的图片文件路径
"match_rate": 0.9 # 匹配相似度
}
五、测试流程
六、用例编写及方法参数指引
1、用例实例说明
# 标准库导入
from time import sleep
# 导入三方库pytest
import pytest
# 导入用例执行要用到的Widget类
from src.base_widget import BaseWidget
class TestStart:
# class级别的fixture,测试用例执行之前执行。autouse=True 自动在当前作用域下使用。
@pytest.fixture(scope="class", autouse=True)
# 测试热启动之前需要预启动。
def application_pre_start(self):
# 入参规则在第2点中详细描述。
BaseWidget().right_click_element("deepin-album")
# 入参规则在第2点中详细描述。
BaseWidget().click_element("apps/autotest_deepin_album/picture/open.png", input_type="png")
sleep(2)
# 快捷键关闭窗口
BaseWidget().hot_key("alt", "f4")
sleep(2)
# 默认为function级别的fixture,用例执行之前,class级别fixture执行之后执行。
@pytest.fixture(autouse=True)
def setup_start(self):
# 右键点击 deepin-album 图标
BaseWidget().right_click_element("deepin-album")
# 移动到右键菜单中打开(open.png)
# 入参规则在第2点中详细描述。
BaseWidget().move_to(*BaseWidget().find_element("apps/autotest_deepin_album/picture/open.png", input_type="png"))
# 等待移动完成
sleep(0.5)
def test_album_start(self):
# 点击“打开”
BaseWidget().click()
2、方法参数说明
2.1、find_element
方法
def find_element(element: str, input_type: str = "FILE_NAME", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):
pass
参数
element
和input_type
(1)通过应用
icon
识别元素input_type
参数为默认参数,默认值为FIEL_NAME
,表示通过应用icon
寻找元素,此方法会动态获取测试机上的应用icon
图标。- 举例:默认情况下
input_type
参数不需要传入,find_element("deepin-album")
,表示通过deepin-album
的应用icon
来获取坐标,注意,此时传入的deepin-album
参数实际是desktop
文件的文件名,和2.3中的icon
变量一致。 - 我们建议优先使用这种方法,但此方法依赖网络,请根据测试环境实际情况选择。
(2)通过本地图片识别元素
- 参数
input_type
传入图片格式,比如截取的本地图片格式为png
,那么input_type="png"
,此时参数element
传入图片的路径,建议存放在对应的产品apps/app/picture/
目录下,路径为项目根目录下的相对路径。 - 举例:
find_element("apps/autotest_deepin_album/picture/open.png", input_type="png"))
,表示通过本地图片open.png
识别元素。
参数
fill_color_position
fill_color_position
参数为默认参数,默认值为(-1, -1)
,(-1, -1)
表示取屏幕中右下角最后一个像素点作为填充坐标,在1920x1080
屏幕分辨率下即实际坐标为(1919, 1079)
,这样的写法可以适配不同大小的屏幕。- 任务栏在屏幕不同方位:
- 任务栏在屏幕下方,从任务栏启动不需要传入该参数。
- 任务栏在屏幕左边,
fill_color_position=(1, 1)
- 任务栏在屏幕右边,
fill_color_position=(-1, -1)
- 任务栏在屏幕上边,
fill_color_position=(1, 1)
- 从桌面启动应用,则需要传入除任务栏以外其他位置的坐标,比如(100, 100),只要这个坐标为除应用和任务栏区域都可以。
- 从启动器里面启动应用,需要填充的坐标为启动器区域。
注:通过应用
icon
识别时,从测试机获取的icon
原文件为svg
矢量图,转换为png
之后需要填充边缘透明部分。参数
size
size
参数为默认参数,默认值为(25, 70)
,表示测试机上dock
栏上应用图标的大小范围。UOS
系统dock
栏是可以上下拖动大小的,随着dock
栏大小改变,应用图标的范围为25到70之间。- 如果你的测试机操作系统上
dock
栏大小不一样,可以根据实际情况传入大小范围。
2.2、click_element
、 right_click_element
, double_click_element
这几个方法参数规则与 find_element
方法一样。他们实际上是在 find_element
方法基础之上做了二次封装,增加了鼠标的动作,如果你不想使用这几个方法,在用例中也可以通过 find_element
获取到坐标,然后将坐标传入到键鼠的方法中,可以实现同样的效果。
2.3、用例类中有个类变量 icon = ["deepin-album"]
需要特殊说明,列表中的元素为这条用例里面需要用到的所有 icon
,用例执行之前会从测试机上拷贝所有需要用的 icon
到服务端用于图像识别。列表中元素为应用 desktop
文件的文件名,相册的 desktop
文件名为 deepin-album.desktop
,只需要写 deepin-album
即可,.desktop
已经在底层做了拼接。
七、执行入口
1、用例组织
在 setting/config/server.ini
文件中 APP_NAME=
字段为用例的执行的目录,默认为 apps
目录下所有用例。如果你想指定执行某一个应用的用例,你可以将该配置项指定到应用的用例目录,比如:APP_NAME=deepin_album
, 表示执行相册目录下的用例。
2、命令行参数
通过命令行参数配置参数
以下为 python3 manage.py run
提供的一些参数选项:
-a APP, --app APP 应用名称:deepin-music
-k KEYWORDS, --keywords KEYWORDS
用例的关键词
-t TAGS, --tags TAGS 用例的标签
--log_level LOG_LEVEL 日志输出级别
--env {host,docker} 在宿主机或容器环境执行
--client_alias 选择测试机别名, 可选项为client.ini中已配置, 默认值为 zx-x86.
--count 指定用例执行次数
在一些 CI 环境下使用命令行参数会更加方便:
python3 manage.py run --app deepin-music --keywords "xxx" --tags "xxx" --env docker
注:在容器中执行时,若强制退出,容器并不会停止运行!
八、测试报告
1、Json 报告
自研视频解析工具会对单条用例执行一轮生成一个 json
文件,存放于 report/{app_name}/{scene}/{run_num}
目录下,命名格式为:
report.json
json
内容举例:
[
{
"Stab1": {
"images": [1,2...150,151],
"startStub": 0,
"type": "Stab"
}
},
{
"Stab2": {
"images": [152,153...169,170],
"startStub": 1,
"type": "UnStab"
}
},
{
"Stab3": {
"images": [171,172...300,301],
"startStub": 0,
"type": "UnStab"
}
}
]
说明:
Stab
:表示解析过程中不同的阶段。images
:表示每一帧的图片序号。startStub
: 为识别尾帧的阶段表示,如果"startStub": 1
,说明尾帧出现在该阶段。type
: 为Stab
或UnStab
,表示稳定阶段或不稳定阶段。
各阶段有帧数补偿,默认补偿的帧数为 3 帧(可以通过 server.ini
里面 un_stab_start=3
进行配置),表示小于等于 3 帧的不稳定阶段视为稳定阶段,在最后计算性能结果时前后均需要减掉。
应用启动阶段就是在 Stab2
阶段,启动时间为:171 减 151 再减掉前后补偿帧数 6 帧,即 14 帧,视频帧率 30 帧/秒,因此启动耗时为:14 * 33 = 462 ms
2、Excel 报告
所有用例执行并解析完之后会 report
目录下生成一个汇总数据的 Excel
文件,文件名为:{time}_perf_time.xlsx
。
注意,report
目录为可配置项,默认情况下会在项目根目录下生成,如果你将 report
,指定到项目下其他路径,则会在对应的路径下生成 json
和 Excel
文件。
你也可以根据需要读取所有 json
/ excel
报告的数据,生成你自己想要的一些测试报告形式。
九、USB 串口驱动键鼠方法
位于 src/utils/control/serial_communication
目录下的 usb_mk.py
文件
usb_mk = UsbMk()
1、键盘操作
(1)按下键盘按键
usb_mk.press_key("enter") # 按下键盘enter键
(2)按下键盘按键并且不放
usb_mk.press_key_down("enter") # 按下键盘enter键不放
(3)组合按键
usb_mk.hot_key("ctrl", "alt", "T") # 按下组合按键ctrl+alt+T调起终端
(4)组合按键不放
usb_mk.hot_key_down("ctrl", "alt", "T") # 按下组合按键ctrl+alt+T调起终端不放
(5)释放所有键盘按键
usb_mk.key_up()
(6)键盘输入字符串(支持传入汉字,会自动转成拼音输入)
usb_mk.hot_key("ctrl", "alt", "T") # 按下组合按键ctrl+alt+T调起终端
usb_mk.input_text("reboot") # 输入字符串reboot
usb_mk.press_key("enter") # 按下键盘enter键
2、鼠标操作
(1)按下鼠标左键
usb_mk.click()
(2)按下鼠标左键不放
usb_mk.mouse_down()
(3)释放鼠标所有按键
usb_mk.mouse_up()
(4)按下鼠标右键
usb_mk.right_click()
(5)鼠标左键双击
usb_mk.double_click()
(6)恢复鼠标至初始位置,默认左上角
usb_mk.move_to_init()
(7)移动鼠标至相对坐标
usb_mk.move_rel(100, 200) # 鼠标向左边移动100个像素,向下移动200个像素
(8)以屏幕左上角为圆心坐标移动鼠标至屏幕绝对坐标
usb_mk.move_to(100, 200) # 鼠标移动至屏幕坐标(100, 200)
(9)按下鼠标左键,拖动到绝对坐标位置
usb_mk.drag_to(100, 200) # 按下鼠标拖动至屏幕坐标(100, 200)
(10)按下鼠标左键,拖动到相对坐标位置
usb_mk.drag_rel(100, 200) # 鼠标向左边移动100个像素,向下移动200个像素
十、继电器控制主机开机/重启
(若不使用继电器,可忽略该步骤,执行时会通过命令 reboot
)
1、继电器设备
LCUS-2
型 双路 USB
智能串口控制继电器。
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e
2、USB 延长线
普通的 USB
线即可。
3、杜邦线
3.1、40P
母对公杜邦线。
3.2、一母二公杜邦线。
4、安装图文教程
4.1、使用 USB
延长线连接控制端和继电器。
4.2、在继电器常端和公共端均连接一根杜邦线。
4.3、在主板上开机针和重启针上插上一母二公杜邦线。
4.4、将开机针外接的一母二公杜邦线的两根公线分别接入继电器的1路继电器(如图 1左侧继电器)和原电源开关。
4.5、将重启针外接的一母二公杜邦线的两根公线分别接入继电器的2路继电器(如图 1 右侧继电器)和原电源开关。
若想保留原电源开关的电源灯,可根据如上图所示,使用杜邦线连接主板上的电源灯和原电源开关
十一、常见问题说明
1、ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory
检查 USB 串口线连接状态,查看 /dev/ttyACM0
是否存在,若存在 /dev/ttyACMn
(n为任意数字),重启电脑解决。
2、Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running
容器启动失败
1)检查哪一个容器未启动
sudo docker container ls # 列出运行中的 Docker 容器
2)缺少 uos 容器,检查 USB 串口连接线和采集盒连接线是否正常,重启后执行
bash install/setup.up # 重新完整部署环境
或执行
sudo docker-compose up -d --build # 仅重新构建 Docker 镜像
**3、**若部署时提示挂载 ttyACM0
、video0
失败,请检查 USB 串口线及采集盒是否接触良好,若接触良好,重启即可解决。
4、若出现图片能识别,但是鼠标未移动操作时,安装绝对鼠标操作的依赖包,见第三节第二小节测试机环境搭建,安装完成后,必须重启测试机。
5、由于通过采集卡获取的测试机实时画面,包含了鼠标的样式,所以对图片识别时,鼠标若停留在图标上层,则会对识别结果造成影响,需要将鼠标移动至其他位置,或者隐藏鼠标解决。
6、Excel 报告中,测试场景列与用例中的不一致,关键字scene、app_name、架构别名,不能包含下划线和英文符号的圆括号。