一.项目简介
本项目是一个基于SSM(Spring、Spring MVC、MyBatis)框架和WebSocket技术的在线多人五子棋游戏。平台支持用户注册、登录、匹配对手,以及实时在线对战的功能。项目的主要目的是为用户提供一个可以随时随地与他人对弈五子棋的便捷平台。
二.项目功能
该项目主要主要实现了登录,注册,匹配和对战功能
用户模块主要负责⽤⼾的注册, 登录, 分数记录功能,使⽤ MySQL 数据库存储数据,客⼾端提供⼀个登录⻚⾯+注册⻚⾯,服务器端基于 Spring + MyBatis 来实现数据库的增删改查.
匹配模块
⽤⼾登录成功, 则进⼊游戏⼤厅⻚⾯.
游戏⼤厅中, 能够显⽰⽤⼾的名字, 天梯分数, ⽐赛场数和获胜场数.
同时显⽰⼀个 “匹配按钮”.
点击匹配按钮则⽤⼾进⼊匹配队列, 并且界⾯上显⽰为 “取消匹配” .
再次点击则把⽤⼾从匹配队列中删除.
如果匹配成功, 则跳转进⼊到游戏房间⻚⾯.
⻚⾯加载时和服务器建⽴ websocket 连接. 双⽅通过 websocket 来传输 “开始匹配”, “取消匹配”, “匹配
成功” 这样的信息.
对战模块
玩家匹配成功, 则进⼊游戏房间⻚⾯.
每两个玩家在同⼀个游戏房间中.
在游戏房间⻚⾯中, 能够显⽰五⼦棋棋盘. 玩家点击棋盘上的位置实现落⼦功能.
并且五⼦连珠则触发胜负判定, 显⽰ “你赢了” “你输了”.
⻚⾯加载时和服务器建⽴ websocket 连接. 双⽅通过 websocket 来传输 “准备就绪”, “落⼦位置”, “胜
负” 这样的信息.
• 准备就绪: 两个玩家均连上游戏房间的 websocket 时, 则认为双⽅准备就绪.
• 落⼦位置: 有⼀⽅玩家落⼦时, 会通过 websocket 给服务器发送落⼦的⽤⼾信息和落⼦位置, 同时服
务器再将这样的信息返回给房间内的双⽅客⼾端. 然后客⼾端根据服务器的响应来绘制棋⼦位置.
• 胜负: 服务器判定这⼀局游戏的胜负关系. 如果某⼀⽅玩家落⼦, 产⽣了五⼦连珠, 则判定胜负并返回
胜负信息. 或者如果某⼀⽅玩家掉线(⽐如关闭⻚⾯), 也会判定对⽅获胜
三.测试类型
1.功能测试
测试用例的编写:
登录界面,输入正确的用户名和密码
多开时,显示用其他账户登录
游戏界面简洁,易上手.
如果对方掉线,另一方直接获胜
2.自动化测试
将公共操作封装到一个类中,比如创建驱动,屏幕截图等
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.time.Duration;
public class InitAndEndBrowser {
static WebDriver webDriver;
@BeforeAll
static void openGobangSystem() {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
webDriver = new ChromeDriver(options);
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
@AfterAll
static void closeGobangSystem() {
webDriver.quit();
}
}
部分测试代码
public class GobangTest extends InitAndEndBrowser {
//登录成功测试
@Order(2)
@ParameterizedTest
@CsvSource({"'zhangsan', '123'"})
void loginSuccessful(String username, String password) {
webDriver.get("http://47.121.113.16:9090/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
//登录后,应跳转到游戏大厅页面
//检验是否有开始匹配这个按钮
String text = webDriver.findElement(By.cssSelector("#match-button")).getText();
if ("开始匹配".equals(text)) {
System.out.println("测试通过");
} else {
System.out.println("测试不通过");
}
}
//登录失败测试
@Order(1)
@ParameterizedTest
@CsvFileSource(resources = "loginfalied.csv")
void loginFailed(String username, String password) throws InterruptedException {
webDriver.get("http://47.121.113.16:9090/login.html");
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(2000);
//登录失败,会出现一个alert弹窗
Alert alert = webDriver.switchTo().alert();
if (alert != null) {
System.out.println("测试通过,弹框内容: " + alert.getText());
} else {
System.out.println("测试不通过");
}
assertNotNull(alert);
alert.dismiss(); //关闭弹窗
}
//匹配按钮的显示功能测试(放在登录成功测试之后执行)
@Order(3)
@Test
void matchButtonTest() throws InterruptedException {
// webDriver.get("http://47.121.113.16:9090/login.html");
// webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsasn");
// webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
// webDriver.findElement(By.cssSelector("#submit")).click();
sleep(2000);
//此时按钮显示的是开始匹配,点击后看是否变成了匹配中
webDriver.findElement(By.cssSelector("#match-button")).click();
sleep(2000);
String text = webDriver.findElement(By.cssSelector("#match-button")).getText();
if (text.equals("匹配中...(点击停止)")) {
System.out.println("测试通过");
} else {
System.out.println("测试不通过");
}
}
}
四.测试结果
本项目测试功能基本完好,无明显缺陷,测试中的问题都及时修复了.