From fbac127c72dba5696c33eb2153f87802d2ed91b5 Mon Sep 17 00:00:00 2001 From: mikigo Date: Tue, 5 Sep 2023 15:38:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=201=E3=80=81=E6=AD=A3=E5=BC=8F=E5=90=AF?= =?UTF-8?q?=E7=94=A8letmego=20=E6=8A=80=E6=9C=AF=E6=96=B9=E6=A1=88?= =?UTF-8?q?=EF=BC=9B2=E3=80=81docs=E9=87=8C=E9=9D=A2=E7=BB=86=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E8=BF=9C=E7=A8=8B=E6=89=A7=E8=A1=8C=E7=AB=A0=E8=8A=82?= =?UTF-8?q?=E7=9A=84=E6=8F=8F=E8=BF=B0=EF=BC=9B3=E3=80=81=E5=8F=91?= =?UTF-8?q?=E5=B8=832.2.0=E7=89=88=E6=9C=AC=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description: Log: --- CURRENT | 2 +- _env_base.sh | 2 + docs/RELEASE.md | 10 +++ docs/index.md | 157 +++++++++++++++++++++++++++---------- docs/框架功能介绍.md | 36 ++++++--- pyproject.toml | 2 +- 6 files changed, 153 insertions(+), 56 deletions(-) diff --git a/CURRENT b/CURRENT index 253acd6..b78b3e5 100644 --- a/CURRENT +++ b/CURRENT @@ -1,2 +1,2 @@ [current] -tag = 2.1.5 \ No newline at end of file +tag = 2.2.0 \ No newline at end of file diff --git a/_env_base.sh b/_env_base.sh index d2d3c40..bb9663f 100644 --- a/_env_base.sh +++ b/_env_base.sh @@ -110,6 +110,8 @@ wayland_env(){ fi if [ ! -f "$HOME/.Xauthority" ]; then + echo -e "I'm not sure why the $HOME/.Xauthority file is not available on this device.\nWe're trying to create an empty .Xauthority file to ensure the program runs properly,\nbut Xlib may have some warning prompts. + " touch $HOME/.Xauthority fi diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 7ecf9cc..c387225 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,5 +1,15 @@ # 版本更新记录 +## 2.2.0(2023/9/5) + +new + +- 正式启用 letmego 技术方案; + +fix + +- 对 docs 里面细化了远程执行章节的描述; + ## 2.1.5(2023/8/31) new diff --git a/docs/index.md b/docs/index.md index 96a703d..51130ca 100644 --- a/docs/index.md +++ b/docs/index.md @@ -145,8 +145,11 @@ KEYWORDS = ;执行包含用例标签的用例 TAGS = -;1、KEYWORDS 和 TAGS 都为空表示执行 APP_NAME 的所有用例 -;2、KEYWORDS 和 TAGS 都支持逻辑组合,即 and/or/not 的表达式, e.g. TAGS = L1 or smoke +;----------------------------------------------- +;1.KEYWORDS 和 TAGS 都为空表示执行 APP_NAME 的所有用例 +;2.KEYWORDS 和 TAGS 都支持逻辑组合,即 and/or/not 的表达式 +;e.g. TAGS = L1 or smoke +;----------------------------------------------- ;本地文件测试套,将要执行的用例写入指定的 csv 文件 ;默认为空,从基础框架根目录开始:e.g. CASE_FILE = case_list.txt @@ -156,33 +159,34 @@ CASE_FILE = ;=============================== RUNNER CONFIG =================================== [runner] ;最大失败用例数量的占比 -;比如:总执行用例数为100, 若 MAX_FAIL = 0.5,则失败用例数达到50就会终止测试。 -MAX_FAIL = 0.5 +;比如:总执行用例数为 100, 若 MAX_FAIL = 0.5,则失败用例数达到 50 就会终止测试。 +MAX_FAIL = 1 ;单条用例的超时时间,如果一条用例的执行时间超时,这条用例会被停止,后续用例继续执行。 ;单位为秒 -; 这是一个全局统一配置,如果某条用例需要单独配置超时时间,可以在用例中这样写: +;这是一个全局统一配置,如果某条用例需要单独配置超时时间,可以在用例中这样写: ;@pytest.mark.timeout(500) ;def test_xxx_001(): ; ... -;会话(所有用例执行的)超时是根据全局超时配置和用例单独超时配置自动计算的; +;会话超时(所有用例执行的超时时间)是根据全局超时配置和用例单独超时配置自动计算的。 CASE_TIME_OUT = 200 ;失败用例重跑次数 +;注意,RERUN = 1 表示重跑 1 次,即第一次用例执行失败会自动重跑 1 次,总共执行 2 次; +;如果第 2 次执行成功,结果成功,失败亦为失败。 RERUN = 1 -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +;失败录屏从第几次失败开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第 1 次执行失败之后开始录屏,RERUN >= RECORD_FAILED_CASE。 +;1.关闭录屏:RECORD_FAILED_CASE > RERUN +;2.每条用例都录屏:RECORD_FAILED_CASE = 0 RECORD_FAILED_CASE = 1 -;批量执行时,终端输出的日志级别 DEBUG/INFO/ERROR -LOG_LEVEL = INFO - ;yes 每条用例执行之后进行环境清理 CLEAN_ALL = yes -;检查测试机分辨率 +;检查测试机分辨率, 比如:1920x1080 +;no: 表示不做分辨率校验 RESOLUTION = 1920x1080 ;不跳过用例,csv文件里面标记了 skip-xxx的用例不跳过 @@ -210,8 +214,33 @@ REPEAT = ;yes, 测试过程中立即显示报错 DURING_FAIL = no +;注册自启服务 +AUTOSTART = no + ;=============================== REPORT CONFIG =================================== [report] +;测试报告的title +REPORT_TITLE = YouQu Report + +;测试报告的name +REPORT_NAME = YouQu Report + +;测试报告的默认语言 +;en:English +;ru:Русский +;zh:中文 +;de:Deutsch +;nl:Nederlands +;he:Hebrew +;br:Brazil +;pl:Polski +;ja:日本語 +;es:Español +;kr:한국어 +;fr:Français +;az:Azərbaycanca +REPORT_LANGUAGE = zh + ;用例执行完后生成的测试报告格式 ;目前支持 allure, xml, json (支持同时生成) REPORT_FORMAT = allure, xml, json @@ -245,10 +274,10 @@ TMPDIR = /tmp/tmpdir SYS_THEME = deepin ;OCR服务端地址(不可随意修改) -OCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890 +OCR_SERVER_HOST = youqu-dev.uniontech.com ;OpenCV服务端地址 -OPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889 +OPENCV_SERVER_HOST = youqu-dev.uniontech.com ;=============================== PMS CONFIG =================================== ;PMS相关配置,包含以下几个方面: @@ -256,7 +285,7 @@ OPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889 ;2.自动从PMS爬取数据并同步本地CSV文件 ;3.PMS数据回填 [pms] -;PMS的用户名: ut001234 +;PMS的用户名,如: ut001234 PMS_USER = ;PMS的密码 @@ -303,13 +332,28 @@ CASE_FROM = caselib ;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 music = - [export_csv] ;导出的csv文件名称,默认 case_list.csv CSV_FILE = case_list.csv ;exportcsv 命令导出 case_list.csv 文件时配置的字段名,用例名称默认存在第一列,无需添加 CSV_HEARD = 用例级别,用例类型,测试级别,是否跳过 + +[log_cli] +;日志相关配置(不打印构造函数和魔法函数的功能说明) +;批量执行时,终端输出的日志级别 DEBUG/INFO/ERROR +LOG_LEVEL = DEBUG + +# ============= 自动输出日志的配置 ================ +;支持类名以 xxx 开头的,自动将函数说明打印为日志, 多个参数以逗号隔开 +CLASS_NAME_STARTSWITH = Assert + +;支持类名以 xxx 结尾的,自动将函数说明打印为日志,多个参数以逗号隔开 +CLASS_NAME_ENDSWITH = Widget + +;支持类名包含 xxx 的,自动将函数说明打印为日志,多个参数以逗号隔开 +CLASS_NAME_CONTAIN = ShortCut +# ============================================== ``` 配置完成之后,直接在命令行执行 `manage.py` 就好了。 @@ -325,12 +369,15 @@ youqu manage.py run 以下为 `youqu manage.py run` 提供的一些参数选项: ```coffeescript + -h, --help show this help message and exit -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 apps/autotest_deepin_music -k KEYWORDS, --keywords KEYWORDS 用例的关键词,支持and/or/not逻辑组合 -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 --rerun RERUN 失败重跑次数 + --record_failed_case RECORD_FAILED_CASE + 失败录屏从第几次失败开始录制视频 --clean {yes,} 清理环境 --report_formats REPORT_FORMATS 测试报告格式 @@ -366,6 +413,7 @@ youqu manage.py run --build_location BUILD_LOCATION 构建地区(写入json文件) --line LINE 执行的业务线(写入json文件) + --autostart AUTOSTART 用例执行程序注册到开机自启服务 ``` 在一些 CI 环境下使用命令行参数会更加方便: @@ -380,10 +428,20 @@ youqu manage.py run --app deepin-music --keywords "xxx" --tags "xxx" #### 2.2. 远程执行 +远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同; + +使用 `remote` 命令: + ```shell youqu manage.py remote ``` +##### 2.2.1. 远程多机器分布式异步执行 + +![](https://pic.imgdb.cn/item/64f6d3c0661c6c8e549f8ca5.png) + +多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下; + 远程执行同样通过配置文件 `setting/globalconfig.ini` 进行用例相关配置; 需要重点说一下远程执行时的测试机信息配置,在配置文件 `setting/remote.ini` 里面配置测试机的用户名、IP、密码。 @@ -411,7 +469,7 @@ user = uos ip = 10.8.11.xx ``` -有多少台机器就像这样挨着写就行了。 +有多少台机器就像这样参考上面的格式写就行了。 然后在命令行: @@ -426,38 +484,22 @@ youqu manage.py remote 以下为 `python3 manage.py remote` 提供的一些参数选项: ```coffeescript - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music + -h, --help show this help message and exit -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD 测试机密码(全局) -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 ``` +除了这些特有参数以外,它同样支持本地执行的所有参数; + 在命令行这样运行: ```shell @@ -466,8 +508,37 @@ youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" 所有用例执行完之后会在 `report` 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 `-e` : + +```shell +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e +``` + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: + +```shell +sudo systemctl restart ssh +sudo systemctl enable ssh +``` + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +##### 2.2.2. 远程多机器分布式异步负载均衡执行 + +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; + +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; + +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +![](https://pic.imgdb.cn/item/64f6d694661c6c8e54a1025b.png) + +使用方法和前面一样,只是需要增加一个参数: + +```shell +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no +``` + #### 2.3. PMS 数据回填 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 diff --git a/docs/框架功能介绍.md b/docs/框架功能介绍.md index 34659b5..9b2e5e8 100644 --- a/docs/框架功能介绍.md +++ b/docs/框架功能介绍.md @@ -1019,10 +1019,10 @@ self.dog.element_center("播放") - 脚本 ID:自动化用例脚本/函数 ID; - `PMS用例ID`:`PMS` 上对应的用例 ID(用例库 ID); - 默认使用用例库 ID,对于暂时没有使用用例库管理用例的项目,可以使用产品库用例 ID; - - 用例级别:对应 `PMS` 上用例级别,分别用 `L1、L2、L3、L4` 表示; -- 用例类型:`FUNC`(功能)、`API`(接口)、`BASELINE`(基线)、`PERF`(性能)、`STR`(压力)、`SEC`(安全)、`CTS`(兼容性) - +- 用例类型:`FUNC`(功能)、`PERF`(性能)、`STR`(压力)、`SEC`(安全)、`CTS`(兼容性)、`API`(接口)、`BASELINE`(基线-预留) +- 设备类型:`PPL`(依赖外设的用例)、`COL`(依赖主控机的用例) +- 用例来源:`BUG`(由 `Bug` 转的用例) - 上线对象:`CICD`,表示上线到 `CICD` 流水线的用例,后续可一键生成 `case_list.csv` 文件,用于导入到明道云 AT 用例列表中控制 `CICD` 跑测范围; - 测试级别:`C1 / C2 / C3 / C4`,具体定义参考[流水线使用指导](https://doc.uniontech.com/docs/9030MdRnyXtDxjqw); - 跳过原因:`skip-XXX`,用于控制用例是否执行; @@ -1031,9 +1031,9 @@ self.dog.element_center("播放") 示例: -| 脚本ID | PMS用例ID | 用例级别 | 用例类型 | 上线对象 | 测试级别 | 跳过原因 | 确认修复 | 废弃用例 | ... | -| :----: | :-------: | :------: | :------: | :------: | :------: | :------: | :-------: | :------------: | :--: | -| 001 | 679537 | L1 | FUNC | CICD | C1 | skip-XXX | fixed-XXX | removed-已废弃 | ... | +| 脚本ID | PMS用例ID | 用例级别 | 用例类型 | 设备类型 | 用例来源 | 上线对象 | 测试级别 | 跳过原因 | 确认修复 | 废弃用例 | ... | +| :----: | :-------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :-------: | -------------- | ---- | +| 679537 | 679537 | L1 | FUNC | PPL | | CICD | C1 | skip-XXX | fixed-XXX | removed-已废弃 | ... | ### 2、操作步骤 @@ -1041,7 +1041,7 @@ self.dog.element_center("播放") 例如: -- 相册的用例文件为 `test_album_xxx.py`,xxx 表示任意三位数字代表用例序号,此时 `csv` 文件名就应为 `album.csv`; +- 相册的用例文件为 `test_album_xxx.py`,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 `csv` 文件名就应为 `album.csv`; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 `csv` 文件,所有 `csv` 文件建议放在一个 `tags` 目录下。 @@ -1063,7 +1063,7 @@ self.dog.element_center("播放") | 脚本ID | ...(各种用例标签) | 跳过原因 | | :----: | :-----------------: | :-------------------: | -| 001 | ... | skip-受到某新需求影响 | +| 679537 | ... | skip-受到某新需求影响 | - 如果应用受到新需求影响需要跳过,则在此列备注具体的跳过原因。跳过的原因统一标签开头为 “`skip-XXX`”; - 用例执行时判断 `csv` 文件里面跳过原因列是否存在跳过标签,存在跳过标签则用例也不会被执行,最终的用例状态会被标签为 `SKIPED`。 @@ -1113,7 +1113,7 @@ def skipif_platform(args: str): | 用例ID | ...(各种用例标签) | 跳过原因 | 确认修复 | | :----: | :-----------------: | :-------------------: | :----------: | -| 001 | ... | skip-受到某新需求影响 | fixed-已修复 | +| 679537 | ... | skip-受到某新需求影响 | fixed-已修复 | 【同时标记了skip 和 fixed,但仍然想要跳过用例】 @@ -1157,7 +1157,7 @@ python3 manage.py run --ifixed yes ### 5、CSV文件格式 -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 `Excel` 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 ## 七、日志系统 @@ -1302,7 +1302,7 @@ YouQu 的环境依赖一直坚持 2 个原则: 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 [youqu-docs](https://github.com/mikigo/youqu-docs) 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; ### 2、安装 @@ -1370,7 +1370,21 @@ allure.deb # allure 报告查看工具 bash env_dev.sh ``` +### 4、虚拟化部署 +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 `$HOME/.local/share/virtualenvs/youqu-oHTM7l7G` 目录下 + +`youqu-oHTM7l7G` 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; + +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; + +当然,我们也提供了本机开发环境部署: + +```shell +bash env_dev.sh +``` + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:`python3 manage.py xxx` ## 九、失败录屏 diff --git a/pyproject.toml b/pyproject.toml index dd4652b..0622944 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "youqu" -version = "2.1.5" +version = "2.2.0" authors = [ { name = "mikigo", email = "huangmingqiang@uniontech.com" }, ]