增加测试框架对allure测试报告的支持,已完成初版,能用户通过-report参数指定生成的是pytest-html报告还是allure报告

This commit is contained in:
floraachy
2023-05-22 09:39:36 +08:00
parent 5e9f15700a
commit 3b7c35a312
119 changed files with 1249 additions and 102 deletions
+13 -17
View File
@@ -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
View File
@@ -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"
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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>
---------------------------------------------------------------------------------------------------------------
执行结果如下:
&nbsp;&nbsp;用例运行总数:<strong> ${total} 个</strong>
&nbsp;&nbsp;通过用例个数(passed: <strong><font color="green" >${passed} 个</font></strong>
&nbsp;&nbsp;失败用例个数(failed: <strong><font color="red" >${failed} 个</font></strong>
&nbsp;&nbsp;异常用例个数(error: <strong><font color="orange" >${broken} 个</font></strong>
&nbsp;&nbsp;跳过用例个数(skipped: <strong><font color="grey" >${skipped} 个</font></strong>
&nbsp;&nbsp;失败重试用例个数 * 次数之和(rerun: <strong>${rerun} 个</strong>
&nbsp;&nbsp;成 功 率:<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": {
}
}
}