# web_pytest_yaml **Repository Path**: huntergutt/web_pytest_yaml ## Basic Information - **Project Name**: web_pytest_yaml - **Description**: 基于【pytest+yaml+allure+钉钉通知】设计的web自动化测试框架。用例直接在 yaml 文件中维护,无需编写业务代码,支持生成 allure 报告,并发送到钉钉通知。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2024-10-13 - **Last Updated**: 2025-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web_pytest_yaml ## 1 介绍 web_pytest_yaml是采用POM和关键字设计模式,基于pytest+yaml+allure+钉钉通知实现的web自动化测试框架。本框架支持用例sql 数据库前置/后置、多种断言方式,用例直接在 yaml 文件中维护,无需编写业务代码,支持生成 allure 报告,并发送到钉钉通知。 ## 2 实现功能 1. 测试数据隔离:只需要编写 yaml 测试用例文件即可,无需编写业务代码 2. 支持根据用例等级执行回归测试、冒烟测试 3. 支持配置全局变量 4. 支持单条测试用例sql前置、后置,支持 2 个或者以上的mysql数据库同时使用 5. 支持多场景断言方式 6. 支持多种浏览器类型(Chrome、Edge、Firefox)、浏览器无头模式 7. 支持测试过程中登录状态的存储共用 8. 支持统计单个接口运行时长以及执行所有用例执行时长 9. 支持钉钉通知,执行成功后,可选择发送钉钉通知 10. 支持日志模块,打印每个接口的日志信息,可设置 log日志输出级别,决定需要打印的日志 11. 支持生成 allure 报告,从yaml用例中动态获取 feature、story、title、severity等 12. 支持用例测试运行前清除上次测试生成的脏文件数据 ## 3 框架结构 ![image-20241014190728702](image/image-20241014190728702.png) - config:全局配置文件,数据库地址、文件地址等 - data:存放测试数据,包括测试用例、测试数据文件等 - key_word:关键字封装,包括元素定位、断言等 - logs:存放测试日志文件 - report:生成 allure 测试报告路径 - testcase:存放测试用例文件目录 - utils:工具类封装,包括日志、数据库操作、钉钉通知、文件操作(yaml 文件读写,删除)等 - venv:框架使用的虚拟环境 - conftest 文件:测试夹具,钩子函数生成测试报告 - environment.xml:allure 报告首页环境显示内容配置 - pytest.ini:pytest 框架全局规范约定 - run.py:pytest 框架统一用例执行入口 ## 4 安装教程 拉取代码后,添加虚拟环境,执行:pip install -r requirements.txt **注意**:高版本allure显示的与运行的用例数量不对等。推荐使用 allure-pytest==2.12.0;pytest==7.3.1 ## 5 框架使用 ### 5.1 编写测试用例 用户编写case时只需要写一个地方: data/yaml/ 文件下 ![image-20241014191502784](image/image-20241014191502784.png) - download:下载文件用例放置的路径 - file:上传文件接口测试数据 - yaml:case所需数据 ### 5.2 登录信息维护 login_pre 文件中存放前置登录数据(用例依赖登录操作) ### 5.3 全局配置文件维护 - **config/config.ini** - 测试 host 地址 - 数据库配置信息 - **config/setting.py** - 文件路径: log 输出路径、测试数据文件目录等 - 回归测试/冒烟测试 epic 【allure 报告使用】 - 设置浏览器类型、是否无头模式 - log 日志输出级别 - 隐式等待时间设置 - 钉钉机器人配置、是否开启发送钉钉消息 ### 5.4 allure 报告展示 ![image-20241014224244585](image/image-20241014224244585.png) 每个执行步骤都截图保存: ![image-20241014232301451](image/image-20241014232301451.png) ## 6 编写 yaml 测试用例 注意:yaml 文件,是通过缩进表示层级关系的,在编写 yaml 测试用例文件时需要注意 ### 6.1 yaml 测试用例结构 生成 allure 报告中的 feature、story(api_name)、title、severity(rank) 数据从测试用例文件中动态获取,epic从config/setting.py 文件中获取。 用例使用说明: ```yaml - baseInfo: feature: # 模块名称,缺少字段或空值默认“未定义模块名称” story: # 子模块名称,缺少字段或空值默认“未定义子模块名称” testCase: - case_name: # 用例名称,缺少字段或空值默认“未定义用例名称” rank: # 选填 默认P3,P1-P5生效,对应严重等级 blocker、critical、normal、minor、trivial setup: # 选填 用例前置,若需要,下面的 type 和 sqls为必填 database: # 选填 数据库名,配置中可设置默认 type: # 必填 前置方式,db 通过操作数据库前置操作 sqls: # 必填 多条sql语句,必须以;和换行 结尾 INSERT INTO ***; INSERT INTO ***; steps: # 操作步骤 - 打开测试页面: # 具体步骤 method: open # 关键字,从 key_word/keywords.py 文件获取 data: /SmartP&ID/fileSystem - 鼠标双击: method: mouse_double_click by: xpath # 元素定位方式 value: //li/p[text()="admin"]/parent::li/div # 元素定位表达式 teardown: # 选填 用例后置,若需要,下面的 type 和 sqls为必填 database: # 选填 数据库名,配置中可设置默认 type: # 必填 前置方式,db 通过操作数据库前置操作 sqls: # 必填 多条sql语句必须以;和换行 结尾 DELETE FROM ***; DELETE FROM ***; ``` ### 6.2 yaml 测试用例使用解析 #### 6.2.1 case 中关键字维护 case 操作步骤使用的关键字,需要从 key_word/keywords.py 文件获取,可根据项目需要补充关键字 其中元素定位方式by有: "id"、"xpath"、"link text"、"partial link text"、 "name"、"tag name"、"class name" 、 "css selector" #### 6.2.2 case中断言处理 case中支持多种断言,封装在 key_word/keywords.py 文件中,使用方式如下: ```yaml steps: - 断言-判断当前页面是否包含"创建文件夹成功!"提示信息: # 具体步骤 method: assert_text # 关键字 by: xpath # 元素定位方式 value: //p[text()="创建文件夹成功!"] # 元素定位表达式 expect: 创建文件夹成功! # 期望结果 ``` #### 6.2.3 case中实现用例setup与teardown 框架中支持sql实现setup与teardown,通过接口请求方式后续实现。框架中支持在项目开始时执行前置,在项目结束后后置,可根据需要自行扩展。 支持每条用例sql前置与后置,方便用例维护。比如添加用例在测试完成后,需要进行用例后置操作删除添加产生的脏数据。 **使用方式:** - 数据库名从 config/config.ini 文件中获取,配置了数据库名后,在sql语句中不需要写数据库名字 - 本框架演示了配置了2个数据库实现方式,其中一个用的比较多的,可以设置成默认方式,本框架中目前只是配置在了utils/mysql_tool/connect_mysql.py,可根据需要设置成全局变量,若只需要一个数据库,则根据需要进行取舍删除不必要的数据。 代码如下: ```yaml - baseInfo: testCase: - case_name: setup: # 选填 用例前置,若需要,下面的 type 和 sqls为必填 database: # 选填 数据库名,配置中可设置默认 type: db # 必填 前置方式,db 通过操作数据库前置操作,不填写不进行前置操作 sqls: # 必填 多条sql语句,必须以;和换行 结尾 INSERT INTO ***; INSERT INTO ***; teardown: # 选填 用例后置,若需要,下面的 type 和 sqls为必填 database: # 选填 数据库名,配置中可设置默认 type: db # 必填 前置方式,db 通过操作数据库前置操作,不填写不进行后置操作 sqls: # 必填 多条sql语句必须以;和换行 结尾 DELETE FROM ***; DELETE FROM ***; ``` allure报告中查看 teardown 信息 ![image-20241014230436424](image/image-20241014230436424.png) #### 6.2.4 动态设置allure报告信息 暂时设置了epic、 feature、story(api_name)、title(case_name)、severity(rank)几种,其他的可根据需求进行扩展添加。 ![image-20241014230727561](image/image-20241014230727561.png) ##### 1、epic (1)config/setting.py 文件中设置epic ```python test_epic = "xxx 系统 web自动化回归测试" smoke_epic = "xxx 系统 web自动化冒烟测试" ``` (2)testcase中使用: testcase/test_cases/test_cases.py ```python @allure.epic(test_epic) ``` testcase/test_smokecases/test_smokecases.py ```python @allure.epic(smoke_epic) ``` ##### 2、模块名称 feature ```yaml - baseInfo: feature: # 模块名称,缺少字段或空值默认“未定义模块名称” ``` ##### 3、故事名称 story ```YAML - baseInfo: story: # 子模块名称,缺少字段或空值默认“未定义子模块名称” ``` ##### 4、用例标题 title 对应yaml文件中 case_name ```yaml - baseInfo: testCase: - case_name: # 用例名称,缺少字段或空值默认“未定义用例名称” ``` ##### 5、用例等级 severity 对应yaml文件中 rank - P1-P5生效,对应allure报告中严重等级 blocker、critical、normal、minor、trivial - 不填或者除了P1-P5都默认为P3 ```yaml - baseInfo: testCase: - case_name: rank: P1 ``` ## 7 钉钉通知 在 config/setting.py 文件中设置是否开启钉钉通知, 需要设置钉钉群机器人secret与webhook ```python # 钉钉机器人 secret = "SECeb733915c5527442a852e09abc546aa76612a8a78b023bd6596cf62e7ca88445" webhook = "https://oapi.dingtalk.com/robot/send?access_token=72badf9a799f3bccda0cd94ecce0bc2ee85daa3544a1ad03062629aadb5f3a41" # 是否发送钉钉消息 dd_msg = True ``` 推送到钉钉模板在conftest.py 文件中设置 ## 8 用例执行范围 在pytest.ini 文件中进行设置: 本框架中默认设置为testcase/test_cases/test_cases.py下的所有用例可作为回归测试;冒烟测试【执行P1、P2级用例】执行 testcase/test_smokecases/test_smokecases.py 文件。 若有其他需求可自行需改框架,若需要指定,可从获取用例后进行用例筛选,获取用例封装在 utils/read_files_tools/readyaml.py中。 ## 9 测试过程中登录状态共用 在testcase/conftest.py文件中可设置,是每条用例都需要登录,还是整个项目只需要一次登录 注:当用例执行不需要登录状态,可重新封装未登录状态的前置应用(本框架不做展示) ## 附:case功能使用演示 只需要在data/yaml用例中维护,不需要在testcase维护 使用示例: ```yaml - baseInfo: feature: 文件管理 story: 文件夹 testCase: - case_name: 新建文件夹:成功 description: rank: P1 steps: - 打开测试页面: method: open data: /SmartP&ID/fileSystem - 双击【admin】文件夹: method: mouse_double_click by: xpath value: //li/p[text()="admin"]/parent::li/div - 点击【新建文件夹】: method: mouse_click by: xpath value: //button/span[text()="新建文件夹"] - 输入文件夹名: method: input by: xpath value: //input[@maxlength="30"] data: 2024 - 勾选【确定】: method: click by: class name value: file-name-icon-pigeon - 断言-判断当前页面是否包含"创建文件夹成功!"提示信息: method: assert_text by: xpath value: //p[text()="创建文件夹成功!"] expect: 创建文件夹成功! teardown: type: db database: v17 sqls: DELETE FROM `pidcad_file` WHERE `name`='2024'; ``` #### 加作者微信(记得备注:web_pytest_yaml) ![image-20241013222927827](image/image-20241013222927827.png)