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

12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建

文章目录

      • 一、如何实现一条用例,实现覆盖所有用例的测试
        • 1、结合数据驱动:编辑一条用例,外部导入数据实现循环测试
        • 2、用例体:实现不同用例的操作步骤+对应的断言
      • 二、实战
        • 1、项目路径总览
        • 2、common 文件夹下的代码文件
        • 3、keywords 文件夹下的代码文件
        • 4、testcases 文件夹下的代码文件
        • 4、testdata 文件夹下的 case_data.xlsx 文件
        • 5、config.py 文件
      • 三、web 自动化测试完结-项目代码(总)

一、如何实现一条用例,实现覆盖所有用例的测试

1、结合数据驱动:编辑一条用例,外部导入数据实现循环测试
2、用例体:实现不同用例的操作步骤+对应的断言
  • 封装对应的方法,可以执行所有用例的操作步骤+断言

二、实战

自动化测试框架实现与意义:

  • 通过读取 excel 数据,进行数据驱动自动化测试
  • 通过反射函数,实现关键字驱动
  • 即使不懂代码的人,也能通过编辑 excel 数据进行测试

下述项目基本实现:

  • 先通过读取用例汇总统计表中的“是否执行”来加载要执行的测试用例
  • 通过要执行的测试用例名称来找到对应的工作表
  • 按照测试用例工作表中的测试步骤,来通过反射函数进行一一执行
1、项目路径总览

2、common 文件夹下的代码文件

2.1 excel_operator.py 文件
是对 excel 操作进行封装的方法

import os.path
import timeimport openpyxl
from TestKDT import config
from openpyxl.styles import Font,PatternFill,colorsclass ExcelOperator:"""操作 excel 文件"""def __init__(self,filename=os.path.join(config.testdata_dir,"case_data.xlsx")):# 获取到测试用例 excel 的文件路径self.file_path = filename# 获取到测试用例 excel 工作簿self.wk = openpyxl.load_workbook(filename)def get_case_data(self):# """获取 excel 工作簿中所有工作表的数据"""# self.sheetnames = self.wk.sheetnames"""获取 excel 工作簿中要执行的用例工作表的数据"""self.sheetnames = self.get_cases_name()values= []# 循环每个工作表for sheet_name in self.sheetnames:# 获取某个工作表某个区间列的数据value = self.get_startcol_endcol_value(sheet_name)case_data = {'case_name': sheet_name, 'steps_data': value}values.append(case_data)return values# 获取执行用例的工作表名称def get_cases_name(self):# 获取汇总用例的工作表cases_sheet = self.wk[config.cases_sheet_name]cases_name = []# 根据是否执行,取到用例的名称for row in range(2,cases_sheet.max_row+1):# 循环汇总表每一行数据is_execute = cases_sheet.cell(row, config.case_is_execute).valueif is_execute=="y":case_name = cases_sheet.cell(row, config.case_name).valuecases_name.append(case_name)return cases_name# 获取某个工作表某个区间列的数据def get_startcol_endcol_value(self,sheetname,startcol=config.keyword_col,endcol=config.action_col):# 获取工作表sheet = self.wk[sheetname]values = []# 循环对应工作表中的每一行数据for row in range(2,sheet.max_row+1):step_data = []for col in range(startcol,endcol+1):value = sheet.cell(row=row,column=col).valueif value is not None:step_data.append(value)values.append(step_data)return values# 将测试步骤的结果写入 excel 文件的用例工作表中def write_step_result(self, sheet_name, row, col, result):"""写入测试步骤的结果"""case_sheet = self.wk[sheet_name]# 写入每步操作步骤结束时间self.write_current_time(case_sheet,row,config.step_end_time)# 写入测试步骤的结果case_sheet.cell(row, col).value = result# 颜色填充 绿色通过 红色失败red_fill = PatternFill(fill_type="solid", fgColor="00FF0000")green_fill = PatternFill(fill_type="solid", fgColor="0000FF00")if result == 'FAIL':case_sheet.cell(row, col).fill = red_fillelse:case_sheet.cell(row, col).fill = green_fillself.wk.save(self.file_path)# 将测试用例的结果写入 excel 文件的用例汇总表中def write_cases_result(self, case_name, sheet_name=config.cases_sheet_name, col=config.case_result,):"""写入测试用例的结果"""cases_sheet = self.wk[sheet_name]for row in range(2,cases_sheet.max_row+1):# 循环汇总表的每一行col_case_name = cases_sheet.cell(row, config.case_name).valueif col_case_name == case_name:# 获取执行的用例case_name = cases_sheet.cell(row, config.case_name).valuesheet = self.wk[case_name]# 写入每条测试用例的结束时间self.write_current_time(cases_sheet, row, config.case_end_time)# 获取每条执行用例的结果steps_result = self.get_sheet_col_value(sheet=sheet, col=config.step_result)# 颜色填充 绿色通过 红色失败red_fill = PatternFill(fill_type="solid", fgColor="00FF0000")green_fill = PatternFill(fill_type="solid", fgColor="0000FF00")# 将结果写入汇总表中if 'FAIL' in steps_result:cases_sheet.cell(row, col).value = 'FAIL'cases_sheet.cell(row, col).fill = red_fillelse:cases_sheet.cell(row, col).value = 'PASS'cases_sheet.cell(row, col).fill = green_fillself.wk.save(self.file_path)def get_sheet_col_value(self, sheet, col):"""获取某个工作表某列的所有数据"""values = []for row in range(2, sheet.max_row + 1):step_col_value = sheet.cell(row, col).valuevalues.append(step_col_value)return valuesdef write_current_time(self, sheet, row, col):"""将当前时间写入某个表格中"""current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())sheet.cell(row, col).value = current_timeif __name__ == '__main__':# print(ExcelOperator().get_startcol_endcol_value("登录",3,6))print(ExcelOperator().get_cases_name())

2.2、logger.py 文件
和之前 POM 的日志一样

import logging
import os
import time
from TestKDT import configclass FrameLogger:def get_logger(self):# 创建日志器logger = logging.getLogger("logger")# 日志输出当前级别及以上级别的信息,默认日志输出最低级别是warningif not logger.handlers:logger.setLevel(logging.INFO)# 创建控制台处理器----》输出控制台SH = logging.StreamHandler()# 创建文件处理器----》输出文件log_path = os.path.join(config.logs_dir, f"log_{time.strftime('%Y%m%d%H%M%S', time.localtime())}.txt")FH = logging.FileHandler(log_path,mode="w",encoding="utf-8")# 日志包含哪些内容    时间  文件  日志级别 :事件描述/问题描述formatter = logging.Formatter(fmt="[%(asctime)s] [%(filename)s] %(levelname)s :%(message)s",datefmt='%Y/%m/%d %H:%M:%S')logger.addHandler(SH)logger.addHandler(FH)SH.setFormatter(formatter)FH.setFormatter(formatter)return logger
3、keywords 文件夹下的代码文件

3.1 library.py 文件
是对各种关键字函数的封装

import os
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from TestKDT import config
from TestKDT.common.logger import FrameLogger as logclass Library:# 登录用例 = 多个操作步骤组成 基于每个操作步骤封装对应的关键字函数# 登录用例:# 1、打开浏览器- 关键字函数- open_browser()# 2、加载项目地址- 关键字函数- load_url()# 3、输入用户名- 关键字函数- input()# 4、输入密码- 关键字函数- input()# 5、点击登录- 关键字函数- click()def __init__(self):self.logger = log().get_logger()def open_browser(self,browser):"""打开浏览器"""# 传入的浏览器参数保持首字母大写browser = browser.capitalize()# 获取不同类型的浏览器驱动try:self.driver = getattr(webdriver, browser)()self.logger.info(f"打开{browser}浏览器成功")except:self.logger.error(f"打开{browser}浏览器失败")raisedef load_url(self, url):"""加载地址"""try:self.driver.get(url)self.logger.info(f"加载项目地址{url}成功")except:self.logger.error(f"加载项目地址{url}失败")raise# 等待元素可见def wait_ele_visibility(self, page_name, loc, timeout=15, poll_fre=0.5):try:WebDriverWait(self.driver, timeout, poll_fre).until(EC.visibility_of_element_located(loc))# WebElement对象self.logger.info(f"在[{page_name}]页面,找到元素:{loc}可见")except:self.logger.error(f"在[{page_name}]页面,未找到元素:{loc}可见!!!")raise# 等待元素存在def wait_ele_presence(self, page_name, loc, timeout=15, poll_fre=0.5):try:WebDriverWait(self.driver, timeout, poll_fre).until(EC.presence_of_element_located(loc))self.logger.info(f"在[{page_name}]页面,找到元素:{loc}存在")except:self.logger.error(f"在[{page_name}]页面,未找到元素:{loc}存在!!!")raisedef locator(self, page_name, by_type, express):# 定位元素try:el = self.driver.find_element(by_type, express)self.logger.info(f"在[{page_name}]页面,通过[{by_type}]方法和[{express}]语句,定位元素成功")except:self.save_screenshot(by_type)self.logger.error(f"在[{page_name}]页面,通过[{by_type}]方法和[{express}]语句,定位元素失败!!!")raisereturn eldef input(self, page_name, by_type, express, text):"""输入"""loc = (by_type, express)try:self.wait_ele_visibility(page_name, loc)self.locator(page_name,by_type, express).send_keys(text)self.logger.info(f"在[{page_name}]页面,元素{loc}输入:{text} 成功!")except:self.logger.error(f"在[{page_name}]页面,元素{loc}输入失败!")# 失败截图self.save_screenshot(page_name)raisedef click(self, page_name, by_type, express):"""点击"""loc = (by_type, express)try:self.wait_ele_visibility(page_name, loc)self.locator(page_name,by_type, express).click()self.logger.info(f"在[{page_name}]页面,元素{loc}点击成功!")except:self.logger.error(f"在[{page_name}]页面,元素{loc}点击失败!")# 失败截图self.save_screenshot(page_name)raisedef move_element(self, page_name, by_type, express):"""移动鼠标"""loc = (by_type, express)try:self.wait_ele_visibility(page_name, loc)el = self.locator(page_name, by_type, express)# 将鼠标移到元素上ActionChains(self.driver).move_to_element(el).perform()self.logger.info(f"在[{page_name}]页面,鼠标移到元素{loc}成功!")except:self.logger.error(f"在[{page_name}]页面,鼠标移到元素{loc}失败!")# 失败截图self.save_screenshot(page_name)raisedef assert_text(self,page_name, by_type, express, expect):"""断言"""loc = (by_type, express)try:self.wait_ele_visibility(page_name, loc)el = self.locator(page_name, by_type, express)fact = el.textself.logger.info(f"在[{page_name}]页面,元素{loc}文本内容获取成功!")except:self.logger.error(f"在[{page_name}]页面,元素{loc}文本内容获取失败!")# 失败截图self.save_screenshot(page_name)raiseif fact == expect:passelse:raise Exception(f"在[{page_name}]页面,断言失败,assertText:{fact} != {expect}")def save_screenshot(self,img_name):file_name = os.path.join(config.screenshots_dir, img_name+'.png')self.driver.save_screenshot(file_name)self.logger.error(f"失败截图,截取当前网页,存储的路径:{file_name}")# 封装方法,可以调用当前类下的所有关键字函数# *args:不定长参数def run(self,keyword,*args):print(keyword, args)# 实现打开浏览器# keyword = "open_browser"# args = ("edge",)# 调用关键字函数,基于反射getattr(self, keyword)(*args)
4、testcases 文件夹下的代码文件

4.1 test_case.py 文件
编写测试用例

import time
import unittest
from selenium.webdriver.common.by import By
from TestKDT.keywords.library import Library
from ddt import ddt,data,file_data,unpack
from TestKDT.common.excel_operator import ExcelOperator
from TestKDT import config@ddt
class TestCase01(unittest.TestCase):# 如何实现一条用例,实现覆盖所有用例的测试# 每条用例的数据: 关键字函数 + 测试数据# case_data = [["open_browser","edge"],["load_url","http://116.62.63.211/shop/user/logininfo.html"],#               ["input",(By.NAME, "accounts"), "hc_test"],#               ["input",(By.XPATH, '//input[@type="password"]'),"hctest123"],#               ["click",(By.XPATH, '//button[text()="登录"]')]]excel = ExcelOperator()case_data = excel.get_case_data()@data(*case_data)def test_cases(self,case_data):# 打印每条用例的数据print(case_data)case_name = case_data['case_name']steps_data = case_data['steps_data']# 用例体 = 操作步骤+ 断言# 封装对应的方法,可以执行所有用例的操作步骤 + 断言lib = Library()for index, step_data in enumerate(steps_data):try:# 执行用例的操作步骤lib.run(*step_data)# 当前执行步骤为 PASS# index  0  行数 2  因为第一行不是测试数据,而是列说明self.excel.write_step_result(sheet_name=case_name, row=index+2, col=config.step_result, result="PASS")except Exception as error:# 当前执行步骤为 FAILself.excel.write_step_result(sheet_name=case_name, row=index+2, col=config.step_result, result="FAIL")self.excel.write_cases_result(case_name)
4、testdata 文件夹下的 case_data.xlsx 文件
  • 4.1 用例汇总统计
  • 4.2 登录成功
  • 4.3 登录失败-1
  • 4.4 登录失败-2
5、config.py 文件

是项目的路径以及其他数据内容

import os# 根路径
base_dir = os.path.dirname(os.path.abspath(__file__))
# 用例路径
testcases_dir = os.path.join(base_dir, 'testcases')
# 数据路径
testdata_dir = os.path.join(base_dir, 'testdata')
# 测试报告路径
reports_dir = os.path.join(base_dir, 'outputs/reports')
# 日志路径
logs_dir = os.path.join(base_dir, 'outputs/logs')
# 失败截图
screenshots_dir = os.path.join(base_dir, 'outputs/screenshots')
# 测试用例 excel 中关键字所在列
keyword_col = 3
# 测试用例 excel 中操作值所在列
action_col = 7
# 用例汇总表名称
cases_sheet_name = "用例汇总统计"
# 用例汇总表中是否执行所在列数
case_is_execute = 5
# 用例汇总表中用例名所在列数
case_name = 2
# 用例汇总表中测试结果所在列数
case_result = 7
# 用例汇总表中测试结束时间所在列数
case_end_time = 6
# 用例工作表中执行结果所在列数
step_result = 9
# 用例工作表中执行时间所在列数
step_end_time = 8# ---调试
print(testdata_dir)

三、web 自动化测试完结-项目代码(总)

Test-Web.zip

相关文章:

12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建

文章目录 一、如何实现一条用例,实现覆盖所有用例的测试1、结合数据驱动:编辑一条用例,外部导入数据实现循环测试2、用例体:实现不同用例的操作步骤对应的断言 二、实战1、项目路径总览2、common 文件夹下的代码文件3、keywords 文…...

学习状态不佳时的有效利用策略

当学习状态不佳时,可以尝试以下策略,将这段时间转化为有意义的活动,既不勉强自己又能为后续高效学习铺路: 1. 整理与规划:低精力高回报任务 整理学习环境:收拾书桌、归类资料、清理电脑文件,减…...

Spring Cloud深度实践:从服务发现到弹性智能API网关全景解析

引言 大家好!继初步搭建了微服务基础架构后,我们进一步深入到服务调用的优化、系统的弹性构建以及API网关的高级应用。本文将全面回顾这一进阶阶段的实践成果,通过更丰富的图解,力求清晰展现各核心组件的工作原理与协同方式。 项…...

第J1周:ResNet-50算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 我的环境 语言环境:Python3.8 编译器:Jupyter Lab 深度学习环境:Pytorchtorch1.12.1cu113 torchvision0.13.1cu113 一、准备工作 二、导入数据 三、划分数据…...

PCL 计算一条射线与二次曲面的交点

文章目录 一、简介二、实现代码三、实现效果一、简介 对于二次曲面而言,其一般方程可以写为: z = a 0 + a 1 x + a 2 y + a...

Executors类详解

Executors类详解 Executors 是Java中用于快速创建线程池的工具类,提供了一系列工厂方法,简化了 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 的配置。以下是其核心方法、实现原理及使用注意事项: 1. 常用线程池工厂方法 (1) newFixedThreadPool 作用:创建固定大小…...

学习alpha

(sign(ts_delta(volume, 1)) * (-1 * ts_delta(close, 1))) 这个先用sign操作符 sign.如果输入NaN则返回NaN 在金融领域,符号函数 sign(x) 与 “基础”(Base)的组合概念可结合具体场景解读,以下从不同金融场景分析其潜在意义&…...

6种方式来探究数据集的的方法worldquant

覆盖率百分比 指金融数据字段(如股价、成交量、财务指标)在时间或空间上的有效数据比例。 时间维度:数据在历史周期内的完整度(如:某股票过去 1 年中,95% 的交易日有收盘价)。空间维度&#xf…...

MiniMax语音模型Speech-02近日登顶多个全球榜单,详细技术解析

MiniMax最新发布的Speech-02把TTS领域传统巨头OpenAI、ElevenLabs拉下马来,直接登顶智能语音权威榜单Artificial Arena,不管是WER(字错率),还是SIM(声纹相似度)等客观指标都领先国外顶级模型&am…...

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。这…...

前端面经 手写Promise

核心功能 仿Promise对象需要接收包含两个变量的回调函数 构造函数 <script>class myPromise {constructor(func){const resolve (result)>{console.log(resolve执行了)}const reject (result)>{console.log(reject执行了)}func(resolve,reject)}}// Promise的…...

JavaSE基础语法之方法

方法 一、方法入门 1.方法定义 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复调用。 2.方法的格式 修饰符 返回值类型 方法名( 形参列表 ){方法体代码(需要执行的功能代码) }示例&#xff1a; public static int sum ( int a ,…...

在 Neo4j 中实现向量化存储:从文本到高效语义搜索

在当今数据驱动的时代&#xff0c;图数据库因其强大的关系表达能力和高效的查询性能&#xff0c;逐渐成为处理复杂数据结构的首选工具之一。Neo4j 作为领先的图数据库&#xff0c;不仅支持传统的图数据存储和查询&#xff0c;还通过向量化存储功能&#xff0c;为语义搜索和推荐…...

三格电子上新了——IO-Link系列集线器

一、产品概述 1.1产品用途 IO-Link系列集线器是一系列数字量输入输出I/O设备&#xff0c;可以将标准开关量信号接入到此设备。通过此集线器方便的将大量的I/O点位接入到IO-Link主站&#xff0c;进而接入到PLC控制系统。 IO-Link通信接口和8个I/O接口(16个IO点位)均采用M12规…...

记一次从windows连接远程Linux系统来控制设备采集数据方法

文章目录 0 引入1、方法2、优化Process使用 3、引用 0 引入 最近使用的探测器是老外的&#xff0c;老外的探测器需要在centos系统上&#xff0c;在这系统上有相应的指令或者软件控制&#xff0c;但是我们的软件在windwons上&#xff0c;所以目前的困难是&#xff1a;如何在Win…...

鸿蒙 ArkTS 常用的数组和字符串 操作方法

数组的常用方法 方法名功能描述concat(value0, ?value1, /* … ,*/ ?valueN)合并两个或多个数组。此方法不会更改现有数组&#xff0c;而是返回一个新数组copyWithin(target, ?start, ?end)浅复制数组的一部分到同一数组中的另一个位置&#xff0c;并返回它&#xff0c;不…...

Web性能优化的未来:边缘计算、AI与新型渲染架构

一、边缘计算与性能优化深度整合 1.1 边缘节点计算卸载策略 • 智能任务分割:将非关键路径计算卸载到边缘节点 // 客户端代码 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer...

Python字符串常用内置函数详解

文章目录 Python字符串常用内置函数详解一、基础字符串函数1. len() - 获取字符串长度2. ord() - 获取字符的Unicode码点3. chr() - 通过Unicode码点获取字符4. ascii() - 获取字符的ASCII表示 二、类型转换函数1. str() - 将对象转为字符串2. repr() - 获取对象的官方字符串表…...

2025程序设计天梯赛补题报告

2025程序设计天梯赛补题报告 仅包含L1 L2 L1-6 这不是字符串题 题目描述 因为每年天梯赛字符串题的解答率都不尽如人意&#xff0c;因此出题组从几年前开始决定&#xff1a;每年的天梯赛的 15 分一定会有一道字符串题&#xff0c;另外一道则一定不是字符串题。 小特现在有…...

【GNN笔记】Signed Graph Convolutional Network(12)【未完】

视频链接&#xff1a;《图神经网络》 Signed Graph Convolutional Network 之前介绍的GNN模型主要集中在无符号的网络&#xff08;或仅由正链接组成的图&#xff09;上&#xff0c;符号 图带来的挑战&#xff0c;主要集中在于 否定链接&#xff0c;与正链接相比&#xff0c;它不…...

CSR、SSR与ISR的奇妙之旅

网页渲染三剑客:CSR、SSR与ISR的奇妙之旅 三种渲染方式的核心本质 CSR(客户端渲染)让浏览器成为"厨师",SSR(服务器端渲染)让服务器担任"厨师",而ISR(增量静态再生)则是一位兼具"提前备餐"和"即时烹饪"能力的"超级厨师"…...

YOLO+UI(C#)开发

接Windows目标检测程序开发&#xff08;YOLO&#xff08;python推理&#xff09;界面开发&#xff08;C#&#xff09;&#xff09; C#作为软件界面&#xff0c;推理、前处理、后处理逻辑全部python&#xff0c;接任何功能定制...

生产级JVM参数优化

Spring Boot 应用性能提升 300% 当你的 Spring Boot 应用响应迟缓&#xff0c;且已采用缓存、数据库索引和异步处理优化后&#xff0c;下一个优化方向在哪里&#xff1f;我的答案是 JVM 本身。 经过性能分析和深入研究&#xff0c;我发现合理配置 JVM 参数可以带来显著的性能…...

什么是SMBus

一、SMBus的定义与背景 基本概念 SMBus&#xff08;System Management Bus&#xff0c;系统管理总线&#xff09; 是一种基于IC&#xff08;Inter-Integrated Circuit&#xff09;协议的轻量级两线制串行通信总线&#xff0c;由Intel于1995年提出&#xff0c;主要用于低带宽系统…...

[Unity]AstarPathfindingProject动态烘焙场景

需求 项目是MMO大场景&#xff0c;按地块划分了10x10的大格子。角色移动时动态更新周边场景&#xff0c;且角色还有传送功能。 项目中寻路用了AstarPathfindingProject的Grid。因此需要动态烘焙寻路信息。 核心代码 private void bakeAStarPath(){AstarPath astarPath Astar…...

Go语言处理HTTP下载中EOFFailed

在 Go 语言中使用 HTTP 下载文件时遇到 EOF 或 Failed 错误&#xff0c;通常是由于网络连接问题、服务器中断、未正确处理响应体或并发写入冲突等原因导致的。以下是详细的解决方案&#xff1a; 1. 检查错误类型并重试 io.EOF 错误可能表示连接被服务器关闭&#xff0c;而 Fai…...

React学习(一)

React 基础概念 组件&#xff1a;React 应用的基本构建块&#xff0c;可以是类组件或函数组件。JSX&#xff1a;JavaScript 的语法扩展&#xff0c;允许在 JavaScript 中写 HTML 结构。Props&#xff1a;组件的输入参数&#xff0c;用于父组件向子组件传递数据。State&#xf…...

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…...

UML活动图零基础入门:1 分钟掌握核心逻辑(附实战模板)

想快速搞懂UML活动图怎么用&#xff1f;别担心&#xff01;作为软件开发和业务流程设计的动态流程图&#xff0c;UML活动图能直观展现系统操作步骤、决策逻辑和并行流程&#xff0c;是团队协作中沟通需求、优化流程的必备工具。无论是产品经理梳理业务流程&#xff0c;还是开发…...

临床决策支持系统的提示工程优化路径深度解析

引言 随着人工智能技术在医疗领域的迅猛发展,临床决策支持系统(CDSS)正经历从传统规则引擎向智能提示工程的范式转变。在这一背景下,如何构建既符合循证医学原则又能适应个体化医疗需求的CDSS成为医学人工智能领域的核心挑战。本报告深入剖析了临床决策支持系统中提示工程的…...

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…...

使用 LSTM/GRU 预测设备异常的模型

LSTM(Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,旨在解决传统 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。它通过引入门控机制和单元状态来更好地控制信息的流动,使得网络能够学习到长期依赖关系。以下是其主要特点: 门控机制:包括遗忘门、输…...

八股文--JVM(1)

⭐️⭐️JVM内存模型 程序计数器&#xff1a;可以看作是当前线程所执行的字节码的行号指示器&#xff0c;用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法&#xff0c;计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOf…...

BM25 算法与关键词提取在向量数据库中的实践优化

BM25 算法与关键词提取在向量数据库中的实践优化 在实际构建问答系统或语义检索场景中&#xff0c;向量数据库&#xff08;如 Weaviate&#xff09;提供了基于语义匹配的检索能力&#xff0c;然而我们发现 BM25 关键词检索效果不理想&#xff0c;甚至出现了召回率过低、查询必…...

济南超算研究所面试问题

1.自我介绍 2.java抽象类与接口的区别 3.抽象类能否实例化 4.在项目中用的抽象类偏多还是接口偏多 5.抽象类用的场景介绍一下 6.java中数据结构有哪些 7.数据的基本类型 8.引用类型&#xff0c;包装类型 9.是一个场景题&#xff0c;在查询数据库中的数据时&#xff0c;…...

“多维像素”可赋能具身智能非凡感知力——昱感微参加2025松山湖中国IC创新高峰论坛

5月13日&#xff0c;由中国半导体行业协会集成电路设计分会、芯原微电子&#xff08;上海&#xff09;股份有限公司联合主办的第十五届松山湖中国IC创新高峰论坛在东莞松山湖举行。本届松山湖论坛以“面向‘具身智慧机器人’的创新IC新品推介”为主题&#xff0c;吸引了许多知名…...

解决CLion控制台不能及时显示输出的问题

CLion 2025版本可以免费用于非商业用途了&#xff0c;下载来试用了一下&#xff0c;与JB的其它 IDE一样的资源占用比较大&#xff0c;流畅度不及VSCode。 在Windows下创建了一个简单的控制台应用程序&#xff0c;使用printf和std::cout输出字符串&#xff0c;发现CLion的控制台…...

多尺度对比度调整

一、背景介绍 受到了前面锐化算法实现的启发&#xff0c;对高频层做增强是锐化&#xff0c;那么对中低频一起做增强&#xff0c;就应该能有局域对比度增强效果。 直接暴力实现了个基本版本&#xff0c;确实有对比度增强效果。然后搜了下关键字&#xff0c;还真找到了已经有人这…...

虹桥前湾印象城MEGA品牌大会灵感迸发,共绘湾系生活新章

前言&#xff1a;当千年水韵流淌至上海前湾&#xff0c;当苏州河的生态肌理转化为商业空间的呼吸脉络……上海虹桥前湾印象城MEGA“漫漫而来”。 5月15-16日&#xff0c;以“灵感新章 Wave of Megagination”为主题的虹桥前湾印象城MEGA品牌大会成功举办&#xff0c;正式掀开长…...

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…...

读论文alexnet:ImageNet Classification with Deep Convolutional Neural Networks

https://zhuanlan.zhihu.com/p/13694329885 1, 公式 卷积层输出尺寸&#xff1a; o ⌊(i 2p - k) / s⌋ 1 式中&#xff0c;i:输入尺寸&#xff1b;o:输出尺寸&#xff1b;p:padding&#xff1b;k: kernel_size&#xff1b;s: stride。⌊…⌋表示向下取整。 2, 推导过程 …...

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…...

AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)

1 安装模块 魔塔社区提供了下载的模块&#xff0c;如下&#xff1a; pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...

常见面试题

1.stringbuffer和stringbuilder的区别&#xff0c;stringbuffer是通过什么实现线程安全的? StringBuffer 和 StringBuilder 都是用于处理可变字符串的类&#xff0c;但它们的主要区别在于 线程安全性。 StringBuffer 的线程安全是通过方法加锁&#xff08;synchronized&…...

【视觉任务】深度估计(Depth Estimation)介绍(2025年更新)

文章目录 1. 任务定义与意义2. 按输入类型的分类2.1 单目深度估计&#xff08;Monocular Depth Estimation&#xff09;2.2 双目与多视图深度估计&#xff08;Stereo / Multi-view&#xff09;2.3 深度相机输入&#xff08;RGB-D&#xff09;2.4 主动与被动方法 3. 核心方法概述…...

Python 在Excel单元格中应用多种字体样式

文在数据处理和报表生成场景中&#xff0c;Excel 文件的格式设置至关重要。合理的字体格式不仅能提升表格的可读性&#xff0c;还能突出关键数据。本文将详细介绍如何使用免费库Free Spire.XLS for Python&#xff0c;在 Excel 单元格中灵活应用多种字体格式&#xff0c;包括字…...

C++:字符串操作函数

strcpy() 功能&#xff1a;把一个字符串复制到另一个字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …...

Spark,SparkSQL操作Mysql, 创建数据库和表

SparkSQL操作Mysql 1.查看系统内是否有mysql [roothadoop100 ~]# rpm -aq | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64 2.想我上面输出了有结果的即证明有&#xff0c;使用下列命令删除即可 [roothadoop100 ~]# rpm -e --nodeps mariadb-libs 3.进入我们常用存放压缩包…...

降低学习成本,1 天掌握 Java 开发核心技能

在当今数字化浪潮中&#xff0c;Java 编程语言凭借其卓越的跨平台性与稳定性&#xff0c;在企业级系统搭建、移动端应用开发以及大数据处理等领域占据着举足轻重的地位。但不可忽视的是&#xff0c;Java 开发链条冗长&#xff0c;从需求剖析到代码落地的全流程充满挑战&#xf…...

类模板的简单实例

author: hjjdebug date: 2025年 05月 16日 星期五 15:06:00 CST description: 类模板的简单实例 文章目录 1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句 3. 模板类的实例化过程.3.1 实例化的进一步试验. 4. 怎样调试constexpr 修饰的函数&#xff1f; 类模…...