支持环境变量依赖, 环境变量是字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。
This commit is contained in:
@@ -32,13 +32,12 @@
|
|||||||
* 支持测试数据分析,测试数据不符合规范有预警机制
|
* 支持测试数据分析,测试数据不符合规范有预警机制
|
||||||
* 支持通过用例数据动态配置pytest.mark, 包括自定义标记,pytest.mark.skip以及pytest,mark.usefixtures
|
* 支持通过用例数据动态配置pytest.mark, 包括自定义标记,pytest.mark.skip以及pytest,mark.usefixtures
|
||||||
* 支持利用allure设置用例优先级,运行指定优先级的用例
|
* 支持利用allure设置用例优先级,运行指定优先级的用例
|
||||||
* 测试数据隔离, 实现数据驱动
|
* 执行环境一键切换,解决多环境相互影响问题
|
||||||
* 自动生成用例代码: 测试人员在yaml/excel文件中填写好测试用例, 程序可以直接生成用例代码,纯小白也能使用
|
* 自动生成用例代码: 测试人员在yaml/excel文件中填写好测试用例, 程序可以直接生成用例代码,纯小白也能使用
|
||||||
* 支持参数多类型提取:支持通过jsonpath从response.json提取数据;支持通过正则表达式从response.text提取数据;支持直接提取response本身的数据,例如response.cookies
|
* 支持参数多类型提取:支持通过jsonpath从response.json提取数据;支持通过正则表达式从response.text提取数据;支持直接提取response本身的数据,例如response.cookies
|
||||||
* 使用Allure生成测试报告,并对测试报告进行了定制化修改,使得测试报告更加美观
|
* 使用Allure生成测试报告,并对测试报告进行了定制化修改,使得测试报告更加美观
|
||||||
* 日志模块: 采用loguru管理日志,可以输出更为优雅,简洁的日志
|
* 日志模块: 采用loguru管理日志,可以输出更为优雅,简洁的日志
|
||||||
* 钉钉、企业微信通知: 支持多种通知场景,执行成功之后,可选择发送钉钉、或者企业微信、邮箱通知
|
* 钉钉、企业微信通知: 支持多种通知场景,执行成功之后,可选择发送钉钉、或者企业微信、邮箱通知
|
||||||
* 执行环境一键切换,解决多环境相互影响问题
|
|
||||||
* 使用pipenv管理虚拟环境和依赖文件,提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作
|
* 使用pipenv管理虚拟环境和依赖文件,提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作
|
||||||
* 支持将swagger.json接口文档转为YAML用例
|
* 支持将swagger.json接口文档转为YAML用例
|
||||||
|
|
||||||
@@ -138,28 +137,38 @@ pip install -r requirements.txt
|
|||||||
### 5. 用例中相关字段的介绍
|
### 5. 用例中相关字段的介绍
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
case_common :公共参数
|
case_common: # 公共参数
|
||||||
allure_epic:用作于@allure.epic()装饰器中的内容。
|
allure_epic: 用作于@allure.epic()装饰器中的内容。
|
||||||
allure_feature:用作于@allure.feature()装饰器中的内容。
|
allure_feature: 用作于@allure.feature()装饰器中的内容。
|
||||||
allure_story:用作于@allure.story()装饰器中的内容。
|
allure_story: 用作于@allure.story()装饰器中的内容。
|
||||||
case_markers: 给测试方法添加标记,支持自定义标记,skip, usefixtures。 格式是列表嵌套字符串或者字典。例如: # ['glcc', {'skip': '跳过执行该用例'}]
|
case_markers: 给测试方法添加标记,支持自定义标记,skip, usefixtures。 格式是列表嵌套字符串或者字典。例如: # ['glcc', {'skip': '跳过执行该用例'}]
|
||||||
case_info: 具体的用例数据,是以列表的形式进行管理
|
|
||||||
|
common_dependence: # 放置公共依赖
|
||||||
|
setup:
|
||||||
|
interface:
|
||||||
|
sql:
|
||||||
|
env_vars:
|
||||||
|
teardown:
|
||||||
|
interface:
|
||||||
|
sql:
|
||||||
|
env_vars:
|
||||||
|
case_info: # 具体的用例数据,是以列表的形式进行管理
|
||||||
-
|
-
|
||||||
id:用例id,注意需要全局唯一,方便后续用于用例接口依赖
|
id: 用例id,注意需要全局唯一,方便后续用于用例接口依赖
|
||||||
title:用例标题
|
title: 用例标题
|
||||||
severity: 用例优先级,支持如下几种:NORMAL, BLOCKER,CRITICAL,MINOR,TRIVIAL; 为空和错误都认为是NORMAL
|
severity: 用例优先级,支持如下几种:NORMAL, BLOCKER,CRITICAL,MINOR,TRIVIAL; 为空和错误都认为是NORMAL
|
||||||
run:是否执行用例,为空或者True都会执行,为False则不执行。
|
run: 是否执行用例,为空或者True都会执行,为False则不执行。
|
||||||
url:请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url)+资源路径(url)。
|
url: 请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_control.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url)+资源路径(url)。
|
||||||
method:请求方式,例如:GET, POST, DELETE, PUT, PATCH等
|
method: 请求方式,例如:GET, POST, DELETE, PUT, PATCH等
|
||||||
headers:请求头,注意如果在headers里面防止cookies,其值类型需要是字符串
|
headers: 请求头,注意如果在headers里面防止cookies,其值类型需要是字符串
|
||||||
cookies:请求cookies,格式是:DICT, CookieJar对象
|
cookies: 请求cookies,格式是:DICT, CookieJar对象
|
||||||
request_type:请求数据类型:params, json, file, data
|
request_type: 请求数据类型:params, json, file, data
|
||||||
payload:请求参数
|
payload: 请求参数
|
||||||
files: 需要上传的文件的相对路径,会自动拼接files目录。 os.path.join(files, "这里传递的files参数值")
|
files: 需要上传的文件的相对路径,会自动拼接files目录。 os.path.join(files, "这里传递的files参数值")
|
||||||
assert_response:响应断言
|
assert_response: 响应断言
|
||||||
assert_sql:数据库断言
|
assert_sql: 数据库断言
|
||||||
extract:后置提取参数
|
extract: 后置提取参数
|
||||||
case_dependence: 用例依赖
|
case_dependence: 用例依赖
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. 参数提取说明
|
### 6. 参数提取说明
|
||||||
@@ -301,16 +310,18 @@ case_info: 具体的用例数据,是以列表的形式进行管理
|
|||||||
assert_type: contains
|
assert_type: contains
|
||||||
```
|
```
|
||||||
### 9. 用例依赖说明
|
### 9. 用例依赖说明
|
||||||
目前用例依赖仅支持接口依赖,数据库依赖后续会补充。
|
目前用例依赖仅支持接口依赖和环境变量依赖。数据库依赖后续会补充。
|
||||||
依赖的配置说明:
|
依赖的配置说明:
|
||||||
```
|
```
|
||||||
case_dependence: 用例依赖,为空时表示没有依赖:
|
case_dependence: 用例依赖,为空时表示没有依赖
|
||||||
setup: 前置依赖信息,为空时表示没有依赖
|
setup: 前置依赖信息,为空时表示没有依赖
|
||||||
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
|
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
|
||||||
sql: 数据库查询语句,后续支持后将补充
|
sql: 数据库查询语句,后续支持后将补充
|
||||||
|
env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖
|
||||||
teardown: 后置依赖信息,为空时表示没有依赖
|
teardown: 后置依赖信息,为空时表示没有依赖
|
||||||
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
|
interface: 用例依赖的接口id,支持str和list格式。接口id指的是每一个YAML/EXCEL用例中的ID
|
||||||
sql: 数据库查询语句,后续支持后将补充
|
sql: 数据库查询语句,后续支持后将补充
|
||||||
|
env_vars: 环境变量依赖信息, 字典格式,key为环境变量名称,value为环境变量值。value可以为常量,也可以为data_handle内支持的方法,也可以是全局变量。为空时表示没有依赖
|
||||||
```
|
```
|
||||||
|
|
||||||
参考示例:
|
参考示例:
|
||||||
@@ -318,10 +329,14 @@ case_dependence: 用例依赖,为空时表示没有依赖:
|
|||||||
case_dependence:
|
case_dependence:
|
||||||
setup:
|
setup:
|
||||||
interface: gitlink_login_oauth_token_01
|
interface: gitlink_login_oauth_token_01
|
||||||
|
env_vars:
|
||||||
|
repo_owner: ${env_login}
|
||||||
teardown:
|
teardown:
|
||||||
interface:
|
interface:
|
||||||
- gitlink_projects_delete_project_01
|
- gitlink_projects_delete_project_01
|
||||||
sql:
|
sql:
|
||||||
|
env_vars:
|
||||||
|
env_page_content: ${generate_paragraph}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 10. Excel用例单独说明
|
### 10. Excel用例单独说明
|
||||||
@@ -436,5 +451,5 @@ excel表单2名称是:示例模块
|
|||||||
|
|
||||||
|
|
||||||
## 赞赏
|
## 赞赏
|
||||||
如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激
|
如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激~<br/>
|
||||||

|

|
||||||
@@ -4,12 +4,13 @@
|
|||||||
# @File : data_handle.py
|
# @File : data_handle.py
|
||||||
# @Software: PyCharm
|
# @Software: PyCharm
|
||||||
# @Desc:
|
# @Desc:
|
||||||
import os.path
|
|
||||||
# 标准库导入
|
# 标准库导入
|
||||||
import random # 导包不能移除,否则random.choice这种就不能处理了
|
import random # 导包不能移除,否则random.choice这种就不能处理了
|
||||||
import json
|
import json
|
||||||
import re, uuid
|
import re, uuid
|
||||||
import copy
|
import copy
|
||||||
|
import os
|
||||||
|
import base64
|
||||||
# 第三方库导入
|
# 第三方库导入
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from string import Template
|
from string import Template
|
||||||
@@ -219,6 +220,15 @@ def list_to_str(target: list):
|
|||||||
return ",".join(filtered_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方法,这样外部就可以直接import data_handle来使用了
|
||||||
data_handle = DataHandle().data_handle
|
data_handle = DataHandle().data_handle
|
||||||
|
|
||||||
|
|||||||
@@ -10,16 +10,17 @@ import allure
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
# 本地应用/模块导入
|
# 本地应用/模块导入
|
||||||
from utils.requests_utils.api_workflow import get_api_data, api_work_flow
|
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.path_config import INTERFACE_DIR
|
||||||
from config.global_vars import GLOBAL_VARS
|
from config.global_vars import GLOBAL_VARS
|
||||||
|
|
||||||
|
|
||||||
def case_dependence_handle(case_dependence, source):
|
def case_dependence_handle(case_dependence, source):
|
||||||
"""
|
"""
|
||||||
处理用例依赖,支持接口依赖和SQL依赖。关键字:interface, sql
|
处理用例依赖,支持接口依赖,环境变量依赖,SQL依赖。关键字:interface, sql, env_vars
|
||||||
"""
|
"""
|
||||||
if case_dependence is None:
|
if case_dependence is None:
|
||||||
logger.debug(f"case_dependence为空,跳过用例依赖处理 --> case_dependence={case_dependence}")
|
logger.debug(f"跳过用例依赖处理 --> case_dependence={case_dependence}")
|
||||||
return
|
return
|
||||||
if case_dependence.get("interface"):
|
if case_dependence.get("interface"):
|
||||||
interfaces = case_dependence["interface"]
|
interfaces = case_dependence["interface"]
|
||||||
@@ -45,3 +46,15 @@ def case_dependence_handle(case_dependence, source):
|
|||||||
if case_dependence.get("sql"):
|
if case_dependence.get("sql"):
|
||||||
logger.warning(f"暂时不支持依赖sql处理,后续更新")
|
logger.warning(f"暂时不支持依赖sql处理,后续更新")
|
||||||
pass
|
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"依赖环境变量为空,跳过依赖环境变量处理~")
|
||||||
|
|||||||
Reference in New Issue
Block a user