当前位置: 首页 > news >正文

接口自动化测试系列-excel管理测试用例

代码源码:
框架结构
在这里插入图片描述

核心代码

excel数据处理

from configureUtil.LogUtil import getlog
logger = getlog(targetName='HandleData')
import xlrd
from openpyxl import load_workbook,workbook
from openpyxl.styles import Font, colors
import openpyxl
import os
# from Common.FunctionStart import MoveSpace
# from openpyxl import load_workbook
# from openpyxl.reader.excel import load_workbook
# from openpyxl.styles import Color, Font, Alignment
# from openpyxl.styles import colors
'''
1、cope一份用例所保存的excel,当做执行环境保证测试数据清洁。
2、读取excle数据,返回dick形式的结果。
'''class ExcelHander():'''excel操作类,对外提供取excle返回dick结果功能、新增excel、sheet、cope excel功能、写入excel功能等。'''def __init__(self,filepath):self.filepath=filepathself.wb=xlrd.open_workbook(filepath)#加载excelself.sheet_names=self.wb.sheet_names()#获取excel所有sheet名集合形如:['test', 'test2', 'test3']def ExcelDick(self,SheetName):''':param SheetName: excel的sheet名字:return: 返回读取excel字典类型数据'''table = self.wb.sheet_by_name(SheetName)# 获取总行数rowNum = table.nrows# 获取总列数colNum = table.ncolsif rowNum<=1:logger.error('总行数小于等于1行')else:logger.debug('开始解析excel----excel总行数:%s'%rowNum)# 获取第一行(表头)keys = table.row_values(0)print(keys)r=[]j=1for i in range(rowNum-1):s={}# 从第二行开始values=table.row_values(j)print(values)for x in range(colNum):s[keys[x]]=values[x]r.append(s)j+=1# logger.debug('返回列名:%s'%r)ExcelDick={}ExcelDick[SheetName]=rlogger.debug('ExcelDick:%s' % ExcelDick)return ExcelDick #形如ExcelDick{'sheetName':[{列名:values},{列名:values}]}def sheet_method(self,work_book, add_sheet=[]):wk = work_book# rename default sheetss_sheet = wk["Sheet"]# ss_sheet = wk.get_sheet_by_name('Sheet')ss_sheet.title = add_sheet[0]for i in range(1, len(add_sheet)):# add new sheetwk.create_sheet(add_sheet[i])# switch to active sheet# sheet_num = wk.get_sheet_names()sheet_num = wk.sheetnameslast_sheet = len(sheet_num) - 1sheet_index = sheet_num.index(sheet_num[last_sheet])wk.active = sheet_indexdef CreateExcel(self,filepath,add_sheet=[]):''':param filepath: excel地址:return: 无'''# 新建一个工作簿p1=os.path.exists(filepath)#判断是否存在if p1:os.remove(filepath)wb2 = workbook.Workbook()self.sheet_method(wb2,add_sheet)logger.debug('新建excle:%s' % filepath)wb2.save(filepath)def CopeExcel(self,filepath,newexcelPath,i=0):''':param filepath: 原excel地址:param newexcelPath: 新excel地址:param SheetName: 原sheet的名字:return: 无'''# 读取数据logger.debug('读取数据excle:%s' % filepath)source = openpyxl.load_workbook(filepath)target = openpyxl.load_workbook(newexcelPath)sheets1 = source.sheetnamessheets2 = target.sheetnameslogger.info('源sheet列表:%s,目标sheet列表:%s'%(sheets1,sheets2))sheet1 = source[sheets1[i]]logger.debug('获取sheet:%s' % sheet1)sheet2 = target[sheets2[i]]table = self.wb.sheet_by_name(sheets1[i])# 获取总行数max_row = table.nrows# 获取总列数max_cloumn = table.ncolsfor m in list(range(1, max_row + 1)):for n in list(range(97, 97 + max_cloumn)):  # 字母a=97n = chr(n)i = '%s%d' % (n, m)cell1 = sheet1[i].value  # 获取文本数据# log.debug('获取文本数据:%s'%cell1)sheet2[i].value = cell1logger.debug('保存数据')target.save(newexcelPath)  # 保存数据source.close()target.close()def WriteExcel(self,filepath,row,cloumn,values,i):''':param filepath: excel地址:param row: 行号:param cloumn: 列号:param values: 值:param i: sheet的索引:return: 无'''excelpath = load_workbook(filepath)sheets = excelpath.sheetnamesexcelpath[sheets[i]].cell(row, cloumn).value = valuesexcelpath.save(filepath)logger.debug('写数据完成:sheet:%s 行:%s,列:%s,值:%s' % (sheets[i],row, cloumn, values))def AssembleCase(filepath,newexcelPath):'''测试用例组装工厂:return: 测试用例'''#新增同名excel、sheettest = ExcelHander(filepath)#实例化add_sheet = test.sheet_names#获取sheetname列表:['sheet1','sheet2']test.CreateExcel(newexcelPath, add_sheet)#创建excel及sheet(cope原excel新建空的execle)#给excel填充数据for i in range(len(add_sheet)):test.CopeExcel( filepath, newexcelPath, i)#按sheet分组,组装request数据wb = xlrd.open_workbook(newexcelPath)  # 加载新excelsheet_names = wb.sheet_names()  # 获取excel所有sheet名集合形如:['sheet1', 'sheet2', 'sheet3']caselist=[]for i in range(len(sheet_names)):caselist.append(test.ExcelDick(sheet_names[i]))#返回所有sheet集合,形如ExcelDick[{'sheetName':[{列名:values},{列名:values}]},{'sheetName':[{列名:values},None]#接口请求数据return caselistdef wordFormat(filepath,postition,size,name,bold,italic,i=0):'''格式化表格数据postition,位置如A1size,字体大小name,字体类型名color,字体颜色bold,是否加粗italic,是否斜体i,sheet索引:param filepath:指定excle:return:'''#激活exclewb = openpyxl.load_workbook(filepath)sheet1 = wb.worksheets[i]italic24Font = Font(size=size, name=name, bold=bold ,italic=italic)sheet1[postition].font = italic24Fontwb.save(filepath)def backFormat(filepath,n,m,fgColor,i=0):''':param n: 行号:param m: 列号:param fgColor: 颜色 # blue 23ff00 greet 6e6fff  red ff0f06:param i: sheet索引:return:'''import openpyxl.styles as stywb = openpyxl.load_workbook(filepath)sheet1 = wb.worksheets[i]sheet1.cell(row=n, column=m).fill = sty.fills.PatternFill(fill_type='solid',fgColor=fgColor)wb.save(filepath)def excleFormat(filepath):'''filepath 格式化excle:return:excel表头宋体斜体加粗背景色blue 12号 6e6fff其他内容宋体背景色无 11号 ffffff成功的 宋体背景色绿色 11号 23ff00失败 宋体背景色绿色 11号 ff0f06'''wb = xlrd.open_workbook(filepath)#加载sheet_names = wb.sheet_names()  # 获取excel所有sheet名集合形如:['test', 'test2', 'test3']#######字体if sheet_names==[]:logger.debug('excel是空sheet')passelse:for i,SheetName in enumerate(sheet_names)  :table = wb.sheet_by_name(SheetName)# logger.debug('获取第%s个sheet=%s'%(i,SheetName))# 获取总行数rowNum = table.nrows# logger.debug('行数:%s'%(rowNum))# 获取总列数colNum = table.ncols# logger.debug('列数:%s' % (colNum))name='Times New Roman'if rowNum<1:# logger.debug('空sheet')passelse:for m in list(range(1, rowNum + 1)):for n in list(range(97, 97 + colNum)):  # 字母a=97if m==1:n = chr(n)postition = '%s%d' % (n, m)color='6e6fff'bold=Trueitalic=Truesize=12# logger.debug('格式第一行数据')wordFormat(filepath, postition, size, name, bold, italic, i)fgColor='6e6fff'backFormat(filepath,m, ord(n)-96, fgColor, i)else:n = chr(n)postition = '%s%d' % (n, m)color = '6e6fff'bold = Falseitalic = Falsesize = 11# logger.debug('格式化%s行数据'%(m))wordFormat(filepath, postition, size, name, bold, italic, i)cell_value = table.cell_value(m-1,10)if cell_value=='TRUE'or cell_value==1 :fgColor='23ff00'# logger.debug('获取到结果:TRUE')backFormat(filepath,m, 11, fgColor, i)elif cell_value=='FLASE' or cell_value==0:fgColor = 'ff0f06'# logger.debug('获取到结果:FLASE')backFormat(filepath,m, 11, fgColor, i)else:logger.error('行号:%s ' % (m - 1))# logger.error('没有获取到结果:%s'%cell_value)########背景色if __name__=='__main__':filepath = r'E:\plant\AutoUniversalInterface\Common\TestCase\demo.xlsx'newexcelPath=r'E:\plant\AutoUniversalInterface\Common\TestResult\demo.xlsx'# 打开excelpostition='A1'size=14#大小name='Times New Roman'#字体color=colors.BLACK#字体颜色bold = False #是否加粗italic = True #是否斜体# headerFormat(filepath, postition,size, name, color,bold,italic)# wordFormat(filepath, postition, size, name, bold, italic, i=0)# fgColor = '23ff00'# n=2# m=11# backFormat(filepath,n, m, fgColor, i=0)# wb = xlrd.open_workbook(filepath)# table = wb.sheet_by_name('test')## cell_value = table.cell_value(1, 10)# print(cell_value)excleFormat(newexcelPath)

requests请求封装

import requests
# 禁用安全请求警告
import urllib3
urllib3.disable_warnings()
import jsondef callInterface(session,url, param=None,parammode='data', method='post', headers=None,verify=False,  jsonResponse=True):"""封装的http请求方法,接受session url, param, method, verify, headers 发起http请求并返回接口返回的json:param session: requests session 对象:param url: 请求地址:param param: 请求参数:param parammode:请求参数传入方式 data/json:param method: 请求方式 默认post:param verify: ssl检验 默认关:param headers: http headers:param jsonResponse: 是否json格式response标志:return: 接口返回内容/None"""logger.debug(f'开始调用接口:{url},参数为:{param}')res = NonereturnJson = Noneif method == 'POST':logger.debug(f'请求方法为:%s'%method)if parammode=='data':logger.debug(f'请求参数类型为:%s' % parammode)res = session.post(url, data=param, verify=verify, headers=headers)elif parammode=='json':logger.debug(f'请求参数类型为:%s' % parammode)res = session.post(url, json=param, verify=verify, headers=headers)elif method == 'GET':logger.debug(f'请求方法为:%s' % method)res = session.get(url, params=param, verify=verify, headers=headers)try:if res.status_code == 200:logger.debug(f'接口响应码:200')if jsonResponse:try:returnJson = res.json()except (TypeError, json.JSONDecodeError) as e:logger.error(f'请求接口:{url}出错,返回:{res.text}')logger.error(e)return {'fail':str(e)}else:try:returnJson = {'returnText': res.text[:1000]}except Exception as e:logger.error('请求接口出错')logger.error(e)return {}else:logger.error('请求接口失败!响应码非200!')logger.debug(f'接口调用完成 返回:{returnJson}')return returnJsonexcept Exception as e:return {'fail':str(e)}

检查点函数

"""
检查中心
1、检查结果是否包含于预期结果
2、结果的sql执行结果是否等于预期
3、没有检查条件走默认检查
"""
from configureUtil.LogUtil import getlog
logger = getlog(targetName='CheckPoint')
from configureUtil.DataManangerl import DBmananger#判断dict1的key是否存在dict2中
def KeyExist(dict1,dict2):n = 0if dict1=={}:return Falsefor key in dict1.keys():if key in dict2.keys():passn=n+1if n==len(dict1):return Trueelse:return False#判断dict2是否包含dict1
def Compare_ListDict(dick1, dick2):flag = Falsen = 0keyexist=KeyExist(dick1, dick2)if keyexist ==True:for i in dick1.keys():n=n+1if dick1[i] != dick2[i]:breakelif n==len(dick1):flag = Trueelif dick1=={}:flag = Trueelse:passreturn flag"""判断sql结果是否为()"""def JudgeSqlEmpty(sql,env):''':param sql: 需要执行sql:param env: 执行环境:return: 执行结果:true或者false'''try:result=DBmananger(env).callMysql(sql)logger.debug(result)except Exception as e:logger.error(e)result=()if result==():return Falseelse:return True

数据处理工厂

# 预置条件、用例依赖处理中心:
# 1、用例依赖标志
# 2、数据处理:支持sql增删改查操作
from configureUtil.LogUtil import getlog
from Common.FunctionStart import MoveSpace
logger = getlog(targetName='Precondition')
def DataSplit(SplitSign=';',StringOne=''):if isinstance(StringOne,str):result=StringOne.split(SplitSign,-1)else:result=[]result=list(filter(None, result))#去掉列表空字符及Nonereturn resultdef todict(func,SplitSign=';',StringOne=''):'''数据分离器:param StringOne: string类型入参:param SplitSign: 分离标志:如以冒号分离,则传入":":return: 分离list结果:{[{'SQL':[,]}],['$':[,]]}'''MoveSpace(StringOne)SplitSign = ';'SplitSign1 = (func(SplitSign,StringOne))# print(SplitSign1)dict = {}list1 = []list2 = []list3 = []# print(SplitSign1)import re# keys=re.findall(r'SQL:',StringOne,re.I)+re.findall(r'(\$[a-z]+):',StringOne,re.I)for i in SplitSign1:values = i.split(':')list1.append(MoveSpace(values[-1]))  # valueslist2.append(MoveSpace(values[0]))  # keysif MoveSpace(values[0]) in dict.keys():for i in dict[MoveSpace(values[0])]:list3.append(i)list3.append(MoveSpace(values[-1]))dict[MoveSpace(values[0])] = list3else:list4=[]list4.append(MoveSpace(values[-1]))dict[MoveSpace(values[0])] = list4return dict

发送邮件函数

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
from configureUtil.DataFile import mailenv# 格式化邮件地址
def formatAddr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body, attachment,title='接口自动化测试报告'):# smtp_server = 'smtp.163.com'smtp_server = 'mail.suishouji.com'smtp_server = mailenv['smtp_server']from_mail = mailenv['from_mail']mail_pass =mailenv['smtp_server']mail_passwd=mailenv['mail_passwd']to_mail = mailenv['to_mail']cc_mail = mailenv['cc_mail']# 构造一个MIMEMultipart对象代表邮件本身msg = MIMEMultipart()# msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')# Header对中文进行转码msg['From'] = formatAddr('<%s>' % (from_mail))msg['To'] = formatAddr('<%s>' % (to_mail))msg['Cc'] = formatAddr('<%s>' % (cc_mail))msg['Subject'] = Header('%s'% title).encode()# to_mail = to_mail.split(',')# cc_mail= cc_mail.split(',')to_mail.extend(cc_mail)# plain代表纯文本msg.attach(MIMEText(body, 'plain', 'utf-8'))# 二进制方式模式文件for i in range(len(attachment)):with open(attachment[i], 'rb') as f:# MIMEBase表示附件的对象mime = MIMEBase('text', 'txt', filename=attachment[i])# filename是显示附件名字,加上必要的头信息:mime.add_header('Content-Disposition', 'attachment', filename=attachment[i])mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 获取附件内容mime.set_payload(f.read())# 用Base64编码:encoders.encode_base64(mime)# 作为附件添加到邮件msg.attach(mime)# msg.attach(MIMEText(html, 'html', 'utf-8'))try:server = smtplib.SMTP(smtp_server, "25")server.set_debuglevel(1)server.login(from_mail, mail_passwd)server.sendmail(from_mail,to_mail,msg.as_string())  # as_string()把MIMEText对象变成strlogger.info ("邮件发送成功!")server.quit()except smtplib.SMTPException as e:logger.error ("Error: %s" % e)

相关文章:

接口自动化测试系列-excel管理测试用例

代码源码&#xff1a; 框架结构 核心代码 excel数据处理 from configureUtil.LogUtil import getlog logger getlog(targetNameHandleData) import xlrd from openpyxl import load_workbook,workbook from openpyxl.styles import Font, colors import openpyxl import o…...

Spring——Spring的控制反转IOC

摘要 IoC 不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从而导致类与类之间高耦合&#xff0c;难于测试&#xff1b;…...

基于CentOS7.5构建LVS-DR 群集,并启用Nginx负载均衡,一键完成。

在两台服务器上的步骤&#xff1a; 安装必要软件&#xff1a;在两台服务器上&#xff0c;安装必要的软件&#xff0c;包括ipvsadm和keepalived。使用以下命令安装软件&#xff1a; sudo yum install ipvsadm keepalived -y 禁用防火墙或配置规则&#xff1a;禁用防火墙或根据实…...

redis 数据结构(二)

整数集合 整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不时&#xff0c;就会使用整数集这个数据结构作为底层实现。 整数集合结构设计 整数集合本质上是一块连续内存空间&#xff0c;它的结构定义如下&#xff1a; typed…...

Hadoop依赖环境配置与安装部署

目录 什么是Hadoop&#xff1f;一、Hadoop依赖环境配置1.1 设置静态IP地址1.2 重启网络1.3 再克隆两台服务器1.4 修改主机名1.5 安装JDK1.6 配置环境变量1.7 关闭防火墙1.8 服务器之间互传资料1.9 做一个host印射1.10 免密传输 二、Hadoop安装部署2.1 解压hadoop的tar包2.2 切换…...

[C++网络协议] I/O复用

具有代表性的并发服务器端实现模型和方法&#xff1a; 多进程服务器&#xff1a;通过创建多个进程提供服务。 多路复用服务器&#xff1a;通过捆绑并统一管理I/O对象提供服务。✔ 多线程服务器&#xff1a;通过生成与客户端等量的线程提供服务。 目录 1. I/O复用 2. select函…...

3D数据导出工具HOOPS Publish:3D数据查看、生成标准PDF或HTML文档!

HOOPS中文网http://techsoft3d.evget.com/ 一、3D导出SDK HOOPS Publish是一款功能强大的SDK&#xff0c;可以创作丰富的工程数据并将模型文件导出为各种行业标准格式&#xff0c;包括PDF、STEP、JT和3MF。HOOPS Publish核心的3D数据模型是经过ISO认证的PRC格式(ISO 14739-1:…...

[羊城杯 2023] web

文章目录 D0nt pl4y g4m3!!! D0n’t pl4y g4m3!!! 打开题目&#xff0c;可以判断这里为php Development Server 启动的服务 查询得知&#xff0c;存在 PHP<7.4.21 Development Server源码泄露漏洞(参考文章) 抓包&#xff0c;构造payload 得到源码 class Pro{private $ex…...

Redisson—独立节点模式和集群管理工具

一、集群管理工具 Redisson集群管理工具提供了通过程序化的方式&#xff0c;像redis-trib.rb脚本一样方便地管理Redis集群的工具。 1、 创建集群 以下范例展示了如何创建三主三从的Redis集群。 ClusterNodes clusterNodes ClusterNodes.create() .master("127.0.0.1:…...

基于RabbitMQ的模拟消息队列之五——虚拟主机设计

文章目录 一、创建VirtualHost类二、初始化三、API1.创建交换机2.删除交换机3.创建队列4.删除队列5.创建绑定6.删除绑定7.发送消息转发规则 8.订阅消息1.消费者管理2.推送消息给消费者 3.添加一个消费者管理ConsumerManager9.确认消息 创建VirtualHost类。 1.串起内存和硬盘的数…...

Hadoop的概述与安装

Hadoop的概述与安装 一、Hadoop内部的三个核心组件1、HDFS&#xff1a;分布式文件存储系统2、YARN&#xff1a;分布式资源调度系统3、MapReduce&#xff1a;分布式离线计算框架4、Hadoop Common&#xff08;了解即可&#xff09; 二、Hadoop技术诞生的一个生态圈数据采集存储数…...

进程、线程与构造方法

进程、线程与构造方法 目录 一&#xff0e; 进程与线程1. 通俗解释2. 代码实现3. 线程生命周期&#xff08;图解&#xff09; 二&#xff0e; 构造方法 一&#xff0e; 进程与线程 1. 通俗解释 进程&#xff1a;就像电脑上运行的软件&#xff0c;例如QQ等。 线程&#xff1a;…...

04 Linux补充|C/C++

目录 Linux补充 C语⾔ C语言中puts和printf的区别&#xff1f; Linux补充 (1)ubuntu安装ssh服务端openssh-server命令&#xff1a; ubuntu安装后默认只有ssh客户端&#xff0c;只能去连其它ssh服务器&#xff1b;其它客户端想要连接这个ubuntu系统&#xff0c;需要安装部署…...

利用python制作AI图片优化工具

将模糊图片4K高清化效果如下&#xff1a; 优化前的图片 优化后如下图&#xff1a; 优化后图片变大变清晰了效果很明显 软件界面如下&#xff1a; 所用工具和代码&#xff1a; 1、所需软件包 网盘链接&#xff1a;https://pan.baidu.com/s/1CMvn4Y7edDTR4COfu4FviA提取码&…...

React v6(仅支持函数组件,不支持类组件)与v5版本路由使用详情和区别(详细版)

1.路由安装(默认安装最新版本6.15.0) npm i react-router-dom 2.路由模式 有常用两种路由模式可选&#xff1a;HashRouter 和 BrowserRouter。 ①HashRouter&#xff1a;URL中采用的是hash(#)部分去创建路由。 ②BrowserRouter&#xff1a;URL采用真实的URL资源&#xff0c;…...

(数字图像处理MATLAB+Python)第十二章图像编码-第一、二节:图像编码基本理论和无损编码

文章目录 一&#xff1a;图像编码基本理论&#xff08;1&#xff09;图像压缩的必要性&#xff08;2&#xff09;图像压缩的可能性A&#xff1a;编码冗余B&#xff1a;像素间冗余C&#xff1a;心理视觉冗余 &#xff08;3&#xff09;图像压缩方法分类A&#xff1a;基于编码前后…...

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…...

golang读取键盘功能按键输入

golang读取键盘功能按键输入 需求 最近业务上需要做一个终端工具&#xff0c;能够直接连到docker容器中进行交互。 技术选型 docker官方提供了python sdk、go sdk和remote api。 https://docs.docker.com/engine/api/sdk/ 因为我们需要提供命令行工具&#xff0c;因此采用g…...

用sklearn实现线性回归和岭回归

此文为ai创作&#xff0c;今天写文章的时候发现创作助手限时免费&#xff0c;想测试一下&#xff0c;于是就有了这篇文章&#xff0c;看的出来&#xff0c;效果还可以&#xff0c;一行没改。 线性回归 在sklearn中&#xff0c;可以使用线性回归模型做多变量回归。下面是一个示…...

结构型模式-桥接模式

用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xf…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...