多用户网页在线聊天室(测试报告)

文章目录

  • 多用户网页在线聊天室
    • 一,项目概括
      • 1.1 项目名称
      • 1.2 测试时间
      • 1.3 项目背景
      • 1.3 编写目的
    • 二,测试计划
      • 2.1 测试环境与配置
      • 2.2 测试用例
      • 2.3实际执行用例
        • 2.3.1登录
        • 2.3.2聊天消息列表展示
        • 2.3.3聊天消息详情页展示
        • 2.3.4联系人页展示
        • 2.3.5信息的编辑与发送
        • 2.3.6搜索框
    • 三、自动化测试工具
      • 3.1 注入依赖
      • 3.2 注册自动化测试
      • 3.3 未登录情况测试
      • 3.4 登录自动化测试
      • 3.5 聊天室页面自动化测试
      • 3.6 自动化测试结果总结
      • 3.6 自动化测试结果总结

多用户网页在线聊天室

一,项目概括

1.1 项目名称

多用户网页在线聊天室

1.2 测试时间

2024.6——2024.6

1.3 项目背景

随着现代互联网的快速发展,实时通信系统已成为人们日常交流的重要工具。为了让这个聊天室既好用又稳定,项目里加了一套“自动检查”系统(自动化测试)。比如登录、加好友、发消息这些核心功能,不用手动一遍遍测,而是用写好的程序自动模拟操作,快速发现问题。这样一来,无论用哪种浏览器或者网络环境,聊天功能都能稳稳运行,用户体验更流畅。

聊天室采用了Spring MVC作为后端框架,通过WebSocket实现消息的实时传输,前端使用原生HTML和CSS构建用户界面。项目的自动化测试部分通过Selenium编写,结合Python语言进行测试脚本开发,覆盖了用户登录、好友管理、消息传输等核心功能模块,确保用户能够在各类浏览器和网络条件下获得一致、流畅的聊天体验。

1.3 编写目的

对编写的网页聊天室项目进行软件测试活动,揭示潜在问题,总结测试过程种地成功经验与不足,以便于更好的进行测试工作


二,测试计划

2.1 测试环境与配置

平台:Windows 10
浏览器:Chrome
自动化测试工具:Selenium + Junit5

2.2 测试用例

2.3实际执行用例

2.3.1登录

用户名以及密码已经在后端写入了数据库是已经存在的,登录成功后就会跳转到聊天页面

输入正确的账号和密码(以用户"zhangsan"为例):

预期结果:出现登录成功的弹窗,点击后,跳转到博客列表页。

实际结果如下:

输入错误的账号或密码

预期结果:提示用户登录失败。

实际结果如下:在这里插入图片描述

2.3.2聊天消息列表展示

可以在列表页(主页)查看有限数量的聊天,其包括联系人名称、及最近一条消息内容。并且点击对应联系人之后会跳转到相应的聊天详情页

2.3.3聊天消息详情页展示

可以在详情页。查看具体聊天内容,其包括联系人名称、及聊天内容。

2.3.4联系人页展示

可以在联系人页展示查看联系人,其包括联系人名称。并且点击相应联系人后会跳转到相应聊天详情页。

image-20250312224144005

2.3.5信息的编辑与发送

可以在信息的编辑与发送页进行信息的操作,其包括编辑内容与发送内容。

image-20250312224349149

2.3.6搜索框

可以搜索内容输入内容点击“放大镜”按钮

image-20250312224443531

三、自动化测试工具

3.1 注入依赖

在maven—poom.xml中,引入依赖

 <dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!--  截图  --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies>   
  • 单例驱动

    • 自动化测试程序过程中,会频繁的使用驱动,如果频繁的创建和销毁,开销还是比较大的,因此我们可以使用懒汉模式加载驱动
    • 这样可以保证驱动不会频繁创建,能减轻程序刚开始启动时的系统开销(只有用到驱动是才会加载它)
    • 如果其他类需要使用到驱动的话,直接继承该类即可
  • 获取屏幕截图

    • 当我们测试用例出错时,我们需要查看当时网页出现的情况,那么就需要使用屏幕截图来排查问题
    • 使用 getScreenshotAs 方法来保存屏幕截图,在每个测试用例执行完后进行一次屏幕截图
    • 屏幕截图统一保存到一个路径下,文件名以当时时间去组织(防止保存屏幕截图出现覆盖情况)
    • 综上,我们便在 AutoTestUtils类下加上保存截图的方法,方便其他类调用

package common;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
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.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;public class AutoTestUtils {private static ChromeDriver driver;public static ChromeDriver getDriver() {ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");if (driver == null) {driver = new ChromeDriver(options);//创建隐式等待,设置最长等待时间10sdriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);}return driver;}/*** 获取屏幕截图,将用例执行结果保存下来*/public void getScreenShot(String str) throws IOException {List<String> list = getTime();String fileName = "./src/main/java/chatRoomAutoTest/" + list.get(0) + list.get(0) + "/" + str + "_" + list.get(1) + ".png";File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);//把生成的截图放入指定路径FileUtils.copyFile(srcFile,new File(fileName));}//获取当前时间(记录每个屏幕截图是什么时候拍摄的)private List<String> getTime() {SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");//保存的文件夹名 当天的年月日 + 具体时间String fileName = sdf1.format(System.currentTimeMillis());//保存的图片名  当天的年月日String dirName = sdf2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirName);list.add(fileName);return list;}}

3.2 注册自动化测试

此处我们创建一个 RegTest 类继承 AutoTestUtils 类得到驱动

先测试注册页面是否正常打开,输入.最后进行相应弹窗处理,进行屏幕截图


package UserTest;import common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;import java.io.IOException;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegTest extends AutoTestUtils {//获取到驱动private static WebDriver driver = AutoTestUtils.getDriver();/*** 打开网页* 注册网页一般是从登录页面进入*/@BeforeAllpublic static void openWeb() {//打开登录页面driver.get("http://182.92.153.14:9091/login.html");//再点击登录页面的注册链接按钮driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > a")).click();driver.manage().window().maximize();}/*** 验证网页正常打开*/@Test@Order(1)public void elementsAppear() throws IOException {//用户名输入框driver.findElement(By.cssSelector("#username"));//密码输入框driver.findElement(By.cssSelector("#password"));//注册按钮driver.findElement(By.cssSelector("#submit"));//登录账号链接driver.findElement(By.cssSelector("body > div.register-container > div > div:nth-child(4) > a"));getScreenShot(getClass().getName());}/*** 注册失败测试用例* 参数: 尝试注册已注册用户*/@ParameterizedTest@CsvSource({"zhangsan,123"})@Order(2)public void regFunTest(String username, String passowrd) throws InterruptedException, IOException {//输入账号driver.findElement(By.cssSelector("#username")).sendKeys(username);//输入密码driver.findElement(By.cssSelector("#password")).sendKeys(passowrd);//点击注册driver.findElement(By.cssSelector("#submit")).click();//等待弹窗sleep(3000);//期望结果String expect = "注册失败!";String actual = driver.switchTo().alert().getText();Alert alert = driver.switchTo().alert();if (alert != null) {alert.accept();} else {actual = "当前用例执行失败";}//断言Assertions.assertEquals(expect, actual);//屏幕截图getScreenShot(getClass().getName());}/*** 注册成功测试用例*/@ParameterizedTest@CsvSource({"lisi,123,注册成功!"})@Order(3)public void regTest(String username, String password,String expect) throws InterruptedException, IOException {//拿到元素WebElement inputUserName = driver.findElement(By.cssSelector("#username"));WebElement inputPassword = driver.findElement(By.cssSelector("#password"));WebElement button = driver.findElement(By.cssSelector("#submit"));//清除输入框inputUserName.clear();inputPassword.clear();//输入用例inputUserName.sendKeys(username);inputPassword.sendKeys(password);//提交button.click();//强制等待弹窗Thread.sleep(100);Alert alert = driver.switchTo().alert();//期望结果String actual = "注册成功!";if(alert != null) {alert.accept();}else {actual = "当前用例执行失败";}Assertions.assertEquals(expect,actual);//屏幕截图getScreenShot(getClass().getName());}
}

3.3 未登录情况测试

此处我们创建一个 InterceptTest 类继承 AutoTestUtils 类得到驱动

测试未登录情况下,打开会话页面,进行相应弹窗处理,进行屏幕截图


package UserTest;import common.AutoTestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.chrome.ChromeDriver;import static java.lang.Thread.sleep;public class InterceptTest extends AutoTestUtils {//获取驱动private static ChromeDriver driver = AutoTestUtils.getDriver();@Testpublic void Intercept() throws InterruptedException {//在未登录的情况下,跳转会话页driver.get("http://182.92.153.14:9091/client.html");sleep(2000);//期望结果String expect = "当前用户未登录!";String actual = "当前用户未登录!";Alert alert = driver.switchTo().alert();if (alert != null) {alert.accept();} else {actual = "当前用例执行失败";}//屏幕截图getScreenShot(getClass().getName());//断言Assertions.assertEquals(expect,actual);}
}

3.4 登录自动化测试

此处我们创建一个 LoginTest 类继承 AutoTestUtils 类得到驱动

先测试登录页面是否正常打开,再找几个典型的用例对异常,正常登录风别进行测试

最后进行相应弹窗处理,进行屏幕截图

package UserTest;import common.AutoTestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;import java.io.IOException;import static java.lang.Thread.sleep;public class LoginTest extends AutoTestUtils {//获取到驱动private static WebDriver driver = AutoTestUtils.getDriver();/*** 打开页面* 注册页面一般是从登录页面进入*/@BeforeAllpublic static void openWeb() {//先打开登录页面driver.get("http://182.92.153.14:9091/login.html");driver.manage().window().maximize();}/*** 检测登录页面是否能正常打开*/@Test@Order(1)public void elementsAppear() throws IOException {//用户名输入框driver.findElement(By.cssSelector("#username"));//密码输入框driver.findElement(By.cssSelector("#password"));//注册账号链接driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > a"));//登录按钮driver.findElement(By.cssSelector("#submit"));//屏幕截图getScreenShot(getClass().getName());}/*** 异常测试登录功能* 参数一:尝试登录未注册用户* 参数二:密码输入错误,登录账号*/@ParameterizedTest@CsvSource({"zhang,123","zhangsan,123456"})@Order(2)public void loginAbnormalTest(String username,String password) throws InterruptedException, IOException {//拿到元素WebElement inputUserName = driver.findElement(By.cssSelector("#username"));WebElement inputPassword = driver.findElement(By.cssSelector("#password"));WebElement button = driver.findElement(By.cssSelector("#submit"));//清除用户名,密码inputUserName.clear();inputPassword.clear();//输入账号,密码inputUserName.sendKeys(username);inputPassword.sendKeys(password);//点击登录button.click();//等待弹窗sleep(3000);//期望结果String expect = "登录失败!";String actual = "登录失败!";Alert alert = driver.switchTo().alert();if(alert != null) {alert.accept();} else {actual = "当前用例执行失败!";}Assertions.assertEquals(expect,actual);//屏幕截图getScreenShot(getClass().getName());}/*** 正常登录测试*/@ParameterizedTest@CsvSource({"'zhangsan','123','登陆成功'"})@Order(3)public void loginNormalTest(String userName,String password,String expect) throws InterruptedException, IOException {//发现元素WebElement inputUserName = driver.findElement(By.cssSelector("#username"));WebElement inputPassword = driver.findElement(By.cssSelector("#password"));WebElement button = driver.findElement(By.cssSelector("#submit"));//清除用户名密码inputUserName.clear();inputPassword.clear();//输入用户名,密码inputUserName.sendKeys(userName);inputPassword.sendKeys(password);//点击登录button.click();//等待弹窗sleep(3000);//期望结果String actual = driver.switchTo().alert().getText();//断言Assertions.assertEquals(expect,actual);//处理弹窗driver.switchTo().alert().accept();//屏幕截图getScreenShot(getClass().getName());}
}

3.5 聊天室页面自动化测试

此处我们创建一个 ClientTest 类继承 AutoTestUtils 类得到驱动

先对页面功能以及聊天功能进行自动化测试,进行相应的弹窗处理,最后进行屏幕截截图

package UserTest;import common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;import java.io.IOException;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ClientTest extends AutoTestUtils {//获得驱动public static WebDriver driver = AutoTestUtils.getDriver();/*** 打开会话页面*/@BeforeAllpublic static void openWeb() {//先打开会话页面driver.get("http://182.92.153.14:9091/client.html");driver.manage().window().maximize();}/*** 测试会话页面正常打开*/@Test@Order(1)public void elementsAppear() throws IOException {//主页个人账号名driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.user"));//搜索输入框driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > input[type=text]"));//搜索按钮driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.search > button"));//会话标签图driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-session"));//好友标签图driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend"));//聊天输入框driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea"));//发送按钮driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button"));//屏幕截图getScreenShot(getClass().getName());}/*** 点击具体会话* 检验:消息页面展示当前会话用户名字*/@Order(2)@Testvoid SessionList() throws InterruptedException {//点击具体会话driver.findElement(By.xpath("//*[@id=\"session-list\"]/li[1]/h3")).click();sleep(3000);//获取到消息页面展示当前用户名字String actual = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title")).getText();Assertions.assertEquals("wangwu",actual);}/*** 点击好友列表*/@Order(3)@Testvoid FriendList() throws InterruptedException {//点击好友按钮,打开好友列表driver.findElement(By.cssSelector("body > div.client-container > div > div.left > div.tab > div.tab-friend")).click();sleep(3000);//点击好友driver.findElement(By.xpath("//*[@id=\"friend-list\"]/li[1]/h4")).click();sleep(3000);//检验选中的好友在会话列表是否被置顶String text = driver.findElement(By.cssSelector("#session-list > li.selected > h3")).getText();Assertions.assertEquals("lisi",text);}/*** 测试聊天发送功能* 参数:zhangsan 给  wangwu 发送数据*/@ParameterizedTest@CsvSource({"正在自动化测试中...","测试发送成功","测试结束!"})@Order(4)public void TalkSendTest(String msg) throws InterruptedException, IOException {//点击好友会话开始聊天driver.findElement(By.xpath("//*[@id=\"session-list\"]/li[2]/h3")).click();sleep(3000);//选择输入框开始聊天driver.findElement(By.cssSelector("body > div.client-container > div > div.right > textarea")).sendKeys(msg);//点击发送driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.ctrl > button")).click();sleep(3000);//判断消息是否发送成功//屏幕截图getScreenShot(getClass().getName());}/*** 测试聊天接收功能* 参数:登录 wangwu 查看与 zhangsan 历史会话,检验是否发送成功*/@Test@Order(5)public void TalkAcceptTest() throws InterruptedException {//打开页面driver.get("http://182.92.153.14:9091/login.html");sleep(3000);//输入账号driver.findElement(By.cssSelector("#username")).sendKeys("wangwu");//输入密码driver.findElement(By.cssSelector("#password")).sendKeys("123");//点击登录driver.findElement(By.cssSelector("#submit")).click();sleep(3000);//确认弹窗driver.switchTo().alert().accept();sleep(3000);//点击 zhangsan 会话driver.findElement(By.cssSelector("#session-list > li > h3")).click();//获取好友名String name = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title")).getText();//获取最后一条消息String text = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:nth-child(3) > div > p")).getText();//判断好友是否一致Assertions.assertEquals("zhangsan",name);//判断消息是否一致Assertions.assertEquals("测试结束!",text);}
}

3.6 自动化测试结果总结

    driver.switchTo().alert().accept();sleep(3000);//点击 zhangsan 会话driver.findElement(By.cssSelector("#session-list > li > h3")).click();//获取好友名String name = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.title")).getText();//获取最后一条消息String text = driver.findElement(By.cssSelector("body > div.client-container > div > div.right > div.message-show > div:nth-child(3) > div > p")).getText();//判断好友是否一致Assertions.assertEquals("zhangsan",name);//判断消息是否一致Assertions.assertEquals("测试结束!",text);}
}

3.6 自动化测试结果总结

image-20250312225452566

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自由学习记录(43)

不同的服务器可以使用不同协议&#xff0c;但协议本身不会决定服务器的类型 类型特点物理服务器真实的计算机&#xff08;如 Dell、HP 服务器&#xff09;虚拟服务器运行在云计算平台上的 VM&#xff08;如 AWS EC2、阿里云 ECS&#xff09;容器化服务器通过 Docker / Kuberne…

Vue框架

一. 什么是Vue 1. Vue是一款用于构建用户界面的渐进式的JavaScript框架。(官方&#xff1a;https://cn.vuejs.org/) 2. 框架&#xff1a;就是一套完整的项目解决方案&#xff0c;用于快速构建项目 3. 优点&#xff1a;大大提升前端项目的开发效率 4. 缺点&#xff1a;需要理解记…

强大的数据库DevOps工具:NineData 社区版

本文作者司马辽太杰&#xff0c; gzh&#xff1a;程序猿读历史 在业务快速变化与数据安全日益重要的今天&#xff0c;生产数据库变更管理、版本控制、数据使用是数据库领域的核心挑战之一。传统的解决方式往往采用邮件或即时通讯工具发起审批流程&#xff0c;再通过堡垒机直连数…

数字IC后端设计实现教程 |Innovus ICC2 Routing Pin Access Setting设置方法

默认情况下routing 引擎可以在标准单元可以打孔的任何地方&#xff08;via region&#xff09;打孔&#xff0c;甚至工具还会先拉出一块metal&#xff0c;然后再打孔过渡到高层。 随之工艺节点越做越小&#xff0c;标准单元内部的结构也越来越复杂。此时如果还沿用传统工艺的走…

珠算之珠心算观想算盘

一个好的观想算盘&#xff0c;会对珠心算学习效率的提高起到巨大的促进作用。 在传统的珠心算教学中&#xff0c;人们在观想算盘时&#xff0c;基本都是以自己手中所拿的实际算盘为参照模型进行观想的。由于市场上的算盘样式繁多&#xff0c;学生观想算盘时的参照算盘也是五花…

相册app

myphone 项目地址 &#xff1a; 相册app 技术点&#xff1a; electron mysql npm 图片展示 数据库表

idea超级AI插件,让 AI 为 Java 工程师

引言​ 用户可在界面中直接通过输入自然语言的形式描述接口的需求&#xff0c;系统通过输入的需求自动分析关键的功能点有哪些&#xff0c;并对不确定方案的需求提供多种选择&#xff0c;以及对需求上下文进行补充&#xff0c;用户修改确定需求后&#xff0c;系统会根据需求设…

Spring AI与DeepSeek实战二:打造企业级智能体

一、概述 智能体 Agent 能自主执行任务实现特定目标的 AI 程序。传统 AI&#xff08;如ChatGPT&#xff09;主要依靠用户输入指令&#xff0c;而智能体 Agent 可以自主思考、决策&#xff0c;并执行复杂任务&#xff0c;就像一个AI助手&#xff0c;能够独立完成多步操作。本文…

【C++】 —— 笔试刷题day_3

刷题_day3 继续加油&#xff01;&#xff01;&#xff01; 一、简写单词 题目链接&#xff1a;简写单词 题目描述 这道题比较简单&#xff0c;题目说的也非常简单明了 输入一行复合词&#xff0c;要求我们输出每个单词的首字母大写。 算法思路 这里我们可以看到输入的复合词…

数学建模:MATLAB强化学习

一、强化学习简述 强化学习是一种通过与环境交互&#xff0c;学习状态到行为的映射关系&#xff0c;以获得最大积累期望回报的方法。包含环境&#xff0c;动作和奖励三部分&#xff0c;本质是智能体通过与环境的交互&#xff0c;使得其作出的动作所得到的决策得到的总的奖励达…

C++:二分习题

1. 借教室 503. 借教室 - AcWing题库 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海…

二进制安装指定版本的MariaDBv10.11.6

一、官网下载mariadb安装包 Download MariaDB Server - MariaDB.org 找到对应的版本 下载安装包后上传到服务器这里不再赘述。 二、安装二进制包 1、解压安装包 2、查看安装包内的安装提示文档根据提示文档进行安装 # 解压安装包 tar xf mariadb-10.11.6-linux-systemd-x8…

2025-03-12 Python深度学习1——安装Anaconda与PyTorch库

文章目录 1 配置 Anaconda1.1 下载1.2 安装1.3 配置环境变量1.4 检查安装 2 安装 PyTorch 库2.1 创建 DL 环境2.2 安装/升级 CUDA2.3 配置环境变量2.4 安装 Pytorch 库方法一&#xff08;不稳定&#xff09;方法二&#xff08;推荐&#xff09; 2.5 检查安装 3 Pycharm Communi…

Redis-缓存穿透击穿雪崩

1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中&#xff0c;先查缓存&#xff0c;缓存没有数据&#xff0c;就会请求到数据库上&#xff0c;导致数据库压力剧增。 解决方法&#xff1a; 给不存在的key加上空值&#xff0c;防止每次都会请求到数据库。布隆过滤器…

学习springboot(Bean 注册,Bean 扫描)

Bean 扫描 可以浏览下面的博客链接 &#xff1a;spring 学习 &#xff08;注解&#xff09;-CSDN博客 在学习spring 注解时&#xff0c;我们使用 Component &#xff0c;Service,Controller等 这样的注解&#xff0c;将目标类信息&#xff0c;传递给IOC容器&#xff0c;为其创…

使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图

以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图&#xff1a; graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …

网络信息安全专业(710207)网络安全攻防实训室建设方案

一、引言 随着信息技术的飞速发展&#xff0c;网络空间安全已成为国家安全的重要组成部分&#xff0c;对网络信息安全专业人才的需求日益增长。为满足网络信息安全专业&#xff08;专业代码710207&#xff09;的教学需求&#xff0c;提升学生在网络安全攻防领域的实践能力&…

赶紧白P这款免费神器!

现在&#xff0c;很多视频剪辑软件都开始收费了&#xff0c;真正免费又好用的软件真的越来越难找了。 今天&#xff0c;我给大家推荐一款非常小巧的视频编辑工具&#xff0c;目前完全免费&#xff0c;功能却非常丰富。 咔咔一通剪 视频编辑工具 这款软件真的超级轻巧&#xff…

Qt 初识1.1

目录 QLineEdit QPushButton connet&#xff1a; Qt命名规范 Qt窗口坐标系 QLineEdit ​ ​ QPushButton ​ 给按钮的点击操作上关联一个处理函数。 connet&#xff1a; connet的作用是连接信号和槽&#xff0c;是QObject类中的一个静态函数&#xff0c; ​ Qt命…

Linux内核机制之epoll详解

目录 简介&#xff1a; 一、IO 多路复用介绍 1、select&#xff0c;poll&#xff0c;epoll 引入 2、select&#xff0c;poll&#xff0c;epoll 区别分析 3、epoll 原理 3.1 epoll 相关函数介绍 1&#xff09;epoll_create 2&#xff09;epoll_ctl 3&#xff09;epoll_…