【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
繁體地址,請注明出處:http://hk.pswp.cn/web/81182.shtml
英文地址,請注明出處:http://en.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斷點,讀寫斷點等,找到程序的關鍵…