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

【Java项目测试报告】:在线聊天平台(Online-Chat)

被测试项目已部署:登录页面http://123.249.78.82:8080/login.html

一、项目背景

1.1 测试目标

验证系统功能完整性,确保用户管理、消息传输、好友管理等核心模块符合需求。

1.2 项目技术栈

后端:Spring Boot/Spring MVC/WebSocket

数据库:MySQL

前端:原生HTML/CSS

1.3 文档引用

1.3.1 项目需求文档:

在线聊天平台(Online-Chat)需求文档

1.3.2 项目接口文档:

在线聊天平台(Online-Chat)接口文档

1.4 项目源码:

在线聊天平台(Online-Chat)项目源码

1.5. 测试环境

硬件:Lenovo y9000p 2022
手动测试浏览器: Microsoft Edge版本 125.0.2535.85 (正式版本) (64 位)
开发工具:IntelliJ IDEA 2023.3.1
测试工具:自动化测试工具Selenium 4.21.0 
操作系统:Windows 11家庭中文版
自动化测试浏览器版本:Google Chrome 137.0.7151.41(正式版本)(64 位)



二、测试分类:

2.1 需求分析测试

1. 用户管理模块

需求覆盖性

注册/登录功能满足基础用户认证需求,但缺乏密码安全机制(如强度校验、重复密码输入、验证码)

改进建议:

增加密码复杂度规则(如至少8位,含字母和数字)


2. 主界面模块

改进建议:

明确昵称来源:注册时增加“昵称”字段,或默认使用用户名


3. 好友管理模块

需求覆盖性

模糊搜索功能需明确匹配规则(如前缀匹配、全字段匹配),避免性能问题,

好友申请流程完整,但未说明申请记录存储方式(如数据库表设计)

改进建议:

优化搜索性能:后端分页查询 + 缓存机制。

补充好友申请状态管理(如“待处理”“已通过”“已拒绝”)。


4. 会话管理模块

需求覆盖性

首次选中好友自动生成会话合理,但未定义会话删除或归档逻辑

历史消息加载需考虑数据量过大时的分页加载策略

改进建议:

增加会话删除功能

历史消息采用懒加载或分页机制,提升响应速度


5. 消息传输模块

需求覆盖性

实时消息推送(WebSocket)与非实时存储(MySQL)方案合理,但未设计消息去重或重试机制

改进建议:

补充消息状态标识(如“已发送”“已送达”“已读”)

增加消息存储策略(如超过1年的消息自动归档)


6. 非功能需求

可行性分析

实时性:WebSocket 适合小规模高并发,需结合负载均衡技术应对大规模场景

数据持久化:MySQL 需设计索引优化查询效率(如按用户ID、时间戳索引)



2.2 功能测试

2.2.1测试用例设计

登录页面测试:

注册页面测试:

主页面测试:


2.2.2 手动测试系统

1. 注册页面

正常注册:

重复用户注册:

2. 登录页面

正常登录:

密码或者用户名错误登录:

3. 主界面:

4. 会话消息列表

5. 实时信息交流


2.2.3 功能测试结果:

测试用例:105

覆盖率:90%

测试方式:手动测试

通过率:99%,出现bug一处,已解决(用户注册模块用户名长度校验缺失


2.3 UI自动化测试:

2.3.1 自动化测试覆盖模块:

注册页面,登录页面,“关于我们”,主页面,添加好友页面,好友页面,会话页面,消息发送页面

2.3.2 自动化测试源码链接:

Online-Chat 自动化测试源码

部分自动化代码展示:

工具类:

package common;public class Utils {public static WebDriver driver = null;public WebDriverWait wait = null;//调用driver对象public Utils(String url){driver = createDriver();driver.get(url);wait = new WebDriverWait(driver, Duration.ofSeconds(3));}private WebDriver createDriver() {//获取驱动对象if(driver==null){//下载驱动//WebDriverManager.chromedriver().setup();//使用本地驱动System.setProperty("webdriver.chrome.driver", "D:/chromedriver-win64 (4)/chromedriver-win64/chromedriver.exe"); //添加配置,允许访问所有网站ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");//创建驱动对象driver = new ChromeDriver(options);}//显示等待wait = new WebDriverWait(driver, Duration.ofSeconds(5));return driver;}/*** 屏幕截图* 屏幕截图文件目录* ./src/test/java/images/*                       /2025-04-29/*                                  /test01-20123010.png*                                  /test02-20133510.png*                       /2025-04-30/*                                  /test01-20123010.png*      *                           /test02-20133510.png**str:方法名/类名*/public void ScreenShot(String str) throws IOException {//年月日SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");//时分秒SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//图片文件名:路径+图片名称// ./src/test/java/images/2025-04-29/test01-20123010.pngString filename = "./src/test/java/images/" + dirTime + "/" + str + "-" + fileTime + ".png";//获取WebDriver实例的截图并保存为文件File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);//将截图文件复制到目标文件路径FileUtils.copyFile(srcFile,new File(filename));}/*** 销毁driver对象——关闭浏览器*/public static void quit(){if(driver != null)driver.quit();}}

主页面测试方法:

package Tests;public class ClientPage extends Utils {public static String url = "http://123.249.78.82:8080/client.html";public ClientPage() {super(url);}public void searchAndAddFriends() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));// 输入搜索内容wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#search-input"))).sendKeys("u");// 点击搜索按钮wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#search-button"))).click();wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#search-input"))).clear();//等待结果列表可见wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#friend-result:not(.hide)")));// 点击第一个结果按钮wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#friend-result > div:first-child > button"))).click();// 处理弹窗wait.until(ExpectedConditions.alertIsPresent());driver.switchTo().alert().accept();
}public void createSession() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));// 1. 点击好友标签切换视图wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#friend-tab"))).click();// 2. 等待好友列表可见wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#friend-list:not(.hide)")));// 3. 等待列表项加载完成wait.until(d -> d.findElements(By.cssSelector("#friend-list > li")).size() > 0);// 4. 使用JavaScript点击确保稳定性WebElement lastFriend = driver.findElement(By.cssSelector("#friend-list > li:last-child"));((JavascriptExecutor)driver).executeScript("arguments[0].click();", lastFriend);}public void sendMessage() throws IOException {// 1. 等待会话列表容器可见wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#session-list")));driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/textarea")).clear();driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/textarea")).sendKeys("hello");ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());driver.findElement(By.cssSelector("#buttonsendtext")).click();}public void cilckSession() {// 定位到 session-list 下的第一个 <li> 元素并点击driver.findElement(By.xpath("//*[@id='session-list']/li[1]")).click();//隐式等待1000毫秒driver.manage().timeouts().implicitlyWait(Duration.ofMillis(5000));}public void cilckSession2() {driver.manage().timeouts().implicitlyWait(Duration.ofMillis(5000));// 定位到 session-list 下的第一个 <li> 元素并点击driver.findElement(By.xpath("//*[@id='session-list']/li[1]")).click();}
}


2.3.3 自动化测试结果

测试用例:15

覆盖率:90%

框架:Selenium+Maven

通过率:98%,发现bug两处,已修复(登录输入未注册用户卡死、注册密码单个字符也可成功

自动化屏幕关键截图:



三、测试结论与建议

3.1 测试结果汇总

功能测试结果

        测试用例:105

        覆盖率:90%(覆盖核心功能及部分非功能性需求)

        测试方式:手动测试

        通过率:99%,发现1处Bug(用户注册模块用户名长度校验缺失),已修复。


自动化测试结果

        测试用例:20

        覆盖率:90%(覆盖主流程及关键交互场景)

        框架:Selenium + Maven

        通过率:98%,发现2处Bug(登录输入未注册用户卡死、注册密码单个字符也可成功),

        已修复。

        自动化屏幕关键截图:已归档至测试报告源码代码包。


需求覆盖性总结
基于2.1需求分析测试,各模块需求覆盖情况如下:

  1. 用户管理模块:覆盖基础注册/登录功能,但密码安全机制未完全实现(如复杂度校验)。

  2. 好友管理模块:模糊搜索功能覆盖。

  3. 会话管理模块:会话生成功能通过,删除与历史消息分页逻辑未测试。

  4. 消息传输模块:实时推送与存储方案验证通过,消息状态标识未补充。


3.2 通过项

核心功能通过率99%,包括:

        用户注册/登录流程

        好友添加与申请管理

        实时消息收发

        会话自动生成与历史消息加载


3.3 风险项

高风险项

高并发场景未充分测试:当前仅验证WebSocket单节点性能,未结合负载均衡进行分布式压测。
建议:使用JMeter模拟1000+并发用户,验证消息推送延迟及MySQL连接池稳定性。

遗留风险

        部分需求未完全覆盖:

                密码复杂度规则未实现(需开发补充)。

                好友搜索缓存机制未落地(潜在性能瓶颈)。

        测试时间紧张:

                主功能优先,部分边缘场景(如昵称默认规则、消息自动归档)未覆盖。


3.4 上线建议

上线条件:

        主功能测试通过,修复Bug已验证,风险可控,建议按计划上线。

上线后监控措施:

        高优观察项:

                实时消息推送延迟(重点关注高峰时段)。

                好友搜索接口响应时间(监控ES或缓存命中率)。

        用户反馈:

                收集用户密码设置体验,评估安全机制补充优先级。

                跟踪会话删除需求反馈,纳入迭代优化。

后续优化建议:

        需求侧补充:

                密码强度校验(至少8位,字母+数字组合)。

                消息状态标识(“已读/未读”)及年度归档策略。

        技术侧优化:

                引入Redis缓存好友搜索结果,降低数据库压力。

                历史消息分页加载(每页20条,懒加载触发)。


相关文章:

  • 2025年渗透测试面试题总结-匿名[社招]前端安全(题目+回答)
  • windows10重装ssh无法下载
  • 大模型推理 memory bandwidth bound (5) - Medusa
  • No such file or directory: ‘ffprobe‘
  • MongoDB 数据库迁移:完整指南与最佳实践
  • 行为型:模板方法模式
  • Linux--环境的搭建(云服务器)
  • 二建考试《专业工程管理与实务》科目包含哪些专业?
  • 52页 @《人工智能生命体 新启点》中國龍 原创连载
  • C++系统IO
  • C++学习之STL学习:string类使用
  • 《深入Python:新手易踩的语法雷区与进阶启示》
  • 再谈Linux 进程:进程等待、进程替换与环境变量
  • 【Node.js】高级主题
  • 鸿蒙UI开发——Builder函数的封装
  • 怎么开发一个网络协议模块(C语言框架)之(一) main
  • 连接表、视图和存储过程
  • 使用LLaMA-Factory微调ollama中的大模型(二)------使用数据集微调大模型
  • 织梦dedecms上传附件不自动改名的办法
  • Vanna.AI:解锁连表查询的新境界
  • 购物网站名称/seo招聘
  • 创建简易个人网站/推广普通话的意义论文
  • 红桃免费观看电视剧高清斗破苍穹/贵港网站seo
  • 网站二维码收费怎么做/联合早报 即时消息
  • 甘德县wap网站建设公司/宁波网站推广哪家公司好
  • 武汉网站建站/立即优化在哪里