【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
开发工具IntelliJ IDEA 2023.3.1
自动化测试工具Selenium 4.21.0
操作系统Windows 11 家庭中文版
自动化测试浏览器Google Chrome 137.0.7151.41


二、测试分类:

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条,懒加载触发)。


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

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

相关文章

RAGFlow与Dify的深度刨析

目录 一、RAGFlow 框架 二、Dify 框架 三、两者集成 四、深度对比 1. 核心定位对比 2. 核心功能对比 3. 技术架构对比 4. 部署与成本 5. 适用场景推荐 总结 一、RAGFlow 框架 RAGFlow 是一个专注于深度文档理解和检索增强生成&#xff08;RAG&#xff09;技术的框架…

CQF预备知识:一、微积分 -- 1.2.2 函数f(x)的类型详解

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 &#x1f4d6; 数学入门全解 本系列教程为CQF(国际量化金融分析师证书)认证所需的数学预备知识&#xff0c;涵盖所有需要了解的数学基础知识…

嵌入式工程师常用软件

1、 Git Git 是公司常用的版本管理工具&#xff0c;人人都要会。在线的 git 教程可以参考菜鸟教程&#xff1a; https://www.runoob.com/git/git-tutorial.html 电子书教程请在搜索栏搜索&#xff1a; git Git 教程很多&#xff0c;常用的命令如下&#xff0c;这些命令可…

TReport组件指南总结

1. TReport 组件简介 TReport 是一个用于生成和打印报表的组件,通常用于连接数据集(如 TDataSet)并设计复杂的报表布局。它支持动态数据绑定、多页报表、分组统计、图表插入等功能。 2. 安装与配置 安装:如果使用的是第三方报表工具(如 Rave Reports),需在 Delphi 中通…

spark任务的提交流程

目录 spark任务的提交流程1. 资源申请与初始化2. 任务划分与调度3. 任务执行4. 资源释放与结果处理附:关键组件协作示意图扩展说明SparkContext介绍 spark任务的提交流程 用户创建一个 Spark Context;Spark Context 去找 Cluster Manager 申请资源同时说明需要多少 CPU 和内…

【C++】C++异步编程四剑客:future、async、promise和packaged_task详解

C异步编程四剑客&#xff1a;future、async、promise和packaged_task详解 1. 引言 1.1 异步编程的重要性 在现代C编程中&#xff0c;异步操作是提高程序性能和响应能力的关键技术。它允许程序在等待耗时操作&#xff08;如I/O、网络请求或复杂计算&#xff09;完成时继续执行…

2021-10-28 C++判断完全平方数

缘由判断一个整数是否为完全平方数-编程语言-CSDN问答 整数用平方法小数用5分法逼近。 int 判断平方数(int n) {//缘由https://ask.csdn.net/questions/7546950?spm1005.2025.3001.5141int a 1;while (a < n / a)if (a*a < n)a;else if (a*a n)return 1;elsereturn 0…

解决weman框架redis报错:Class “llluminatelRedis\RedisManager“ not found

解决weman框架redis报错&#xff1a;Class "llluminatelRedis\RedisManager" not found 报错解决方案 报错 解决方案 按照手册执行 composer require psr/container ^1.1.1 illuminate/redis illuminate/events 安装redis组件 然后restart重启就行了 php webman s…

Windows 11 电源计划进阶——通过异类策略优化大小核CPU调度

一、为什么需要手动控制大小核调度&#xff1f; 1.1 Intel 12/13/14代酷睿与Win11的适配现状 Intel 12代酷睿首次引入混合架构设计&#xff08;P-Core性能核 E-Core能效核&#xff09;&#xff0c;Windows 11虽然原生支持线程调度器&#xff08;Thread Director&#xff09;…

文件系统·linux

目录 磁盘简介 Ext文件系统 块 分区 分组 inode 再谈inode 路径解析 路径缓存 再再看inode 挂载 小知识 磁盘简介 磁盘&#xff1a;一个机械设备&#xff0c;用于储存数据。 未被打开的文件都是存在磁盘上的&#xff0c;被打开的加载到内存中。 扇区&#xff1a;是…

如何使用redis做限流(golang实现小样)

在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…

手写ES6 Promise() 相关函数

手写 Promise() 相关函数&#xff1a; Promise()、then()、catch()、finally() // 定义三种状态常量 const PENDING pending const FULFILLED fulfilled const REJECTED rejectedclass MyPromise {/*定义状态和结果两个私有属性:1.使用 # 语法&#xff08;ES2022 官方私有字…

Redis学习专题(五)缓存穿透、缓存击穿、缓存雪崩

目录 一、缓存穿透 缓存穿透的原因&#xff1a; 缓存穿透的现象&#xff1a; 缓存穿透的解决办法&#xff1a; 二、缓存击穿 缓存击穿的原因&#xff1a; 缓存击穿的现象&#xff1a; 缓存击穿的解决办法: 三、缓存雪崩 缓存雪崩的原因&#xff1a; 缓存雪崩的现象&…

【Hadoop】大数据技术之 MapReduce

目录 一、MapReduce概述 1.1 MapReduce 定义 1.2 MapReduce优缺点 1.3 MapReduce 核心思想 1.4 MapReduce 进程 1.5 常用数据序列化类型 1.6 MapReduce 编程规范 二、WordCound 案例 2.1 环境准备 2.2 编写程序 三、MapReduce 工作流程 一、MapReduce概述 1.1 MapRe…

国际前沿知识系列三:解决泛化能力不足问题

目录 国际前沿知识系列三&#xff1a;解决泛化能力不足问题 一、子类建模法与分类建模法在脑区应变预测中的应用 &#xff08;一&#xff09;子类建模法 案例分析 &#xff08;二&#xff09;分类建模法 案例分析 二、基于迁移学习和数据融合的大脑应变预测模型改良 &a…

client.chat.completions.create方法参数详解

response client.chat.completions.create(model"gpt-3.5-turbo", # 必需参数messages[], # 必需参数temperature1.0, # 可选参数max_tokensNone, # 可选参数top_p1.0, # 可选参数frequency_penalty0.0, # 可选参数presenc…

iOS 15.4.1 TrollStore(巨魔商店)安装教程详解:第二篇

🚀 iOS 15.4.1 TrollStore(巨魔商店)安装教程详解 ✨ 前言🛠️ 如何安装 TrollStore?第一步:打开 Safari 浏览器第二步:选择对应系统版本安装方式第三步:访问地址,下载配置文件(plist)第四步:安装配置文件第五步:“jailbreaks.app” 请求安装 TrollHelper第六步…

SQL的RAND用法和指定生成随机数的范围

SQL中的RAND函数能够满足多种随机数生成的需求。通过合理地使用种子、结合一些SQL语句&#xff0c;我们可以实现灵活的随机数生成。在数据填充、数据处理、数据分析中经常需要用RAND生成的随机数。 用法1 生成随机浮点数&#xff0c;其返回值在0&#xff08;包括0&#xff09;…

AppAgentx 开源AI手机操控使用分享

项目地址: https://appagentx.github.io/?utm_sourceai-bot.cn GitHub仓库: https://github.com/Westlake-AGI-Lab/AppAgentX/tree/main arXiv技术论文:https://arxiv.org/pdf/2503.02268 AppAgentx是什么: AppAgentX 是西湖大学推出的一种自我进化式 GUI 代理框架。它通过…

[原创]X86C++反汇编01.IDA和提取签名

https://bpsend.net/thread-415-1-1.html 用VC6.0新建一个控制台工程 编译成 debug 和 Release 2个版本 应ida分别查看2种版本的程序 高版本ida 可能会直接定位到函数入口,正常情况下,我们需要先调试找到关键,找到关键以后点再通过调试设置api断点,读写断点等,找到程序的关键…