【测试报告】幸运闪烁抽奖系统(Java+Selenium+Jmeter自动化测试)
一、项目背景
幸运闪烁抽奖系统 是一款基于 Spring Boot 实现的前后端分离式的网络抽奖系统,操作便捷,安全可靠。有管理员和普通用户两个角色,支持管理员创建普通用户、新建活动奖品、创建抽奖活动、进行抽奖、通过短信/邮箱通知中奖用户等功能。引入多种设计模式,保证系统的可迭代性和易维护性。
二、测试环境
硬件: ASUS TUF Gaming A15 FA506QM_FA506QM
操作系统: Windows 11 家庭中文版
浏览器: Google Chrome 135.0.7049.96(正式版本) (64 位)测试工具: 自动化测试 Selenium,性能测试 Jmeter
自动化脚本运行环境: IntelliJ IDEA 2024.1.4
三、测试分类
1、功能测试
1.1 测试用例
1.2 实际执行测试的部分操作截图
(1)正常登录
输入正确的手机号和密码执行登录操作
预期结果:成功登录
实际结果:成功登录
(2)注册用户测试(成功)
输入正确格式的数据,且这些手机号和邮箱没有被使用过,然后进行注册
预期结果:成功注册
实际结果:成功注册
(3)获取人员列表测试(上一步创建的用户在列表可以查询到)
预期结果:成功显示所有人员
实际结果:成功显示所有人员
(4)创建奖品测试(成功)
输入符合要求的奖品属性,进行奖品的创建
预期结果:奖品成功创建
实际结果:奖品成功创建
(5)获取奖品列表测试(上一步创建的奖品在列表可以查询到)
预期结果:显示完整的奖品属性,包括奖品id、奖品图片、奖品名、奖品价格、奖品描述
实际结果:显示完成的奖品属性
(6)创建活动测试(成功)
输入活动名称,活动描述,并且圈选奖品与人员,其中人员数量不小于奖品数量
预期结果:活动成功创建
实际结果:活动成功创建
(7)获取活动列表测试(上一步创建的活动在列表可以查询到)
预期结果:显示所有活动,不同状态活动的标识不一样
实际结果:显示所有活动,不同状态活动的标识不一样
(8)测试执行抽奖活动(成功)
点击页面未执行的活动进行抽奖,抽取完所有奖品
预期结果:成功抽完所有奖品,并给中奖人员发送短信/邮件
实际结果:成功抽完所有奖品,中奖人员接收到短信和邮件,与预期结果一致
功能测试结果:
测试用例100%通过,符合项目需求
2、非功能测试
包括:
界面测试、性能测试、兼容性测试、易用性测试、安全测试
3、自动化测试
3.1 测试用例
以页面为单元书写测试类,对主要功能进行测试
3.2 具体实现
1、添加相关依赖 pom.xml
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!-- WebDriverManager 用于管理浏览器驱动 --><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version></dependency><!-- 屏幕截图依赖 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
2、封装常用的方法
将测试过程中常用的初始化和关闭浏览器驱动,用户登录等功能进行封装,减少代码的冗余,便于后续调用。
package common;import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {public static WebDriver driver;public static WebDriver createDriver() {if (driver == null) {// 1、打开浏览器// 使用驱动管理程序,打开对应的浏览器驱动// 这边使用谷歌浏览器进行自动化测试WebDriverManager.chromedriver().setup();// 增加浏览器配置,创建驱动对象时要强制允许访问所有的链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 创建一个浏览器驱动对象 (在这里会打开一个网页)driver = new ChromeDriver(options);// 隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}return driver;}public Utils(String url) {// 调用 driver 对象driver = createDriver();// 访问指定的urldriver.get(url);}// 屏幕截图public void getScreenShot(String str) throws IOException {// 屏幕截图SimpleDateFormat sim1 = new SimpleDateFormat("yyyy_MM_dd");SimpleDateFormat sim2 = new SimpleDateFormat("HH_mm_ss_SSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// 设置文件名称String fileName = "./src/test/image/" + dirTime + "/" + str + "_" + fileTime + ".png";File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);// 存放至对应路径FileUtils.copyFile(file,new File(fileName));}// 登录public void base_login() {// 登录页面跳转至添加奖品页面driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13111111111");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#loginForm > button")).click();driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}
}
提供了以下功能:
1、在测试开始之前,通过 Selenium WebDriver 初始化浏览器驱动(ChromeDriver)
2、获取屏幕截图并保存,根据当前时间生成文件名并将截图保存至指定路径
3、用户的登录操作
3、登录页面测试
验证登录成功的情况与登录失败的情况,具体流程如下:
1、使用 WebDriver 打开登录页面
2、输入正确手机号和正确密码
3、点击登录按钮,登录成功跳转到主页面
4、回退到登录页面
5、输入正确手机号和错误密码 / 输入错误手机号和正确密码
6、点击登录按钮,处理弹窗
7、看程序是否正常结束,若正常,则符合预期
/*** 测试登录* 1、创建驱动,并打开页面* 2、测试页面是否正常打开* 3、测试正常登录:多参数测试* 4、测试异常登录:用户名/密码错误(不测试null)*/public void login() throws InterruptedException {/*** 测试正常登录* 流程:* 1、输入正确手机号* 2、输入正确密码* 3、点击登录按钮*/driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13111111111");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#loginForm > button")).click();/*** 测试登录失败* 流程:* 1、回退到登录页面* 2、输入正确/错误手机号* 3、输入正确/错误密码* 4、点击登录按钮*/// 回退到登录页面driver.findElement(By.cssSelector("body > div.header-box > div.user-box > div > span")).click();// 手机号未注册、密码正确driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13131313131");driver.findElement(By.cssSelector("#password")).sendKeys("111111");driver.findElement(By.cssSelector("#loginForm > button")).click();// 此时会有弹窗显示登录失败 点击确定Alert alert = driver.switchTo().alert();alert.accept();// 手机号已注册、密码错误driver.findElement(By.cssSelector("#phoneNumber")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13111111111");driver.findElement(By.cssSelector("#password")).sendKeys("666666");driver.findElement(By.cssSelector("#loginForm > button")).click();// 此时会有弹窗显示登录失败 点击确定alert = driver.switchTo().alert();alert.accept();}
自动化执行结果:成功
4、注册页面测试
验证注册成功,具体流程如下:
1、使用 WebDriver 打开登录页面
2、点击页面中的注册按钮,跳转至注册页面
3、填写正确格式的属性值
4、点击注册按钮进行注册
5、在登录页面使用注册的信息进行登录,验证是否注册成功
6、如果成功登录,就说明注册成功,程序正常执行完毕
/*** 测试注册* 1、刷新页面* 2、跳转至注册页面* 3、填写注册信息* 4、点击注册按钮* 5、回到登录页面测试是否可以登录*/public void register() throws InterruptedException {// 刷新页面driver.navigate().refresh();// 在登录界面点击跳转注册driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.register-link > a")).click();// 填写信息driver.findElement(By.cssSelector("#name")).sendKeys("自动化测试");driver.findElement(By.cssSelector("#mail")).sendKeys("test@qq.com");driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13100000000");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#registerForm > button")).click();// 注册完有弹窗显示注册成功,点击确认。点击完跳转回登录界面Thread.sleep(100);Alert alert = driver.switchTo().alert();alert.accept();// 测试注册成功driver.findElement(By.cssSelector("#phoneNumber")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13100000000");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#loginForm > button")).click();driver.close();}
自动化执行结果:成功
5、用户页面测试
验证创建普通用户,与用户列表页功能,具体流程如下:
1、在主页面点击进入注册普通用户界面
2、输入用户名、手机号、邮箱
3、点击注册按钮
4、注册成功自动跳转至人员列表页(逆序排列)
5、校验首个人员用户名是否与新注册的一致
6、若一致,则说明注册成功,程序正常执行完毕
public void createUser() throws InterruptedException {// 进入注册普通用户界面driver.findElement(By.cssSelector("#register")).click();// 显示等待,直到输入框出来driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 找到输入框,输入信息,点击注册按键driver.findElement(By.cssSelector("#name")).sendKeys("普通用户");driver.findElement(By.cssSelector("#mail")).sendKeys("123456@qq.com");driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13200000000");// 注册成功弹出弹窗 点击确定 自动跳转到人员列表页Thread.sleep(100);Alert alert = driver.switchTo().alert();alert.accept();// 注册成功的用户会显示在首行 测试名称是否与要求的一致String name = driver.findElement(By.cssSelector("#userList > tr:nth-child(1) > td:nth-child(2)")).getText();System.out.println("自动化测试创建普通用户是否成功 -> " + name.equals("普通用户"));}
自动化测试结果:打印 "自动化测试创建普通用户是否成功 -> true",符合预期
6、奖品页面测试
验证创建奖品和奖品列表页功能,具体流程如下:
1、在主页面点击进入创建奖品界面
2、输入奖品属性值,上传奖品图片
3、点击创建按钮
4、创建成功自动跳转至奖品列表页(逆序排列)
5、校验首个奖品属性值是否与新创建的一致
6、若一致,则说明创建成功,程序正常执行完毕
// 测试添加奖品public void addPrize() throws InterruptedException {base_login();// 登录页面跳转至添加奖品页面driver.findElement(By.cssSelector("body>div.cont-box>div.sidebar>ul>li:nth-child(2)>ul>li:nth-child(2)>a")).click();System.out.println(driver.getCurrentUrl());// 目标元素可能位于一个 iframe 中,若未先切换到该 iframe,Selenium 就无法定位到元素WebElement iframe = driver.findElement(By.id("contentFrame"));driver.switchTo().frame(iframe);// 设置奖品名称driver.findElement(By.cssSelector("#prizeName.form-control")).sendKeys("自动化测试奖品");// 定位文件输入框元素WebElement uploadElement = driver.findElement(By.cssSelector("#prizeImageUrl"));// 上传奖品图片uploadElement.sendKeys("E:\\LotterySystem\\LotteryAutoTest\\src\\test\\robot.png");// 设置奖品价格driver.findElement(By.cssSelector("#price.form-control")).sendKeys("100");// 设置奖品描述driver.findElement(By.cssSelector("#description.form-control")).sendKeys("自动化测试设置奖品111");// 点击创建按钮,显示弹窗提示创建成功Thread.sleep(1000);driver.findElement(By.xpath("/html/body/div/button")).click();Thread.sleep(200); // 等待弹窗出现Alert alert = driver.switchTo().alert();alert.accept();// 跳转至奖品列表页面 测试第一个是不是设置的奖品String prizeName = driver.findElement(By.cssSelector("#prizeList > tr:nth-child(1) > td:nth-child(3)")).getText();System.out.println(prizeName);System.out.println("自动化添加的奖品是否成功 -> " + prizeName.equals("自动化测试奖品"));driver.close();}
自动化测试结果:打印 "自动化添加的奖品是否成功 -> true",符合预期
7、活动页面测试
验证创建活动和执行活动功能,具体流程如下:
1、在主页面点击进入创建活动界面
2、输入活动属性值,圈选奖品、人员
3、点击创建按钮
4、创建成功自动跳转至活动列表页(逆序排列)
5、校验首个活动属性值是否与新创建的一致,是否为未执行状态
6、若一致,则说明创建成功,开始执行活动
7、点击执行活动,页面跳转,需切换句柄
8、执行活动,若程序正常运行完毕,则说明符合需求
public void createActivity() throws InterruptedException {base_login();// 进入创建抽奖活动界面driver.findElement(By.cssSelector("#createActivity")).click();// 进入iframeWebElement iframe = driver.findElement(By.id("contentFrame"));driver.switchTo().frame(iframe);// 输入活动名称、活动描述driver.findElement(By.cssSelector("#activityName")).sendKeys("自动化活动名称");driver.findElement(By.cssSelector("#description")).sendKeys("自动化活动描述");Thread.sleep(1000);// 圈选奖品// 点击圈选按钮、圈选人员、点击确定、看圈选按钮是否显示已圈选driver.findElement(By.cssSelector("#buttonPrizes")).click();driver.findElement(By.cssSelector("#prize-30")).click();driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();String putPrize = driver.findElement(By.cssSelector("#buttonPrizes")).getText();if (putPrize.equals("圈选奖品(已选)")) {System.out.println("圈选奖品成功");
}// 圈选人员// 点击圈选按钮、圈选人员、点击确定、看圈选按钮是否显示已圈选driver.findElement(By.cssSelector("#buttonUsers")).click();driver.findElement(By.cssSelector("#user-42")).click();driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();String putUser = driver.findElement(By.cssSelector("#buttonUsers")).getText();if (putUser.equals("圈选人员(已选)")) {System.out.println("圈选人员成功");}// 创建活动driver.findElement(By.cssSelector("#createActivity")).click();// 处理弹窗Thread.sleep(200);Alert alert = driver.switchTo().alert();alert.accept();// 校验活动是否创建成功String activityName = driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.activity-info > h4")).getText();if (activityName.equals("自动化活动名称")) {System.out.println("活动创建成功");}// 此时页面在奖品列表页// 测试执行抽奖活动driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();// 跳转至新标签页 需要切换句柄// 获取当前页面句柄String currentHandle = driver.getWindowHandle();Set<String> allHandles = driver.getWindowHandles();for (String handle : allHandles) {// 如果句柄和当前的不一样,就切换if (!handle.equals(currentHandle)) {driver.switchTo().window(handle);}}// 点击抽奖driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();driver.close();}
自动化测试结果:程序正常执行完毕,符合预期
四、遗留风险
由于测试时间紧张,先保证了抽奖系统主体功能没问题,可能存在细节测试不到位
五、测试结果评估
1、主线功能测试通过,项目可以上线
2、项目上线后观察线上数据
相关文章:
【测试报告】幸运闪烁抽奖系统(Java+Selenium+Jmeter自动化测试)
一、项目背景 幸运闪烁抽奖系统 是一款基于 Spring Boot 实现的前后端分离式的网络抽奖系统,操作便捷,安全可靠。有管理员和普通用户两个角色,支持管理员创建普通用户、新建活动奖品、创建抽奖活动、进行抽奖、通过短信/邮箱通知中奖用户等功…...
块压缩与图片压缩优缺点对比
块压缩与图片压缩优缺点对比 块压缩(Block Compression) ✅ 优点 硬件加速支持 直接被GPU读取,无需CPU解压显著降低内存带宽消耗(适合移动设备) 随机访问特性 44/88像素块独立压缩支持直接定位读取特定纹理区域 固…...
C++算法(14):K路归并的最优解法
问题描述 给定K个按升序排列的数组,要求将它们合并为一个大的有序数组。例如,输入数组[[1,3,5], [2,4,6], [0,7]],合并后的结果应为[0,1,2,3,4,5,6,7]。 解决方案 思路分析 合并多个有序数组的高效方法是利用最小堆(优先队列&…...
2025.04.23【Treemap】树状图数据可视化指南
Multi-level treemap How to build a treemap with group and subgroups. Customization Customize treemap labels, borders, color palette and more 文章目录 Multi-level treemapCustomization Treemap 数据可视化指南Treemap 的基本概念为什么使用 TreemapTreemap 的应用…...
2025新一代人工智能技术发展及其应用
新一代人工智能技术发展及其应用 一、人工智能概述(一)定义(二)动力(三)发展脉络 二、新一代人工智能技术(一)大语言模型(二)自然语言处理(三&…...
vue3中slot(插槽)的详细使用
在 Vue 3 中,slot(插槽)是一种强大的组件内容分发机制,它允许父组件向子组件传递内容,从而使组件的使用更加灵活。以下是关于 Vue 3 中 slot 的详细介绍 一、默认插槽 这是最基本的插槽形式。子组件中使用定义一个插…...
大模型面经 | 春招、秋招算法面试常考八股文附答案(五)
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
【PCB工艺】推挽电路及交越失真
推挽电路(Push-Pull Circuit) 推挽电路(Push-Pull Circuit) 是一种常用于功率放大、电机驱动、音频放大等场合的电路结构,具有输出对称、效率高、失真小等优点。 什么是推挽电路? 推挽是指:由两种极性相反的器件(如 NPN 和 PNP、NMOS 和 PMOS)交替导通,一个“推”电…...
接口访问数据库报错问题记录
报错信息: java.sql.SQLException: Access denied for user rootXXX.XX.XX.XX (using password: YES) 解决方法: -- 授予 root 用户从 XXX.XX.XX.XX 访问所有数据库的权限 GRANT ALL PRIVILEGES ON *.* TO 数据库用户XX.XX.XX.XXX IDENTIFIED BY 数…...
神经网络相关内容
划分数据集以及模型定义 def data_split(datax, datay, val_size 0.1, test_size 0.05):输入:datax datay 输出:trainx, valx, testx, trainy, valy, testy, 分别按比例得到训练集、验证集、测试集# 构建数据集pos_test int(len(datax) * (1 - test_…...
python项目实战-后端个人博客系统
本文分享一个基于 Flask 框架开发的个人博客系统后端项目,涵盖用户注册登录、文章发布、分类管理、评论功能等核心模块。适合初学者学习和中小型博客系统开发。 一、项目结构 blog │ app.py │ forms.py │ models.py │ ├───instance │ blog.d…...
谷歌搜索索引编译中的重定向错误解决方案
谷歌搜索索引编译中的重定向错误解决方案 在处理谷歌搜索引擎优化(SEO)过程中遇到的重定向错误问题时,了解其根本原因并采取适当措施至关重要。以下是针对常见重定向错误及其解决方案的具体分析: 1. 滥用301和302重定向 滥用永…...
OpenCV 中的角点检测方法详解
文章目录 引言1. Harris角点检测原理1.1 什么是角点?1.2 Harris算法的核心思想1.3 角点、边缘和平坦区域的区分 2. OpenCV实现Harris角点检测3. 总结 引言 在计算机视觉和图像处理中,特征点检测(Feature Detection)是一个关键任务…...
【开源】STM32HAL库驱动ST7789_240×240(硬件SPI+软件SPI)
项目开源链接 github主页https://github.com/snqx-lqh本项目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 📖 欢迎交流 如果开源的代码对你有帮助,希望可以帮我点个赞👍和收藏 项目说明 最近调试了一款1…...
区块链技术在物联网中的应用:构建可信的智能世界
在当今数字化时代,物联网(IoT)和区块链技术正成为推动科技发展的两大重要力量。物联网通过连接设备实现数据的共享和交互,而区块链则以其去中心化、不可篡改的特性,为物联网的安全性和可信度提供了强大的保障。本文将探…...
uniapp实现app自动更新
uniapp实现app自动更新: 实现步骤: 需要从后端读取最新版本的相关信息前端用户进入首页的时候,需要判断当前版本与后端返回来的版本是否一致,不一致且后端版本大于当前版本的话,就需要提示用户是否需要更新ÿ…...
智能滚动抽奖--测试报告
目录 一、项目背景 二、项目功能 三、测试计划 一)单元集成测试: 二)功能测试: 三)自动化测试: 四)存在问题 五)测试结果评估 四、总结 一、项目背景 1.随着数字营销的兴起&…...
天梯-这是字符串题
隐式转换 隐式转换是指编译器在没有显式提示的情况下,自动将一种数据类型转换为另一种数据类型。这种转换是语言规范允许的,并且通常是为了让代码更简洁、更自然。隐式转换的类型字符类型( char )可以隐式转换为其对应的ASCII码值…...
第六章 QT基础:4、QT的TCP网络编程
一、TCP 通信原理简介 TCP(Transmission Control Protocol)是一种面向连接的可靠通信协议,主要特性如下: [!NOTE] 三次握手建立连接 可靠传输:顺序、无丢包 面向流:数据无结构边界 适用场景:…...
Windows 各版本查找计算机 IP 地址指南
IP 地址是互联网协议地址 (Internet Protocol Address) 的缩写,它是分配给连接到使用互联网协议进行通信的网络的每个设备的数字标签,用于在网络中唯一标识该设备。查找您计算机的 IP 地址对于网络故障排除、配置网络设置、远程访问以及进行其他网络相关…...
程序员思维体操:TDD修炼手册
程序员思维体操:TDD修炼手册 ——从"先写代码"到"测试先行"的认知革命 一、重新认识TDD:不仅仅是写测试 什么是TDD(测试驱动开发) TDD其实很简单,不要看名字很高级复杂,传统开发是直…...
Java 实现SpringContextUtils工具类,手动获取Bean
SpringContextUtils 工具类实现 下面是一个完整的 Spring 上下文工具类实现,用于从 Spring 容器中获取 Bean。这个工具类考虑了线程安全、性能优化和易用性,并提供了多种获取 Bean 的方式。 完整实现代码 import org.springframework.beans.BeansExce…...
动态规划(一)【背包】
目录 01背包问题滚动数组优化(二维-->一维) 完全背包问题优化 多重背包二进制优化 感悟 动态规划 总而言之,就是利用 历史记录, 避免重复计算。 1.确定状态变量(函数) 2.确定状态转移方程 3.确定边界条…...
实验二 多线程编程实验
一、实验目的 1、掌握线程的概念,明确线程和进程的区别。 2、学习Linux下线程创建方法及编程。 3、了解线程的应用特点。 4、掌握用锁机制访问临界区实现互斥的方法。 5、掌握用信号量访问临界区实现互斥的方法。 6、掌握线程下用信号量实现同步操作的方法。 …...
密码学(1)LWE,RLWE,MLWE的区别和联系
一、定义与基本概念 LWE(Learning With Errors): 定义:LWE问题是在给定一个矩阵A和一个向量b^Axe(其中e是一个固定数值范围内随机采集的随机噪音向量)的情况下,求解未知的向量x。本质࿱…...
数据结构-链表
目录 一、链表的基本概念单链表定义双链表定义 二、链表的基本操作1. 创建链表2. 遍历链表3. 插入节点4. 删除节点5. 反转链表 三、链表的实际应用1. 操作系统中的内存管理2. 文件系统中的目录结构3. 浏览器历史记录 四、链表的优缺点优点缺点 五、总结 一、链表的基本概念 链…...
go中redis使用的简单介绍
目录 一、Redis 简介 二、Go中Redis的使用 1. 安装Go Redis包 2. 单机模式 连接示例 3. 哨兵模式 依赖 连接示例 三、Redis集群 1. 集群模式 集群部署 部署结构 使用redis-cli创建集群 连接示例 四、常用数据结构与操作 1. 字符串(String࿰…...
使用 JUnit 4在 Spring 中进行单元测试的完整步骤
以下是使用 JUnit 4 在 Spring 中进行单元测试的完整步骤,包含配置、核心注解、测试场景及代码示例: 1. 添加依赖 在 pom.xml 中引入必要的测试依赖(以 Spring 4/5 JUnit 4 为例): <!-- JUnit 4 --> <depe…...
第七节:进阶特性高频题-Vue3的ref与reactive选择策略
ref:基本类型(自动装箱为{ value: … }对象) reactive:对象/数组(直接解构会丢失响应性,需用toRefs) 一、核心差异对比 维度refreactive适用类型基本类型(string/number/boolean&a…...
Redis 详解:安装、数据类型、事务、配置、持久化、订阅/发布、主从复制、哨兵机制、缓存
目录 Redis 安装与数据类型 安装指南 Windows Linux 性能测试 基本知识 数据类型 String List(双向列表) Set(集合) Hash(哈希) Zset(有序集合) 高级功能 地理位置&am…...
第十篇:系统分析师第三遍——7、8章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
从 Vue 到 React:React.memo + useCallback 组合技
目录 一、Vue 与 React 的组件更新机制对比二、React.memo 是什么?三、常见坑:为什么我用了 React.memo 还是会重新渲染?四、解决方案:useMemo / useCallback 缓存引用五、Vue 3 中有类似的性能控制需求吗?六、组合优化…...
1656打印路径-Floyd/图论-链表/数据结构
蓝桥账户中心 1.税收: “城市的税收”:所以是中介点的税收,经过该点后加上 2.路径: 用数组存储前驱节点从而串成链表 pre[ i ][ j ]代表的是从 i 到 j 的最短路径上 j 的前驱节点是什么 那么便可以pre[ i ][ j ]k 把k加入pa…...
Linux网络编程 从集线器到交换机的网络通信全流程——基于Packet Tracer的深度实验
这里我们先下载一个软件:Packet Tracer 用来搭建网络拓扑图的,是模拟和查看数据在网络中传输的详细过程的 在软件这里可以添加设备 知识点1【集线器】(Hub) 1、先配置一下主机的IP 这里我们设置IP一定要在同一个网段ÿ…...
深入学习Axios:现代前端HTTP请求利器
文章目录 深入学习Axios:现代前端HTTP请求利器一、Axios简介与安装什么是Axios?安装Axios 二、Axios基础使用发起GET请求发起POST请求并发请求 三、Axios高级特性创建Axios实例配置默认值拦截器取消请求 四、Axios与TypeScript五、最佳实践1. 封装Axios2…...
FANUC机器人GI与GO位置数据传输设置
FANUC机器人GI与GO位置数据传输设置(整数小数分开发) 一、概述 在 Fanuc 机器人应用中,如果 IO 点位足够,可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…...
微服务 RabbitMQ 组件的介绍、安装与使用详解
微服务 RabbitMQ 组件的介绍、安装与使用 在现代微服务架构中,服务之间的通信通常采用消息队列的方式,来解耦服务之间的依赖、提高系统的可靠性和扩展性。RabbitMQ 作为一种高效、可靠的消息队列系统,已经广泛应用于微服务架构中。本文将介绍…...
Vue3速通笔记
Vue3入门到实战 尚硅谷Vue3入门到实战,最新版vue3TypeScript前端开发教程 1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n经历了:4800次提交、40个RFC、600次PR、300贡献者官方发版地…...
Spring Boot 项目:如何在 JAR 运行时读取外部配置文件
在 Spring Boot 项目中,我们常常需要在生产环境中灵活地配置应用,尤其是当我们将项目打包为 JAR 文件时,如何在运行时通过外部配置文件(如 application.yml 或 application.properties)替换 JAR 内部的配置就变得尤为重…...
Certimate本地化自动化 SSL/TLS 证书管理解决方案
一、背景与挑战 多域名管理复杂 运维团队往往需要为多个子域、泛域名乃至不同项目的域名分别申请证书,手动操作容易出错且耗时。续期易忘风险 主流免费证书(如 Let’s Encrypt)有效期仅 90 天,需要定期续期,人工监控门…...
vue+flask+lstm高校舆情分析系统 | 可获取最新数据!
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号:F020 gaoxiao 架构:vueflaskLSTMMySQL 功能: 微博信息爬取、情感分析、基于负面消极内容舆情分…...
Cisco-Torch:思科设备扫描器!全参数详细教程!Kali Linux教程!
简介 cisco-torch 与同类工具的主要区别在于其广泛使用 fork 技术,可以在后台启动多个扫描进程,从而最大限度地提高扫描效率。此外,它还可以根据需要同时使用多种应用层指纹识别方法。我们希望能够快速发现运行 Telnet、SSH、Web、NTP、TFTP…...
Go协程的调用与原理
Goroutine Go不需要像C或者Java那样手动管理线程,Go语言的goroutine机制自动帮你管理线程。 使用goroutine、 Go语言中使用goroutine非常简单,只需要在调用函数的时候在前面加上go关键字,就可以为一个函数创建一个goroutine。 一个gorout…...
论文精读:大规模MIMO波束选择问题的量子计算解决方案
论文精读:大规模MIMO波束选择问题的量子计算解决方案 概要: 随着大规模多输入多输出系统(MIMO)在5G及未来通信技术中的应用,波束选择问题(MBS)成为提升系统性能的关键。传统的波束选择方法面临计…...
将 MySQL 8 主从复制延迟优化到极致
目录 一、网络资源不足引起的复制延迟 1. 执行监控确认延迟原因 2. 估算所需带宽 (1)基本公式 (2)实际测量方法 二、大事务或大查询引起的复制延迟 1. 主库大事务 2. 从库大查询 3. 估算所需 I/O 能力 (1&am…...
路由与OSPF学习
【路由是跨网段通讯的必要条件】 路由指的是在网络中,数据包从源主机传输到目的主机的路径选择过程。 路由通常涉及以下几个关键元素: 1.路由器:是一种网络设备,负责将数据包从一个网络传输到另一个网络。路由器根据路由表来决定…...
Spring Security:企业级安全架构的设计哲学与工程实践
一、核心架构与设计理念 Spring Security作为Spring生态中的安全基石,其架构设计遵循**“分层过滤"与"组件化扩展”**两大原则。整个安全框架本质上是一个由多个过滤器构成的链式处理模型(Filter Chain),每个过滤器负责…...
NLP高频面试题(五十二)——BERT 变体详解
在现代自然语言处理领域,BERT 系列模型不断演进,衍生出多种变体,它们通过改进预训练任务、模型结构和训练策略,在不同应用场景下取得了更优表现。本文首先概览主要 BERT 变体(如 ALBERT、RoBERTa、ELECTRA、SpanBERT、Transformer-XL 等),随后针对以下几个关键问题逐一展…...
C++Primer 编程练习 第二章
最近想重新看一下CPrimer,顺便敲一下他的编程练习题,虽然很简单,但是就当是锻炼一下vim的熟练度和手感 由于按照章节顺序来说是初学者,不会对输入内容做过多的判断,只对问题作出基本实现 第二章 1 #include <ios…...
Vue.js 新手小白指南:从起源到实战
🌟 Vue 的来源 Vue.js 由**尤雨溪(Evan You)**在2014年创建,最初是作为个人项目开发,灵感来源于他在 Google 使用 AngularJS 的经验。Vue 的设计目标是提供一个更轻量级、更易上手的前端框架。 如今,Vue …...