基于WebSocket的实时用户聊天室-测试报告
目录一.报告概述1、项目背景2、测试环境二.测试用例三.手动测试1.注册功能测试2.登录功能测试3.搜索好友功能测试编辑4.添加好友功能测试5.发送消息功能测试6.接收消息功能测试7.会话管理功能测试四.自动化测试五.性能测试1.单一接口测试2.聚合报告3、TPS可视化4、响应时间可视化5、活跃线程数可视化6.测试报告一.报告概述1、项目背景Java 聊天室是一款基于 Web 的实时在线聊天系统主要用于用户注册登录、好友添加管理、实时消息收发、聊天会话管理、消息历史记录查询。系统包含以下核心模块- 用户管理注册、登录、会话管理- 好友管理好友搜索、添加、列表管理- 消息会话管理会话创建、会话列表、最后消息显示- 消息管理实时消息发送、消息历史记录查询- WebSocket 通信实时连接建立、消息推送、连接状态管理2、测试环境操作系统Windows 11 / Windows 10浏览器Chrome、Edge测试工具Selenium、JMeter、postman二.测试用例三.手动测试1.注册功能测试测试场景一:输入密码:123,但不输入用户名,点击注册预期结果:弹窗显示 您输入的用户名/密码为空测试场景二:输入未注册过的用户名:咕咕 ,但不设置密码,点击注册预期结果:弹窗显示 您输入的用户名/密码为空测试场景三:输入已经注册过的用户名zhangsan和密码123,并点击注册预期结果:弹窗显示注册失败!用户已存在测试场景四:输入未注册过的用户名咕咕和密码123,点击注册预期结果:弹窗显示 注册成功,点击确定后跳转到登录页面2.登录功能测试测试场景一:输入注册过的用户名zhangsan和密码123预期结果:弹窗显示登陆成功,点击确定后跳转到会话界面测试场景二:输入错误的/未注册过的用户名和密码预期结果:弹窗显示登陆失败测试场景三:只输入用户名:zhangsan,未输入密码预期结果:弹窗提示当前输入的用户名/密码为空测试场景四:输入密码123但不输入用户名预期结果:弹窗显示当前输入的用户名/密码为空3.搜索好友功能测试测试场景一:登陆成功之后,在搜索框输入完整的存在的用户名咕咕并搜索预期结果:搜索结果显示该用户测试场景二:登录成功之后,在搜索框输入完整的不存在的用户名123预期结果:搜索结果显示未查找到匹配的用户测试场景三:登录成功之后,输入部分存在的用户名称:咕预期结果:搜索结果展示包含搜索框中字段的用户测试场景四:用户zhangsan登陆成功后,搜索框输入用户自己的用户名zhangsan预期结果:搜索结果显示未找到匹配的用户测试场景五:搜索到的好友添加过预期结果:显示该好友,添加按钮变为聊天,点击后跳转到与该好友的聊天界面4.添加好友功能测试测试场景:搜索到用户之后,点击对应的添加按钮预期结果:弹窗显示添加好友成功,添加按钮变为聊天按钮,点击好友列表显示该好友5.发送消息功能测试测试场景:在和1的聊天界面的聊天框输入你好,并点击发送按钮预期结果:聊天界面显示由本人zhangsan发出消息你好6.接收消息功能测试测试场景:在zhangsan向1发送了你好之后,登录1的账号预期结果:显示zhangsan向自己发来的你好7.会话管理功能测试测试场景一:点击好友列表咕咕预期结果:跳转到与咕咕的聊天界面,并新增会话记录测试场景二:点击会话列表最下面的lisi预期结果:在好友列表点击lisi,与lisi的会话记录置顶并高亮显示四.自动化测试Utils工具类package com.example.common; import io.github.bonigarcia.wdm.WebDriverManager; import org.apache.commons.io.FileUtils; import org.openqa.selenium.Alert; 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 org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.Duration; //工具类,实现浏览器打开,关闭,截图 public class Utils { public static WebDriver drivernull; public static WebDriverWait waitnull; public static String detailSrlnull; //构造方法 public Utils(String url){ WebDriver driver createDriver(); driver.get(url); //显示等待 wait new WebDriverWait(driver, Duration.ofSeconds(10)); } //创建Driver对象 public static WebDriver createDriver(){ if(drivernull){ //下载驱动 WebDriverManager.chromedriver().setup(); //驱动配置 ChromeOptions optionsnew ChromeOptions(); options.addArguments(--remote-allow-origins*); //创建driver对象 drivernew ChromeDriver(options); //添加隐式等待 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3)); } return driver; } //截图 public void screenShot(String funcName) throws IOException { WebDriver driver createDriver(); SimpleDateFormat format1new SimpleDateFormat((yyyy-MM-dd)); SimpleDateFormat format2new SimpleDateFormat(HH_mm_ss); String dirTimeformat1.format(System.currentTimeMillis()); String fileTimeformat2.format(System.currentTimeMillis()); String fileName./src/test/java/com/example/img/dirTime/funcName_fileTime.png; File srcFile ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile,new File(fileName)); } //关闭浏览器 public void exit(){ driver.quit(); } //处理弹窗 //隐式等待不等弹窗,因此需要显式等待弹窗操作 //否则报错NoAlertPresentException public static void alert(){ wait.until(ExpectedConditions.alertIsPresent()); Alert alertdriver.switchTo().alert(); alert.accept(); } }RunTest 运行主类package com.example.cases; import java.io.IOException; public class RunTest { public static void main(String[] args) throws InterruptedException, IOException { TestRegister registernew TestRegister(); //检查注册页面 register.checkRegisterRight(); //注册用户名/密码为空 Thread.sleep(2000); register.registerFailNull(); //输入注册过的用户名和密码 Thread.sleep(2000); register.registeredFail(); //注册成功 Thread.sleep(2000); register.registerSuc(); TestLogin loginnew TestLogin(); //检查登陆页面 login.checkLoginRight(); //用户名/密码为空 login.loginFailNull(); //用户名错误 login.loginFailErrorName(); //密码错误 login.loginFailErrorPassword(); //登陆成功 login.loginSuc(); TestClient testClientnew TestClient(); //检查是否正常打开 testClient.checkClientRight(); //验证发送消息功能 testClient.Client(); //搜索好友失败 testClient.searchFriendFail(); //添加好友成功 testClient.addFriendSuc(); login.exit(); } }TestLogin 登陆测试类package com.example.cases; import com.example.common.Utils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.IOException; public class TestLogin extends Utils { public static String srchttp://49.234.179.251:8081/login.html; public TestLogin(){ super(src); } /** * 检查登陆页面是否正常打开 */ public void checkLoginRight() throws IOException { //截图 screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); //检查输入框,登录,注册按钮是否存在 driver.findElement(By.cssSelector(#username)); driver.findElement(By.cssSelector(#password)); driver.findElement(By.cssSelector(#submit)); driver.findElement(By.cssSelector(#register)); } /** * 输入正确的用户名和密码,登陆成功 */ public void loginSuc() throws InterruptedException, IOException { //找到用户名输入框清空 driver.findElement(By.cssSelector(#username)).clear(); //找到密码输入框清空 driver.findElement(By.cssSelector(#password)).clear(); //找到用户名输入框输入正确的账号 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); //找到密码输入框输入正确的密码 driver.findElement(By.cssSelector(#password)).sendKeys(123); driver .findElement(By.cssSelector(#submit)).click(); Thread.sleep(1000); alert(); //通过是否存在该元素判断是否登陆成功 driver.findElement(By.cssSelector(body div.client-container div div.left div.search button)); } /** * 登陆失败 * 用户名和密码都为空 */ public void loginFailNull() throws IOException { //在登陆成功后测试该功能,因此需要回退,并清空输入框内容 //driver.navigate().back();//但如果先执行登录失败就不需要回退 //找到用户名输入框清空 driver.findElement(By.cssSelector(#username)).clear(); //找到密码输入框清空 driver.findElement(By.cssSelector(#password)).clear(); //点击提交按钮 driver.findElement(By.cssSelector(#submit)).click(); alert(); } /** * 输入正确的密码,错误的用户名,登陆失败 */ public void loginFailErrorName() throws IOException { driver.findElement(By.cssSelector(#username)).clear(); //找到密码输入框清空 driver.findElement(By.cssSelector(#password)).clear(); //找到用户名输入框输入正确的账号 driver.findElement(By.cssSelector(#username)).sendKeys(z); //找到密码输入框输入正确的密码 driver.findElement(By.cssSelector(#password)).sendKeys(123); driver .findElement(By.cssSelector(#submit)).click(); alert(); } /** * 输入正确的密码,错误的密码,登陆失败 */ public void loginFailErrorPassword() throws IOException { driver.findElement(By.cssSelector(#username)).clear(); //找到密码输入框清空 driver.findElement(By.cssSelector(#password)).clear(); //找到用户名输入框输入正确的账号 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); //找到密码输入框输入正确的密码 driver.findElement(By.cssSelector(#password)).sendKeys(1); driver .findElement(By.cssSelector(#submit)).click(); alert(); } }TestRegister 注册测试类package com.example.cases; import com.example.common.Utils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.support.ui.ExpectedConditions; import java.io.IOException; public class TestRegister extends Utils { public static String srchttp://49.234.179.251:8081/register.html; public TestRegister() { super(src); } /** * 检查页面是否正常打开 */ public void checkRegisterRight() throws IOException { //截图 screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); driver.findElement(By.cssSelector(#username)); driver.findElement(By.cssSelector(#password)); driver.findElement(By.cssSelector(#submit)); } /** * 输入的用户名,密码为空 */ public void registerFailNull(){ driver.findElement(By.cssSelector(#username)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#submit)).click(); alert(); } /** * 输入用户名和密码,注册成功 */ public void registerSuc(){ driver.findElement(By.cssSelector(#register)).click(); driver.findElement(By.cssSelector(#username)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#username)).sendKeys(1234); driver.findElement(By.cssSelector(#password)).sendKeys(1234); driver.findElement(By.cssSelector(#submit)).click(); alert(); } /** * 输入注册过的用户名和密码 */ public void registeredFail(){ driver.findElement(By.cssSelector(#username)).clear(); driver.findElement(By.cssSelector(#password)).clear(); driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); driver.findElement(By.cssSelector(#password)).sendKeys(123); driver.findElement(By.cssSelector(#submit)).click(); alert(); } }TestClient 会话测试类package com.example.cases; import com.example.common.Utils; import org.openqa.selenium.By; import java.io.IOException; public class TestClient extends Utils { public static String srchttp://49.234.179.251:8081/client.html; public TestClient() { super(src); } //检查正常打开 public void checkClientRight() throws IOException { screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); //通过是否存在该元素判断是否登陆成功 driver.findElement(By.cssSelector(body div.client-container div div.left div.search button)); } //点击查看lisi聊天记录,并且向lisi发送你好 public void Client() throws IOException { driver.findElement(By.cssSelector(#session-list li:nth-child(4))).click(); screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); driver.findElement(By.cssSelector(body div.client-container div div.right textarea)).sendKeys(你好); driver.findElement(By.cssSelector(body div.client-container div div.right div.ctrl button)).click(); screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); } //添加好友1234成功 public void addFriendSuc(){ driver.findElement(By.cssSelector(body div.client-container div div.left div.search input[typetext])) .clear(); driver.findElement(By.cssSelector(body div.client-container div div.left div.search input[typetext])) .sendKeys(1234); driver.findElement(By.cssSelector(body div.client-container div div.left div.search button)).click(); driver.findElement(By.cssSelector(body div.client-container div div.right div.message-show div:nth-child(1) div.add-friend button)).click(); alert(); } //搜索好友失败 public void searchFriendFail() throws InterruptedException { driver.findElement(By.cssSelector(body div.client-container div div.left div.search input[typetext])) .sendKeys(aaa); driver.findElement(By.cssSelector(body div.client-container div div.left div.search button)).click(); // 添加等待时间确保搜索结果能够显示 Thread.sleep(2000); String text driver.findElement(By.xpath(/html/body/div[2]/div/div[2]/div[2]/div)).getText(); System.out.println(text); assert text.equals(未找到匹配的用户); } }五.性能测试1.单一接口测试登录接口获取用户信息获取好友列表获取历史会话消息获取会话列表消息查询好友2.聚合报告3、TPS可视化Transactions per SecondTPS监听器是⼀个用于分析系统吞吐量的重要工具。TPS即每秒事务数表示一个客户机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在同一时间内处理业务的最大能力。TPS值越高说明系统的处理能力越强。4、响应时间可视化Response Times Over Time主要用于监听整个事务运行期间的响应时间。在测试过程中可以通过观察并分析响应时间的实时平均值以及整体响应时间的走向。5、活跃线程数可视化Active Threads Over Time 监听器显示测试执行期间并发用户(线程)数量的实时变化以折线图形式展示活跃线程数随时间变化的趋势帮助识别负载模式、峰值和低谷。6.测试报告