增加测试框架对allure测试报告的支持,已完成初版,能用户通过-report参数指定生成的是pytest-html报告还是allure报告
This commit is contained in:
+13
-17
@@ -1,45 +1,41 @@
|
||||
import pytest
|
||||
from case_utils.assert_handle import assert_response, assert_sql
|
||||
from common_utils.base_request import BaseRequest
|
||||
from loguru import logger
|
||||
from case_utils.request_data_handle import RequestPreDataHandle, after_extract, case_data_replace,eval_data_process
|
||||
from case_utils.request_data_handle import RequestPreDataHandle, RequestHandle
|
||||
from pytest_html import extras # 往pytest-html报告中填写额外的内容
|
||||
from common_utils.func_handle import add_docstring
|
||||
from case_utils.allure_handle import allure_title
|
||||
import allure
|
||||
|
||||
# 用例数据
|
||||
cases = ${case_data}
|
||||
|
||||
@pytest.fixture(params=${case_data})
|
||||
def case(request):
|
||||
"""
|
||||
收集用例数据
|
||||
"""
|
||||
return request.param
|
||||
|
||||
@allure.story(f'{cases["case_common"]["allure_story"]}')
|
||||
@pytest.mark.${func_title}
|
||||
@pytest.mark.auto
|
||||
@pytest.mark.parametrize("case", cases.get("case_info"))
|
||||
def ${func_title}_auto(case, extra, request):
|
||||
logger.info("-----------------------------START-开始执行用例-----------------------------")
|
||||
logger.debug(f"当前执行的用例数据:{case}")
|
||||
try:
|
||||
# 获取命令行参数,判断当前处于哪个环境
|
||||
# 获取命令行参数,判断当前处于哪个环境
|
||||
env = request.config.getoption("--env")
|
||||
# 给当前测试方法添加文档注释
|
||||
add_docstring(case.get("title", ""))(${func_title}_auto)
|
||||
# 添加用例标题作为allure中显示的用例标题
|
||||
allure_title(case.get("title", ""))
|
||||
if case.get("run", None):
|
||||
# 处理请求前的用例数据
|
||||
# 处理请求前的用例数据
|
||||
case_data = RequestPreDataHandle(case).request_data_handle()
|
||||
# 将用例数据显示在pytest-html报告中
|
||||
extra.append(extras.text(str(case_data), name="用例数据"))
|
||||
# 发送请求
|
||||
response = BaseRequest.send_request(case_data)
|
||||
response = RequestHandle(case_data).send_request_extract()
|
||||
# 将响应数据显示在pytest-html报告中
|
||||
extra.append(extras.text(str(response.text), name="响应数据"))
|
||||
# 请求后,提取后置参数作为全局变量
|
||||
after_extract(response, case_data["extract"])
|
||||
# 从全局变量中获取最新值,替换数据库断言中的参数
|
||||
case_data["assert_sql"] = eval_data_process(case_data_replace(case_data["assert_sql"]))
|
||||
# 进行响应断言
|
||||
assert_response(response, case_data["assert_response"])
|
||||
# 进行数据库断言
|
||||
# 进行数据库断言
|
||||
assert_sql(env, case_data["assert_sql"])
|
||||
else:
|
||||
reason = f"标记了该用例为false,不执行\\n"
|
||||
|
||||
+30
-1
@@ -6,7 +6,7 @@
|
||||
# @Software: PyCharm
|
||||
# @Desc: 全局变量
|
||||
|
||||
from enum import Enum
|
||||
from enum import Enum, unique # python 3.x版本才能使用
|
||||
|
||||
# 定义一个全局变量,作用于接口关联数据存储
|
||||
GLOBAL_VARS = {}
|
||||
@@ -29,3 +29,32 @@ class NotificationType(Enum):
|
||||
EMAIL = 3
|
||||
ALL = 4
|
||||
|
||||
|
||||
@unique # 枚举类装饰器,确保只有一个名称绑定到任何一个值。
|
||||
class AllureAttachmentType(Enum):
|
||||
"""
|
||||
allure 报告的文件类型枚举
|
||||
"""
|
||||
TEXT = "txt"
|
||||
CSV = "csv"
|
||||
TSV = "tsv"
|
||||
URI_LIST = "uri"
|
||||
|
||||
HTML = "html"
|
||||
XML = "xml"
|
||||
JSON = "json"
|
||||
YAML = "yaml"
|
||||
PCAP = "pcap"
|
||||
|
||||
PNG = "png"
|
||||
JPG = "jpg"
|
||||
SVG = "svg"
|
||||
GIF = "gif"
|
||||
BMP = "bmp"
|
||||
TIFF = "tiff"
|
||||
|
||||
MP4 = "mp4"
|
||||
OGG = "ogg"
|
||||
WEBM = "webm"
|
||||
|
||||
PDF = "pdf"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 563.24 108.04"><defs><style>.cls-1,.cls-2{fill-rule:evenodd;}.cls-1{fill:url(#未命名的渐变_12);}.cls-2{fill:#fffdfd;}</style><linearGradient id="未命名的渐变_12" y1="54.02" x2="169.98" y2="54.02" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6dffff"/><stop offset="1" stop-color="#0080ff"/></linearGradient></defs><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M125.24,33.3l-4.56-6.22-4,2V79L120,80.75V75.21l5.24,8.48,4.25.66V23.69l-4.25,1.64Zm-94,51.05,9.48-4.74V28.43l-9.48-4.74ZM96.3,90.81l8.53,5.08V9.48L96.3,14.56ZM84.06,0H72.21V108H90.35V97.32H84.06ZM45.66,22.39l4.69,1.73V95.79l8.57-4.43V27.83l4.59,1.65V19.81L45.66,9.48ZM0,80.68,20.61,70.24V50.58l-9.79-1v6.91h3.92v6.67L8,66.21V45l12.65,2.29V39.22L0,32.4Zm152.6-24.4L167.79,32.4l-11.33,1.23-7.54,10V37l-8.33,2V74.9l8.33,1.74V69.76L157,80l13,.65Z"/><path class="cls-2" d="M252.36,18.32,256,12.18H197.73V59.31h36.53l5-5v5h16.53V30.37H226.9V36.6h12.32V53.16H214.67V18.32Zm34.47-6.23h-16V22.26h16Zm0,14h-16V59.23h16ZM336.5,59.23,340,53.49h-13.8V32.1h10.49l4-5.91H326.17V15.37H310.22V26.19H301.7V32.1h8.52V59.23Zm35.79-47h-16.7V59.31H399.4l3.47-6.15H372.29ZM433.7,26.11h-16V59.23h16Zm0-14h-16V22.26h16Zm14.87,47h15.95V31.93h10l5.54-5.9H448.57Zm31.49,0h15.79V26H480.06Zm46.62-17.54,17.11,17.71h17.85L543.7,40.13l18.27-14H542.22l-15.54,11.4V12.09H510.73V59.23h15.95ZM283,86.7H278.8a26.62,26.62,0,0,0,1.09-3.9c.2-1.07.31-1.64.33-1.72V78.19h6.16V75.07H274.75v3.12h2.67v2.53c0,.22-.12.7-.27,1.45a24.55,24.55,0,0,1-.75,2.69c-.34,1-.78,2.16-1.31,3.36a20.9,20.9,0,0,1-2,3.5l2.17,1.94c.21-.29.41-.58.58-.87s.36-.58.55-.87v12.66h6.25a2.94,2.94,0,0,0,2.28-1,3.63,3.63,0,0,0,.93-2.53V86.14H283ZM283,101c0,.29-.14.44-.42.44h-3.42V89.82H283Zm19.31-18.48h-1.53l2.56-3.81V76.29H292.56a12.05,12.05,0,0,0,.64-1.3l-2.49-1.39a21.16,21.16,0,0,1-1.31,2.49c-.5.82-1,1.55-1.41,2.18s-1,1.36-1.58,2.18l2.06,2s.29-.35.73-.91a24.75,24.75,0,0,0,1.51-2.17h8.71l-2.09,3.12h-9.71V93.69a27.82,27.82,0,0,1-.23,3.51c-.16,1.18-.33,2.24-.52,3.19s-.44,2-.74,3.24l1.31.48,1.35.47s0-.22.15-.57.2-.82.33-1.39.27-1.22.41-2,.27-1.53.39-2.38h4.66v5.5h2.81v-5.5h4.8v2.57q0,.48-.42.48h-1.57v3.08H302a2.91,2.91,0,0,0,2.27-1,3.63,3.63,0,0,0,.93-2.53V82h-2.81Zm-7.61,12.63h-4.34c0-.27,0-.51,0-.75s0-.48,0-.74V91.57h4.3Zm0-6.73h-4.3V85.67h4.3Zm7.61,6.73h-4.8v-3.6h4.8Zm0-6.73h-4.8V85.67h4.8Zm21-.55,7.53,3.4,1-2.89L324.35,85Zm11.84-3.21-7.54-3.56L326.52,84l7.53,3.52Zm1.17-11.24-2.49,1.43.89,1.86h-14v6.84h2.81V79.85h24.89v3.56h2.81V76.17h-2.81v.56H337.86Zm2.84,15.24,0-.2V81.4H336.4V88a11.64,11.64,0,0,1-.8,2,17.29,17.29,0,0,1-1.08,1.86H320.65V95h11.13a25.26,25.26,0,0,1-3.7,2.81,39.35,39.35,0,0,1-3.54,2c-1.08.53-2,.93-2.68,1.21l-1.1.42.39,1.46.39,1.5.85-.31c.5-.19,1.13-.44,1.9-.77s1.65-.76,2.62-1.27A34.34,34.34,0,0,0,333,97.9,23.67,23.67,0,0,0,335.85,95H339l-1.06,2.17,11.95,7.24,1.35-2.73L340.17,95h11.41V91.88h-13.7A15.51,15.51,0,0,0,339.17,88.68Zm94.69-10.77h5V74.79H411.28v3.12h5.65v7.53c0,.29,0,.56,0,.83s0,.54-.05.82h-7.72v3.13h7.26a28.26,28.26,0,0,1-1.5,4.69c-.61,1.46-1.21,2.74-1.79,3.84a27.5,27.5,0,0,1-1.53,2.59l-.69,1,2.17,2c0-.08.33-.5.85-1.25a32.15,32.15,0,0,0,1.78-3,47.5,47.5,0,0,0,2-4.41,28.4,28.4,0,0,0,1.54-5.42h11.81v14.09h2.81V90.22H441V87.09h-7.14Zm-2.81,9.18H419.67c0-.28,0-.56.05-.82s0-.54,0-.83V77.91h11.31Zm53.36,5.6a3.67,3.67,0,0,0,.93-2.52V79.7h-2.81v.71h-5.94l.78-1.43L475,77.32l-1.7,3.09h-4.38V93.74h6.79v7.32a.44.44,0,0,1-.12.32.41.41,0,0,1-.3.12h-2.07v3.12h2.1a2.93,2.93,0,0,0,2.28-1.05,3.68,3.68,0,0,0,.92-2.51V93.74h3.63A2.9,2.9,0,0,0,484.41,92.69Zm-12.69-9.16h10.81v2.14H471.72Zm0,7.09V88.8h10.81v1.38c0,.29-.13.44-.39.44Zm-9-11.12-5.23-5.19-1.85,2.3,5.2,5.18Zm7.79,15a23.78,23.78,0,0,1-.79,2.69c-.28.79-.64,1.7-1.08,2.71A25.81,25.81,0,0,1,467,103l2.35,1.74a26.83,26.83,0,0,0,1.79-3.42c.49-1.12.89-2.13,1.2-3s.53-1.6.67-2.16a9.24,9.24,0,0,0,.21-.91Zm-10.35-2.33-4.84,11,2.49,1.34,4.87-11Zm20.37,3.28,3.34,9,2.6-1.18-3.38-9Zm-13.26-18.2h19.17V74.12h-22V92.51a10.92,10.92,0,0,1-.41,2.83,30.11,30.11,0,0,1-1,3c-.38,1-.77,1.91-1.16,2.75s-.71,1.49-.94,1.94l2.42,1.58s.13-.27.33-.65.45-.89.73-1.52.6-1.36.92-2.16.63-1.65.92-2.53a23.12,23.12,0,0,0,.7-2.69,13.44,13.44,0,0,0,.27-2.6ZM460.81,90.1l1.88-2.29-5.23-5.19-1.85,2.3Zm-82.59-3.7a5.5,5.5,0,1,0,5.53,5.5A5.52,5.52,0,0,0,378.22,86.4ZM198.36,90.8h57.15V88.6H198.36Zm307.73-2.2v2.2h57.15V88.6Z"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
+14
-3
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# @Version: Python 3.9
|
||||
# @Time : 2023/1/31 17:27
|
||||
# @Time : 2023/5/16 11:12
|
||||
# @Author : chenyinhua
|
||||
# @File : project_path.py
|
||||
# @Software: PyCharm
|
||||
# @Desc: 项目相关路径
|
||||
# @Desc:
|
||||
|
||||
import os
|
||||
|
||||
# ------------------------------------ 项目路径 ----------------------------------------------------#
|
||||
@@ -43,6 +43,17 @@ MANUAL_CASE_DIR = os.path.join(CASE_DIR, "test_manual_case")
|
||||
if not os.path.exists(MANUAL_CASE_DIR):
|
||||
os.mkdir(MANUAL_CASE_DIR)
|
||||
|
||||
# 测试用例方法模板路径
|
||||
CASE_TEMPLATE_DIR = os.path.join(CONF_DIR, "case_template.txt")
|
||||
|
||||
# 自动生成测试用例模块
|
||||
AUTO_CASE_DIR = os.path.join(CASE_DIR, "test_auto_case")
|
||||
|
||||
# 第三方库目录
|
||||
LIB_DIR = os.path.join(BASE_DIR, "lib")
|
||||
|
||||
# Allure报告,测试结果集目录
|
||||
ALLURE_RESULTS_DIR = os.path.join(REPORT_DIR, "allure_results")
|
||||
# Allure报告,HTML测试报告目录
|
||||
ALLURE_HTML_DIR = os.path.join(REPORT_DIR, "allure_html")
|
||||
|
||||
|
||||
+75
-8
@@ -11,14 +11,17 @@
|
||||
CASE_FILE_TYPE = 0
|
||||
|
||||
# 0表示默认不发送任何通知, 1代表钉钉通知,2代表企业微信通知, 3代表邮件通知, 4代表所有途径都发送通知
|
||||
SEND_RESULT_TYPE = 3
|
||||
SEND_RESULT_TYPE = 4
|
||||
|
||||
# 测试报告的定制化信息展示
|
||||
REPORT_TITLE = "自动化测试报告"
|
||||
REPORT_NAME = f"apiautotest-report-"
|
||||
PROJECT_NAME = "GitLink 确实开源"
|
||||
TESTER = "测试人员:陈银花"
|
||||
DEPARTMENT = "所属部门: 开源中心"
|
||||
# 这个需要写入到allure测试结果集的environment.properties(不支持中文)
|
||||
ENV_INFO = {
|
||||
"report_title": "Auto Test Report",
|
||||
"report_name": "autotestreport_",
|
||||
"project_name": "GitLink",
|
||||
"tester": "floraachy",
|
||||
"department": "OpenSource"
|
||||
}
|
||||
|
||||
# 指定日志收集级别
|
||||
LOG_LEVEL = "INFO"
|
||||
@@ -58,18 +61,83 @@ email = {
|
||||
"host": "smtp.qq.com",
|
||||
"to": ["******", "******"] # 收件人邮箱
|
||||
}
|
||||
# ------------------------------------ 邮件通知内容 ----------------------------------------------------#
|
||||
email_subject = f"{ENV_INFO.get('project_name', None)} 接口自动化报告"
|
||||
email_content = """
|
||||
各位同事, 大家好:
|
||||
|
||||
自动化用例于 <strong>${start_time} </strong> 开始运行,运行时长:<strong>${run_time} s</strong>, 目前已执行完成。
|
||||
---------------------------------------------------------------------------------------------------------------
|
||||
测试人:<strong> ${tester} </strong>
|
||||
所属部门:<strong> ${department} </strong>
|
||||
项目环境:<strong> ${project_env} </strong>
|
||||
---------------------------------------------------------------------------------------------------------------
|
||||
执行结果如下:
|
||||
用例运行总数:<strong> ${total} 个</strong>
|
||||
通过用例个数(passed): <strong><font color="green" >${passed} 个</font></strong>
|
||||
失败用例个数(failed): <strong><font color="red" >${failed} 个</font></strong>
|
||||
异常用例个数(error): <strong><font color="orange" >${broken} 个</font></strong>
|
||||
跳过用例个数(skipped): <strong><font color="grey" >${skipped} 个</font></strong>
|
||||
失败重试用例个数 * 次数之和(rerun): <strong>${rerun} 个</strong>
|
||||
成 功 率:<strong> <font color="green" >${pass_rate} %</font></strong>
|
||||
|
||||
**********************************
|
||||
附件为具体的测试报告,详细情况可下载附件查看, 非相关负责人员可忽略此消息。谢谢。
|
||||
"""
|
||||
# ------------------------------------ 钉钉相关配置 ----------------------------------------------------#
|
||||
ding_talk = {
|
||||
"webhook_url": "https://oapi.dingtalk.com/robot/send?access_token=***********",
|
||||
"secret": "***********"
|
||||
}
|
||||
# ------------------------------------ 钉钉通知内容 ----------------------------------------------------#
|
||||
ding_talk_title = f"{ENV_INFO.get('project_name', None)} 接口自动化报告"
|
||||
ding_talk_content = """
|
||||
各位同事, 大家好:
|
||||
|
||||
### 自动化用例于 ${start_time} 开始运行,运行时长:${run_time} s, 目前已执行完成。
|
||||
---------------------------------------------------------------------------------------------------------------
|
||||
#### 测试人: ${tester}
|
||||
#### 所属部门: ${department}
|
||||
#### 项目环境:${project_env}
|
||||
---------------------------------------------------------------------------------------------------------------
|
||||
#### 执行结果如下:
|
||||
- 用例运行总数: ${total} 个
|
||||
- 通过用例个数(passed): ${passed} 个
|
||||
- 失败用例个数(failed): ${failed} 个
|
||||
- 异常用例个数(error): ${broken} 个
|
||||
- 跳过用例个数(skipped): ${skipped} 个
|
||||
- 失败重试用例个数 * 次数之和(rerun): ${rerun} 个
|
||||
- 成 功 率: ${pass_rate} %
|
||||
|
||||
**********************************
|
||||
附件为具体的测试报告,详细情况可下载附件查看, 非相关负责人员可忽略此消息。谢谢。
|
||||
"""
|
||||
# ------------------------------------ 企业微信相关配置 ----------------------------------------------------#
|
||||
wechat = {
|
||||
"webhook_url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=********",
|
||||
}
|
||||
# ------------------------------------ 企业微信通知内容 ----------------------------------------------------#
|
||||
wechat_content = """
|
||||
各位同事, 大家好:
|
||||
|
||||
### 自动化用例于 ${start_time} 开始运行,运行时长:${run_time} s, 目前已执行完成。
|
||||
--------------------------------
|
||||
#### 测试人: ${tester}
|
||||
#### 所属部门: ${department}
|
||||
#### 项目环境:${project_env}
|
||||
--------------------------------
|
||||
#### 执行结果如下:
|
||||
- 用例运行总数: ${total} 个
|
||||
- 通过用例个数(passed):<font color=\"info\"> ${passed} 个</font>
|
||||
- 失败用例个数(failed): <font color=\"warning\"> ${failed} 个</font>
|
||||
- 异常用例个数(error): <font color=\"warning\"> ${broken} 个</font>
|
||||
- 跳过用例个数(skipped): <font color=\"comment\"> ${skipped} 个</font>
|
||||
- 失败重试用例个数 * 次数之和(rerun): <font color=\"comment\"> ${rerun} 个</font>
|
||||
- 成 功 率: <font color=\"info\"> ${pass_rate} % </font>
|
||||
|
||||
**********************************
|
||||
附件为具体的测试报告,详细情况可下载附件查看, 非相关负责人员可忽略此消息。谢谢。
|
||||
"""
|
||||
# ------------------------------------ 数据库相关配置 ----------------------------------------------------#
|
||||
db_info = {
|
||||
"test": {
|
||||
@@ -87,7 +155,6 @@ db_info = {
|
||||
},
|
||||
"live": {
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user