支持环境变量依赖, 环境变量是字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。

This commit is contained in:
floraachy
2024-01-09 13:48:41 +08:00
parent fd47f6e3e0
commit 9ee23cbc11
3 changed files with 65 additions and 27 deletions
+39 -24
View File
@@ -32,13 +32,12 @@
* 支持测试数据分析,测试数据不符合规范有预警机制
* 支持通过用例数据动态配置pytest.mark 包括自定义标记,pytest.mark.skip以及pytest,mark.usefixtures
* 支持利用allure设置用例优先级,运行指定优先级的用例
* 测试数据隔离, 实现数据驱动
* 执行环境一键切换,解决多环境相互影响问题
* 自动生成用例代码: 测试人员在yaml/excel文件中填写好测试用例, 程序可以直接生成用例代码,纯小白也能使用
* 支持参数多类型提取:支持通过jsonpath从response.json提取数据;支持通过正则表达式从response.text提取数据;支持直接提取response本身的数据,例如response.cookies
* 使用Allure生成测试报告,并对测试报告进行了定制化修改,使得测试报告更加美观
* 日志模块: 采用loguru管理日志,可以输出更为优雅,简洁的日志
* 钉钉、企业微信通知: 支持多种通知场景,执行成功之后,可选择发送钉钉、或者企业微信、邮箱通知
* 执行环境一键切换,解决多环境相互影响问题
* 使用pipenv管理虚拟环境和依赖文件,提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作
* 支持将swagger.json接口文档转为YAML用例
@@ -138,28 +137,38 @@ pip install -r requirements.txt
### 5. 用例中相关字段的介绍
```yaml
case_common 公共参数
allure_epic用作于@allure.epic()装饰器中的内容。
allure_feature用作于@allure.feature()装饰器中的内容。
allure_story用作于@allure.story()装饰器中的内容。
case_common: # 公共参数
allure_epic: 用作于@allure.epic()装饰器中的内容。
allure_feature: 用作于@allure.feature()装饰器中的内容。
allure_story: 用作于@allure.story()装饰器中的内容。
case_markers: 给测试方法添加标记,支持自定义标记,skip, usefixtures。 格式是列表嵌套字符串或者字典。例如: # ['glcc', {'skip': '跳过执行该用例'}]
case_info: 具体的用例数据,是以列表的形式进行管理
common_dependence: # 放置公共依赖
setup:
interface:
sql:
env_vars:
teardown:
interface:
sql:
env_vars:
case_info: # 具体的用例数据,是以列表的形式进行管理
-
id用例id,注意需要全局唯一,方便后续用于用例接口依赖
title用例标题
id: 用例id,注意需要全局唯一,方便后续用于用例接口依赖
title: 用例标题
severity: 用例优先级,支持如下几种:NORMAL BLOCKERCRITICALMINORTRIVIAL 为空和错误都认为是NORMAL
run是否执行用例,为空或者True都会执行,为False则不执行。
url请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url+资源路径(url)。
method请求方式,例如:GET, POST, DELETE, PUT, PATCH等
headers请求头,注意如果在headers里面防止cookies,其值类型需要是字符串
cookies请求cookies,格式是:DICT CookieJar对象
request_type请求数据类型:params, json, file, data
payload请求参数
run: 是否执行用例,为空或者True都会执行,为False则不执行。
url: 请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url+资源路径(url)。
method: 请求方式,例如:GET, POST, DELETE, PUT, PATCH等
headers: 请求头,注意如果在headers里面防止cookies,其值类型需要是字符串
cookies: 请求cookies,格式是:DICT CookieJar对象
request_type: 请求数据类型:params, json, file, data
payload: 请求参数
files: 需要上传的文件的相对路径,会自动拼接files目录。 os.path.join(files, "这里传递的files参数值")
assert_response响应断言
assert_sql数据库断言
extract后置提取参数
case_dependence 用例依赖
assert_response: 响应断言
assert_sql: 数据库断言
extract: 后置提取参数
case_dependence: 用例依赖
```
### 6. 参数提取说明
@@ -301,16 +310,18 @@ case_info: 具体的用例数据,是以列表的形式进行管理
assert_type: contains
```
### 9. 用例依赖说明
目前用例依赖仅支持接口依赖数据库依赖后续会补充。
目前用例依赖仅支持接口依赖和环境变量依赖。数据库依赖后续会补充。
依赖的配置说明:
```
case_dependence: 用例依赖,为空时表示没有依赖:
case_dependence: 用例依赖,为空时表示没有依赖
setup: 前置依赖信息,为空时表示没有依赖
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
sql: 数据库查询语句,后续支持后将补充
sql: 数据库查询语句,后续支持后将补充
env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖
teardown: 后置依赖信息,为空时表示没有依赖
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
sql: 数据库查询语句,后续支持后将补充
env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖
```
参考示例:
@@ -318,10 +329,14 @@ case_dependence: 用例依赖,为空时表示没有依赖:
case_dependence:
setup:
interface: gitlink_login_oauth_token_01
env_vars:
repo_owner: ${env_login}
teardown:
interface:
- gitlink_projects_delete_project_01
sql:
env_vars:
env_page_content: ${generate_paragraph}
```
### 10. Excel用例单独说明
@@ -436,5 +451,5 @@ excel表单2名称是:示例模块
## 赞赏
如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激
如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激~<br/>
![打赏](https://www.gitlink.org.cn/api/attachments/437395)
+11 -1
View File
@@ -4,12 +4,13 @@
# @File : data_handle.py
# @Software: PyCharm
# @Desc:
import os.path
# 标准库导入
import random # 导包不能移除,否则random.choice这种就不能处理了
import json
import re, uuid
import copy
import os
import base64
# 第三方库导入
from loguru import logger
from string import Template
@@ -219,6 +220,15 @@ def list_to_str(target: list):
return ",".join(filtered_list)
def string_to_base64(input_string: str):
"""
将字符串转换为Base64格式
"""
base64_bytes = base64.b64encode(input_string.encode('utf-8'))
base64_string = base64_bytes.decode('utf-8')
return base64_string
# 声明data_handle方法,这样外部就可以直接import data_handle来使用了
data_handle = DataHandle().data_handle
+15 -2
View File
@@ -10,16 +10,17 @@ import allure
from loguru import logger
# 本地应用/模块导入
from utils.requests_utils.api_workflow import get_api_data, api_work_flow
from utils.data_utils.data_handle import data_handle
from config.path_config import INTERFACE_DIR
from config.global_vars import GLOBAL_VARS
def case_dependence_handle(case_dependence, source):
"""
处理用例依赖支持接口依赖SQL依赖关键字interface, sql
处理用例依赖支持接口依赖环境变量依赖SQL依赖关键字interface, sql, env_vars
"""
if case_dependence is None:
logger.debug(f"case_dependence为空,跳过用例依赖处理 --> case_dependence={case_dependence}")
logger.debug(f"跳过用例依赖处理 --> case_dependence={case_dependence}")
return
if case_dependence.get("interface"):
interfaces = case_dependence["interface"]
@@ -45,3 +46,15 @@ def case_dependence_handle(case_dependence, source):
if case_dependence.get("sql"):
logger.warning(f"暂时不支持依赖sql处理,后续更新")
pass
# 环境变量处理
if case_dependence.get("env_vars"):
if isinstance(case_dependence["env_vars"], dict):
for key, value in case_dependence["env_vars"].items():
new_value = data_handle(value, GLOBAL_VARS)
with allure.step(f"依赖环境变量 --> {key}={new_value}"):
GLOBAL_VARS.update({key: new_value})
else:
logger.warning(f"依赖环境变量格式错误,跳过依赖环境变量处理~ --> env_vars仅支持dict格式")
else:
logger.warning(f"依赖环境变量为空,跳过依赖环境变量处理~")