手把手教你学会接口自动化系列二十三-引入allure优化我们的代码结构生成报告

news2024/11/27 14:42:56

优化之后的代码如下:

# !/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2024/01

# @Author : Laopi

import json

import logging



import allure



from testcase.conftest import *

baseUrl = GetYamlData(ConfigHandler.config_path).get_yaml_data()

root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

case_path = os.path.join(root_path, 'testdata')

os.chdir(case_path) # 修改工作路径

workbook = openpyxl.load_workbook('接口测试用例.xlsx') # 返回一个workbook数据类型的值

sheets = workbook.sheetnames

def get_token():

baseUrl = GetYamlData(ConfigHandler.config_path).get_yaml_data()

url = baseUrl['host']+"/login"

headers={"Content-Type":"application/x-www-form-urlencoded"}

data={"username":"admin","password":"123456"}

response = requests.post(url=url,

headers=headers,

data=data)

return response.json()['Admin-Token']

listdemo =[]

for i in range(len(sheets)):

workbook._active_sheet_index=i

sheet = workbook.active

for j in range(6,sheet.max_row+1):

case_name = sheet.cell(j, 1).value

listdemo.append([i,j,case_name])



# listdemo= [[0, 6]]



class TestCases:



@pytest.mark.parametrize("i,j,casename", listdemo)

@allure.title("{casename}")

def test_CRM(self,i,j,casename):

cookie = get_token()

url = baseUrl['host'] + sheet.cell(row=2, column=2).value

headers = json.loads(sheet.cell(j, 2).value)

headers.update({'Admin-Token': cookie})

if headers['Content-Type'] == 'application/json':

data = json.dumps(json.loads(sheet.cell(j, 3).value))

else:

data = json.loads(sheet.cell(j, 3).value)



response1 = requests.post(url=url, headers=headers, data=data)

logging.info(response1.json())

expectResult = sheet.cell(j, 5).value

assert json.loads(expectResult)['code'] == response1.json()['code']

logging.info(i)

logging.info(j)

设计思路:

首先把所有的Excel拼接成一个list,按照参数规则传给

@pytest.mark.parametrize("i,j,casename", listdemo)

之后,再将Excel的用例标题传入

@allure.title("{casename}")

将conftest里面的部分删除,写入这个里面

# !/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2024/01

# @Author : Laopi

import json

import logging

import os

import time

import openpyxl

import requests



from config.setting import ConfigHandler

from tools.yamlControl import GetYamlData

import pytest



# @pytest.fixture(scope="session", autouse=True)

# def get_baseUrl():

# baseUrl = GetYamlData(ConfigHandler.config_path).get_yaml_data()

# yield baseUrl

#

# @pytest.fixture(scope="session", autouse=True)

# def get_workbook():

# root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# case_path = os.path.join(root_path, 'testdata')

# os.chdir(case_path) # 修改工作路径

# workbook = openpyxl.load_workbook('接口测试用例.xlsx') # 返回一个workbook数据类型的值

# print("执行了这个getworkbook")

# yield workbook







def pytest_collection_modifyitems(items):

"""

测试用例收集完成时,将收集到的 item 的 name 和 node_id 的中文显示在控制台上

:return:

"""

for item in items:

item.name = item.name.encode("utf-8").decode("unicode_escape")

item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")



# 期望用例顺序

# print("收集到的测试用例:%s" % items)

appoint_items = ["test_get_user_info", "test_collect_addtool", "test_Cart_List", "test_ADD", "test_Guest_ADD",

"test_Clear_Cart_Item"]



# 指定运行顺序

run_items = []

for i in appoint_items:

for item in items:

module_item = item.name.split("[")[0]

if i == module_item:

run_items.append(item)



for i in run_items:

run_index = run_items.index(i)

items_index = items.index(i)



if run_index != items_index:

n_data = items[run_index]

run_index = items.index(n_data)

items[items_index], items[run_index] = items[run_index], items[items_index]





def pytest_terminal_summary(terminalreporter):

"""

收集用例执行结果

"""

_PASSED = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])

_ERROR = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])

_FAILED = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])

_SKIPPED = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])

_TOTAL = terminalreporter._numcollected

_TIMES = time.time() - terminalreporter._sessionstarttime

print(f"用例总数: {_TOTAL}")

print(f"异常用例数: {_ERROR}")

print(f"失败用例数: {_FAILED}")

print(f"跳过用例数: {_SKIPPED}")

print("用例执行时长: %.2f" % _TIMES + " s")

("用例执行时长: %.2f" % _TIMES + " s")



try:

_RATE = _PASSED / _TOTAL * 100

print("用例成功率: %.2f" % _RATE + " %")

except ZeroDivisionError:

print("用例成功率: 0.00 %")





def pytest_terminal_summary(terminalreporter):

"""

收集用例执行结果

"""

_PASSED = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])

_ERROR = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])

_FAILED = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])

_SKIPPED = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])

_TOTAL = terminalreporter._numcollected

_TIMES = time.time() - terminalreporter._sessionstarttime

print(f"用例总数: {_TOTAL}")

print(f"异常用例数: {_ERROR}")

print(f"失败用例数: {_FAILED}")

print(f"跳过用例数: {_SKIPPED}")

print("用例执行时长: %.2f" % _TIMES + " s")

("用例执行时长: %.2f" % _TIMES + " s")



try:

_RATE = _PASSED / _TOTAL * 100

print("用例成功率: %.2f" % _RATE + " %")

except ZeroDivisionError:

print("用例成功率: 0.00 %")











# 定义日志输出目录

log_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")



# 设置logging模块

logging.basicConfig(

level=logging.INFO,

format='%(asctime)s - %(levelname)s - %(message)s',

handlers=[

logging.FileHandler(os.path.join(log_path, 'output.log')),

logging.StreamHandler()

]

)

运行输出的报告如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1399556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、Netty核心模块组件

目录 6.1 BootStrap,ServerBootStrap6.2 Future,ChannelFuture6.3 Channel6.4 Selector6.5 ChannelHandler 以及其实现类6.6 Pipeline 和 ChannelPipeline6.7 ChannelHandlerContext6.8 ChannelOption6.9 EventLoopGroup和其实现类 NioEventLoopGroup6.1…

Forward(转发)和Redirect(重定向)的异同

Forward(转发)和Redirect(重定向)是两种不同的服务器端跳转机制,它们在Servlet中用于控制页面的跳转和处理请求的方式。 Forward(转发): 特点: 转发是在服务器内部进行的…

对接苹果CMS芒果影视APPV1.0(附安装教程+源码支持多端)内置采集脚本

目录 概述1. 演示效果1.1 视频演示1.2 图文演示1.2.1 首页1.2.2 专题页1.2.3 搜索1.2.4 观影 2. 支持功能3. 插件和框架4. 部署方法4.1 后端4.1.1 准备工具4.1.2创建站点4.1.3 上传后端代码到服务器4.1.4 导入数据库4.1.5 配置数据库信息4.1.6访问后台管理系统 4.2 前端4.2.1 准…

Modern C++ 一个例子学习条件变量

目录 问题程序 施魔法让BUG浮出水面 条件变量注意事项 修改程序 问题程序 今天无意中看到一篇帖子,关于条件变量的,不过仔细看看发现它并达不到原本的目的。 程序如下,读者可以先想想他的本意,以及有没有问题: #…

基于python旅游推荐系统 协同过滤算法 爬虫 Echarts可视化 Django框架(源码)✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

无忧秘书智脑:轻松玩转“AI彩超宝宝”功能,预见宝宝未来模样

作为准爸准妈,对肚子里的宝宝充满了好奇和期待。想象着宝宝的模样,是每个家庭都有的小确幸。如今,随着科技的发展,我们有了更先进的方式去一探究竟——那就是无忧秘书智脑的“AI彩超宝宝”功能。(功能;ai6a…

【JavaEE】网络原理:网络中的一些基本概念

目录 1. 网络通信基础 1.1 IP地址 1.2 端口号 1.3 认识协议 1.4 五元组 1.5 协议分层 什么是协议分层 分层的作用 OSI七层模型 TCP/IP五层(或四层)模型 网络设备所在分层 网络分层对应 封装和分用 1. 网络通信基础 1.1 IP地址 概念:IP地址…

Windows下载并配置Kettle

注意:需要windows配置Java 下载 Kettle 进入官网:https://www.hitachivantara.com/en-us/products/pentaho-plus-platform/data-integration-analytics/pentaho-community-edition.html 下载带有Pentaho Data Integration (Base Install)的文件&#…

Google用AI替代广告销售工作只是开始……

关注卢松松,会经常给你分享一些我的经验和观点。 前几天Google不是裁员3万人吗,其中有一个信息值得关注:就是Google的广告部门的部分员工,也被裁员了。 当然这不新鲜的,主要原因是Google的广告业务正在转向AI驱动了…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理(预编译)2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

使用Element中的input组件如何实现文字和输入框在一行显示

利用 <el-form-item label"商品名称&#xff1a;">标签包裹即可&#xff0c;label写提示文字 <el-form ref"form" label-width"100px"><el-form-item label"商品名称&#xff1a;"><el-input v-model"na…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…

芯片禁售 AIGC爆发 元宇宙蓄能 | 且看思腾合力如何探索多元化发展之路

今年以来&#xff0c;百度、阿里、华为、京东、360、网易等国内互联网厂商&#xff0c;争相推出旗下的大模型解决方案。在众多厂商展开大模型“军备竞赛”&#xff0c;并纷纷落地应用之时&#xff0c;整个行业对算力也有了全新的需求。 不过&#xff0c;今年10月份&#xff0c;…

基于JavaWeb+SSM+Vue停车场微信小程序系统的设计和实现

基于JavaWebSSMVue停车场微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关…

DBA技术栈MongoDB: 索引和查询优化

2.1 批量插入数据 单条数据插入db.collection.insertOne()多条数据插入db.collection.insertMany() db.inventory.insertMany( [{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },{ item: "notebook"…

数据大咖都在考CDMP,你呢?

&#x1f30d;全球通行证&#xff1a;无论走到哪里&#xff0c;CDMP都是你数据治理领域的“全球绿卡”&#xff0c;让你无惧地域限制&#xff0c;畅游数据世界&#xff01; &#x1f3c6;权威认证&#xff0c;业界标杆&#xff1a;DAMA国际2004年推出的CDMP认证&#xff0…

C++——函数的调用

1&#xff0c;函数功能的调用 功能&#xff1a;使用定义好的函数 语法&#xff1a;函数名&#xff08;参数&#xff09; 示例&#xff1a; #include<bits/stdc.h> using namespace std; //定义加法函数 int add(int num1,int num2){int sumnum1num2;return sum; …

一文2500字Robot Framework自动化测试框架超强教程

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

[3D]菜板上的鱼

本来想画条鲨鱼&#xff0c;结果成了条菜板上的鱼。 VS&#xff01; ** VS&#xff01; ** 【扭曲】更像菜板上的鱼了。

【原文链接】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction

原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Huang_Tri-Perspective_View_for_Vision-Based_3D_Semantic_Occupancy_Prediction_CVPR_2023_paper.pdf 1. 引言 体素表达需要较大的计算量和特别的技巧&#xff08;如稀疏卷积&#xff09;&…