当前位置: 首页 > news >正文

网页五子棋对战测试报告

网页五子棋对战测试报告

  • 项目背景
  • 项目测试
    • 功能测试
    • 部分界面截图
    • 自动化测试
      • Utils
      • RegisterTest
      • LoginTest
      • HallTest
      • RoomTest

项目背景

初学springboot的第一个项目,这是一款基于SSM框架结合WebSocket技术打造的网页版五子棋游戏,免下载安装,打开网页就能随时享受下棋乐趣。它最核心的功能是双人在线对战,在匹配系统中随机与其他玩家开启棋局。WebSocket技术确保了下棋过程中,双方落子信息能实时同步,几乎没有延迟,让对弈流畅又丝滑。在界面设计上,它简洁美观,棋盘与棋子的绘制精致,操作也十分简单,新手玩家能快速上手。除了实时对弈,游戏还贴心地提供了复盘功能,方便玩家回顾棋局,总结经验,提升棋艺。不管是想在闲暇时光杀上几盘,还是和棋友交流切磋,这款网页版五子棋都能满足你。

项目测试

功能测试

在这里插入图片描述

部分界面截图

在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bf6be8fd6bdd499e8e594f3a3d512805.png
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动化测试

因为写的比较着急,可能代码并不美观,请见谅

Utils

@Data
public class Utils {public static EdgeDriver driver;public static EdgeDriver createDriver() {if(driver == null) {WebDriverManager.edgedriver().setup();EdgeOptions options = new EdgeOptions();//允许访问所有的链接options.addArguments("--remote-allow-origins=*");driver = new EdgeDriver(options);//隐式等待(全局情况,查找元素的时候都让它等待2秒)driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}public Utils(String url) {driver = createDriver();driver.get(url);}public List<String> getTime(){//文件能不能按照天的维度按文件夹进行保存//文件格式 20230212-123030毫秒SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");String filename = sim1.format(System.currentTimeMillis());String dirname = sim2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirname);list.add(filename);return list;}/*** 获取屏幕截图,把所有的用例执行的结果保存下来*/public void getScreenShot(String str) throws IOException, AWTException {driver.quit();List<String> timeParts = getTime();// 构建路径String dirPath = Paths.get("./src/test/java/com/blogWebAutoTest", timeParts.get(0)).toString();String filename = String.format("%s_%s.png", str, timeParts.get(1));File destFile = new File(dirPath, filename);// 自动创建目录if (!destFile.getParentFile().exists()) {destFile.getParentFile().mkdirs(); // 创建多级目录}// 截图并保存// 使用 Robot 类截屏Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());BufferedImage screenFullImage = new Robot().createScreenCapture(screenRect);// 保存截图ImageIO.write(screenFullImage, "png", destFile);System.out.println("IDEA运行截图已保存至: " + destFile.getAbsolutePath());}}

RegisterTest

public class RegisterTest extends Utils {private static String url = "http://localhost:8080/register.html";public RegisterTest() {super(url);}public void registerFail() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));// 空账号空密码测试driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();// 处理弹窗(确认)wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();wait.until(ExpectedConditions.alertIsPresent());alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();wait.until(ExpectedConditions.alertIsPresent());alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")}public void registerSuccess() throws InterruptedException {// 等待页面加载完成// 第一次注册WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
//        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));
//        driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();
//        driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();
//        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu1");
//        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
//        driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
//
//        // 处理第一个弹窗
//        try {
//            wait.until(ExpectedConditions.alertIsPresent());
//            Alert alert = driver.switchTo().alert();
//            alert.accept();
//        } catch (Exception e) {
//            System.out.println("第一个弹窗处理失败: " + e.getMessage());
//        }
        driver.get(url);
//        // 等待页面元素重新加载// 第二次注册wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"username\"]")));driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("ceshi");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();// 处理第二个弹窗try {wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();alert.accept();} catch (Exception e) {System.out.println("第二个弹窗处理失败: " + e.getMessage());}// 等待页面跳转wait.until(ExpectedConditions.urlToBe("http://localhost:8080/login.html"));// 验证跳转String currentUrl = driver.getCurrentUrl();assert currentUrl.equals("http://localhost:8080/login.html") : "Expected URL: http://localhost:8080/login.html, but got: " + currentUrl;}public void registerT() throws InterruptedException {// 等待页面加载完成// 创建显式等待对象WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));// 等待输入框元素可见wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));// 输入注册信息driver.findElement(By.xpath("//*[@id=\"username\"]")).clear();driver.findElement(By.xpath("//*[@id=\"password\"]")).clear();driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("laoliu2");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");// 点击提交按钮driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();// 等待AJAX请求完成和弹窗出现try {wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();alert.accept();} catch (Exception e) {System.out.println("弹窗处理失败: " + e.getMessage());throw e;}driver.quit();}
}

LoginTest

public class LoginTest extends Utils {private static String url = "http://localhost:8080/login.html";public LoginTest() {super(url);}public void LoginFail() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));loginTest("", "");wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")loginTest("laoliu1", "");wait.until(ExpectedConditions.alertIsPresent());alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")loginTest("", "123");wait.until(ExpectedConditions.alertIsPresent());alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")loginTest("laoliu123", "123");wait.until(ExpectedConditions.alertIsPresent());alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")}public void LoginSuccess() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));loginTest("ceshi", "123");wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")assert driver.getCurrentUrl().equals("http://localhost:8080/game_hall.html");
//        driver.quit();}private static void loginTest(String username, String number) {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(number);driver.findElement(By.cssSelector("#submit")).click();}
}

HallTest

public class HallTest extends Utils {private static String url = "http://localhost:8080/game_hall.html";public HallTest() {super(url);}public void hallFail() {// 清理登录状态driver.manage().deleteAllCookies();driver.get(url);WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));WebElement screen = wait.until(d -> {WebElement el = d.findElement(By.id("screen"));return el.getText().contains("玩家:") ? el : null;});// 获取所有文本节点(需注意浏览器兼容性)List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));//解析整个文本String fullText = screen.getText();String[] lines = fullText.split("\n");assertEquals("玩家: undefined", lines[0]);driver.findElement(By.cssSelector("#match-button")).click();assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "未登入状态进入游戏大厅匹配异常";}public void hallSuccess() {driver.get("http://localhost:8080/login.html");WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"username\"]")));driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys("ceshi");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert(); // 切换到弹窗alert.accept(); // 点击确认(相当于点击"OK")// 等待页面跳转wait.until(ExpectedConditions.urlToBe(url));// 验证跳转String currentUrl = driver.getCurrentUrl();assert currentUrl.equals(url) :"Expected URL: http://localhost:8080/game_hall.html, but got: " + currentUrl;//        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"screen\"]/text()[1]")));;WebElement screen = wait.until(d -> {WebElement el = d.findElement(By.id("screen"));return el.getText().contains("玩家:") ? el : null;});// 获取所有文本节点(需注意浏览器兼容性)List<WebElement> textNodes = driver.findElements(By.cssSelector("#screen > *"));String fullText = screen.getText();String[] lines = fullText.split("\n");assertEquals("玩家: ceshi", lines[0]);driver.findElement(By.cssSelector("#match-button")).click();System.out.println(driver.findElement(By.cssSelector("#match-button")).getText());assert driver.findElement(By.cssSelector("#match-button")).getText().equals("匹配中...(点击取消)") : "登入状态点击开始匹配异常";driver.findElement(By.cssSelector("#match-button")).click();assert driver.findElement(By.cssSelector("#match-button")).getText().equals("开始匹配") : "登入状态点击取消匹配异常";//        driver.quit();}
}

RoomTest

public class RoomTest extends Utils {private static String url = "http://localhost:8080/game_room.html";public RoomTest() {super(url);}public void roomFail() {driver.manage().deleteAllCookies();driver.get(url);WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));wait.until(driver -> ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#screen")));assert driver.findElement(By.cssSelector("#screen")).getText().equals("等待玩家连接中...") : "无状态访问游戏房间异常";}//    public void roomSuccess() {
//
//    }
}

相关文章:

  • Backdrops 5.1.8| 每日更新高质量原创壁纸,解锁高级版,去除所有广告
  • Vision Transformer(ViT)
  • 小程序多线程实战
  • Excel里面怎样批量去掉字串包含的标点符号
  • Kotlin 内联函数深度解析:从源码到实践优化
  • 基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码
  • Best Video下载器——抖音视频去水印工具
  • AI日报 · 2025年5月10日|OpenAI“Stargate”超级数据中心项目掀起美国各州争夺战
  • 致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】
  • 【ML-Agents】ML-Agents示例项目导入unity报错解决
  • 关于汇编语言与程序设计——单总线温度采集与显示的应用
  • 解决 SQL Server 2008 导入 Excel 表卡在“正在初始化数据流”问题
  • 前端取经路——现代API探索:沙僧的通灵法术
  • Axure疑难杂症:统计分析页面引入Echarts示例动态效果
  • Dia浏览器:AI驱动浏览网页,究竟怎么样?(含注册申请体验流程)
  • VUE CLI - 使用VUE脚手架创建前端项目工程
  • Linux——MySQL约束与查询
  • AI 助力,轻松进行双语学术论文翻译!
  • null 的安全操作 vs 危险操作
  • 第7次课 栈A
  • 国内大模型人才大战打响!大厂各出奇招
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 2025中国南昌国际龙舟赛5月23日启幕,是历年来南昌举办的最高规格龙舟赛事
  • 身临其境感受伟人思想力量,“马克思书房”在上海社科馆揭幕
  • 谜语的强制力:弗洛伊德与俄狄浦斯
  • 上海发布大风黄警:预计未来24小时内将出现8-10级大风