youqu/docs/智能化性能测试.md

30 KiB
Executable File
Raw Blame History

智能化性能测试

# =============================================
# Attribution : Application Test Department III
# 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设备清单

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 的影响(重启生效)。

    sudo 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

    • 安装命令

      sudo 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 中配置了 Alias1user 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 = x86Intel-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

用于配置测试机的信息。

  • 有网络的情况下,服务端需要动态获取测试机上的一些资源,因此你需要写入 测试机别名userippassword

    # 测试机别名
    [Alias1] 
    # 测试机ip
    ip=10.8.15.86 
    # 测试机用户名
    user=uos
    

    命名建议:AliasA1AliasA2AliasB1AliasB2,不要重名。

  • 无网络情况下,仅需要关注测试机分辨率配置项 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
  • 参数 elementinput_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_elementright_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 ,说明尾帧出现在该阶段。
  • typeStabUnStab ,表示稳定阶段或不稳定阶段。

各阶段有帧数补偿,默认补偿的帧数为 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,指定到项目下其他路径,则会在对应的路径下生成 jsonExcel 文件。

你也可以根据需要读取所有 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/ttyACMnn为任意数字重启电脑解决。

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、**若部署时提示挂载 ttyACM0video0 失败,请检查 USB 串口线及采集盒是否接触良好,若接触良好,重启即可解决。

4、若出现图片能识别但是鼠标未移动操作时安装绝对鼠标操作的依赖包见第三节第二小节测试机环境搭建安装完成后必须重启测试机。

5、由于通过采集卡获取的测试机实时画面包含了鼠标的样式所以对图片识别时鼠标若停留在图标上层则会对识别结果造成影响需要将鼠标移动至其他位置或者隐藏鼠标解决。

6、Excel 报告中测试场景列与用例中的不一致关键字scene、app_name、架构别名不能包含下划线和英文符号的圆括号。