目录
项目背景
1. 项目简介
2. 项目功能说明
1)注册功能
2)登录功能
3)游戏大厅页面
4)匹配房间页面
5)胜负结算返回游戏大厅页面
3. 测试目的
4. 测试范围
项目相关信息
测试步骤
1)冒烟测试:确定系统能正常运转,跑通主干功能
2)功能测试:结合Xmind中的测试用例,对每个模块进行验证;
3)接口测试:前后端分离,使用Postman测试后端的接口是否都是正常的;
4)性能测试:使用JMeter验证系统在高并发下的稳定性;
5)兼容性测试:保证不同用户在不同环境下的体验,使用多个浏览器同时查看;
6)回归测试:测试过程中出现的bug解决之后,对于其他功能是否会产生影响;
项目背景
1. 项目简介
本项目是基于B/S架构的网页版五子棋对战平台项目,项目完成后部署在云服务器上。前端采用 HTML5 Canvas绘制棋盘,通过WebSocket协议与后端进行全双工的长连接,后端是基于Spring Boot+MyBatis框架,使用ConcurrentHashMap维护用户状态与房间的映射,并采用MySQL数据库持久化用户积分与场数信息。
2. 项目功能说明
1)注册功能
- 用户使用未注册过的用户名和密码注册用户信息
- 注册成功后跳转到对应的游戏大厅页面
- 未注册的用户不允许登录
2)登录功能
- 用户使用已经注册过的用户名和密码登录
- 登录成功后跳转到游戏大厅页面
- 未登录状态下不允许进入游戏大厅和匹配房间且强制登录
3)游戏大厅页面
- 右上角显示用户名称,中间显示用户总场数、获胜场数和天梯积分
- 点击切换账号,跳转到登录页面重新登录
- 点击开始匹配,原按钮处显示"点击取消匹配"
- 成功匹配后跳转到游戏房间页面
4)匹配房间页面
- 对战双方有一人未进入游戏房间时,棋盘显示为空,且显示游戏等待开始
- 优先进入房间并建立WebSocket连接的用户先落子,显示"轮到你落子了",另一用户显示"轮到对方落子了"
- 落子方点击棋盘落子,先手默认白子,下方显示切换为"轮到对方落子了",到对手落子,并显示落子信息同步
5)胜负结算返回游戏大厅页面
- 任意一方五子连珠(横向/纵向/斜向),游戏结束判定输赢
- 胜方天梯积分+100,胜利场数和总场数各加一,败方天梯积分-100,胜利场数不变,总场数+1
- 任意一方出现异常掉线,判定对手胜利,并销毁房间自动回到游戏大厅
3. 测试目的
本次测试旨在测试五子棋平台的核心业务流程(用户注册登录、房间匹配、实时落子、胜负结算)是否正常运行,并检测在高并发情况项目的稳定性,以及排查WebSocket长连接可能出现断线、落子信息不同步等问题。
4. 测试范围
- 用户模块:用户注册、登录、鉴权、个人信息查询;
- 对战模块:匹配队列、游戏房间创建与销毁、WebSocket重连、落子信息推送、胜负判定;
- 数据更新模块:对战结束之后总场数、获胜场数、天梯积分数据及时更新;
- 非功能测试:接口并发压力测试、浏览器兼容性、网络异常断线处理等;
项目相关信息
- 项目代码:GitHub - Vitala-Dill/Codes-for-WebSocket-Based-GobangBattle · GitHub
- 访问链接:http://111.231.171.47:8080/login.html
测试步骤
1)冒烟测试:确定系统能正常运转,跑通主干功能
使用两个浏览器注册用户信息,使用注册成功的用户名和密码登录平台,进入到游戏大厅页面,右上角显示用户名,中间显示用户的总场数、胜利场数和天梯积分,中间显示点击匹配,两名积分相近的玩家点击匹配随机进入同一个房间,先进入房间并建立WebSocket连接的玩家落子先手,下白子,另一个玩家落黑子,任意一方五子连珠胜利,另一方失败,胜方天梯积分+100,败者天梯积分-100,场数和胜利场数更新,胜负判定后返回游戏大厅。
2)功能测试:结合Xmind中的测试用例,对每个模块进行验证;
这里对于用户登录模块可以使用Web自动化测试来完成,编写自动化脚本;
1)添加自动化框架依赖:
<dependencies> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>6.1.0</version> </dependency> <!-- 安装selenium库 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.30.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.16</version> </dependency> </dependencies>2)编写自动化脚本
import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.edge.EdgeOptions; public class AutoTest { //Chrome浏览器使用 WebDriver chromeDriver1 = null; WebDriver chromeDriver2 = null; //测试登录网址 void testLogin() throws InterruptedException { //打开浏览器 WebDriverManager.chromedriver().setup(); //增加浏览器配置,创建驱动对象时,强制指定允许访问所有的链接 ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); //防止出现同样的cookie,使用无痕模式 options.addArguments("--incognito"); chromeDriver1 = new ChromeDriver(options); //输入登录网址 chromeDriver1.get("http://111.231.171.47:8080/login.html"); //选择用户名输入框,输入用户名 chromeDriver1.findElement(By.cssSelector("#username")).sendKeys("ffy"); //选择密码输入框,输入密码 chromeDriver1.findElement(By.cssSelector("#password")).sendKeys("123"); //找到提交按钮,点击登录按钮 chromeDriver1.findElement(By.cssSelector("#submit")).click(); Thread.sleep(2000); //切换到弹窗并点击确定 chromeDriver1.switchTo().alert().accept(); Thread.sleep(2000); //调用另一个方法开启多用户登录 testMultiUsersLogin(); chromeDriver1.quit(); chromeDriver2.quit(); } void testMultiUsersLogin() throws InterruptedException { WebDriverManager.chromedriver().setup(); //增加浏览器配置,创建驱动对象时,强制指定允许访问所有的链接 ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); //防止出现同样的cookie,使用无痕模式 options.addArguments("--incognito"); chromeDriver2 = new ChromeDriver(options); //输入登陆网址 chromeDriver2.get("http://111.231.171.47:8080/login.html"); //选择用户名输入框,输入用户名 chromeDriver2.findElement(By.cssSelector("#username")).sendKeys("pizza"); //选择密码输入框,输入密码 chromeDriver2.findElement(By.cssSelector("#password")).sendKeys("123456"); //找到提交按钮,点击登录按钮 chromeDriver2.findElement(By.cssSelector("#submit")).click(); Thread.sleep(2000); //切换到弹窗并点击确定 chromeDriver2.switchTo().alert().accept(); Thread.sleep(2000); } public static void main(String[] args) throws InterruptedException { AutoTest autoTest = new AutoTest(); autoTest.testLogin(); } }3)接口测试:前后端分离,使用Postman测试后端的接口是否都是正常的;
4)性能测试:使用JMeter验证系统在高并发下的稳定性;
使用JMeter压力测试用户登录和WebSocket连接发送匹配请求、进入到对战房间对战:
1)添加对应的插件:
2)添加需要使用的组件:HTTP请求、WebSocket的组件;
3)模拟多个用户并发发送匹配请求,需要多个用户信息;
需要注意的是先完成单个用户的流程测试,然后逐步增加用户数量进行压力测试,测试项目的压力边界是多少,最多能多少个用户并发访问;
- 添加HTTP Cookie管理器,用来管理每次登录得到的Cookie,模拟的是多个用户;
- 使用SQL语句创建50个用户,并新建users.csv文件保存用户信息,用户名和密码;
- 在jmeter中添加CSV Data Set Config元件,并选择新建的users.csv,添加变量名username,password,userId;
- 配置登录接口:POST http://ip:8080/user/login,Body中填写username=${username}&password=${password},使用的是CSV文件中的变量名;
- 增加一个响应断言,验证用户登陆成功;
- 用户成功登录后就进入了游戏大厅,进行WebSocket连接,添加WebSocket Open Connection,路径就是ws://ip:8080/match;
- 添加同步定时器,设置同时模拟50个用户,超时时间设置为5000毫秒;
- 添加发送匹配请求的websocket,也就是WebSocket request-response Sampler,连接使用的是上面游戏大厅里的连接,并发送startMatch请求数据;
- 匹配成功后Matcher会给每个用户发送matchSuccess请求,所以需要添加读取推送消息的WebSocket Single Read Sampler元件;
- 然后添加ws连接,现在是进入到了对战房间里,建立对战连接;
- 进入房间后,需要添加WebSocket request-response Sampler模拟落子,发送的请求体是包含了落子消息和落子位置;
聚合报告:
生成压力测试报告:
响应时间百分比/响应时间分布:
5)兼容性测试:保证不同用户在不同环境下的体验,使用多个浏览器同时查看;
在Microsoft Edge(152.0.4191.66 (正式版本) (64 位))、Chrome(版本 152.0.7977.84(正式版本))、联想浏览器(版本 9.0.6.2081(正式版本) (64 位))上测试显示
6)回归测试:测试过程中出现的bug解决之后,对于其他功能是否会产生影响;
通常在功能更新等之后,对其它功能进行测试,看更新后对其它功能是否产生影响,因此每次更新都需要对旧功能进行测试,测试人员就自己编写脚本进行自动化测试,简化这部分重复工作
这就是网页五子棋对战项目的测试流程:冒烟测试、功能测试、接口测试、性能测试、兼容性测试和回归测试,对于测试有很多种测试的分类,根据需求使用即可。