【萌笔趣棋】网页五子棋项目测试报告

article/2025/7/22 17:47:28

目录

一.项目介绍 

(一)项目简介

(二)功能介绍

(三)页面展示

1.注册页面

2.登录页面

3.游戏大厅页面

4.游戏房间页面(对战)

二.功能测试

(一)出现的bug

 (二)解决方法

三.自动化测试

(一)测试用例设计

(二)测试准备

(三)编写测试脚本

1.工具类

2.注册功能

3.登录测试

3.“游戏大厅”测试

4.“游戏房间”测试

5.驱动退出和测试套件类

(四)测试结果

四.性能测试

例子

五.总结

 

一.项目介绍 

若需要【萌笔趣棋】项目源码可后台私信

(一)项目简介

“新酱爱玩的五子棋” 是一款以《蜡笔小新》春日部角色为主题背景的五子棋游戏。该游戏基于网页端开发,通过简洁易懂的界面设计,为玩家提供经典五子棋的对战体验,融合了趣味性与竞技性,目标用户主要为喜爱五子棋和《蜡笔小新》动漫的人群。

(二)功能介绍

  1. 注册页面:玩家可在此页面输入自定义的用户名和密码进行账号注册。系统会对输入信息进行验证,确保用户名的唯一性等,成功注册后可获得在游戏中进行对战的资格。
  2. 登录页面:已注册玩家输入正确的用户名和密码登录游戏。登录成功后,可进入游戏大厅开始游戏相关操作;若输入错误,系统会提示重新输入。
  3. 游戏大厅:玩家登录后进入游戏大厅,可查看自己的游戏信息,包括用户名、当前分数、比赛场次和获胜场次等。点击 “开始匹配” 按钮,系统会自动为玩家寻找对战对手,在匹配过程中可点击取消匹配。
  4. 游戏房间:匹配成功后进入游戏房间,玩家和对手在此进行五子棋对战。游戏界面会显示棋盘,玩家按规则轮流落子。当一方率先在棋盘的横线、竖线或斜线上形成连续的五个棋子时,判定为获胜方,系统会显示胜负结果,并更新玩家在游戏大厅中的相关数据(如分数、比赛场次、获胜场次等) 。

(三)页面展示

1.注册页面

2.登录页面

3.游戏大厅页面

信息展示/开始匹配 

4.游戏房间页面(对战)

落子/回合切换

 胜负判定

二.功能测试

在此就不展示进行功能测试的截图了,具体可以跳转到(三)页面展示

(一)出现的bug

1.在进行注册功能时候,出现了用户名或者密码输入为空,但是仍然注册成功的情况

 (二)解决方法

1.在注册页面的前端代码中加入如下拦截请求代码:

   // 验证用户名和密码是否为空if (!username.trim()||!password.trim()) {alert('用户名或者密码不能为空');return; // 阻止表单提交}

三.自动化测试

源码:gobangAutoTest: 网页版五子棋对战——Web自动化测试

(一)测试用例设计

(二)测试准备

1.工具选择:

使用Selenium 并配合Junit单元测试框架

2.搭建和配置环境:

2.1 创建Maven项目——gobangAutoTest

2.2 在pom.xml中引入相关依赖

    <dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.9.0</version></dependency></dependencies>

2.3 包的模块化设计:

(三)编写测试脚本

1.工具类

public class AutotestUtils {public static EdgeDriver driver;/*** 创建驱动对象*/public static EdgeDriver createDriver() {if (driver == null) {WebDriverManager.edgedriver().setup();EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");// options.addArguments("-headless");driver = new EdgeDriver(options);//创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return driver;}/*** 获取时间戳*/public List<String> getTime() {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 {List<String> list = this.getTime();String filename = "./src/test/java/com/gobangAutoTest/" + list.get(0) + "/" + str + "_" + list.get(1) + ".png";File srcfile = (File)driver.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcfile, new File(filename));}}

2.注册功能

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RegisterPageTest extends AutotestUtils {//1.驱动对象public static EdgeDriver driver = createDriver();/**访问注册页面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/register.html");}/*** 检查注册页面是否正常打开* 检查点:注册框标题 是否存在*/@Test@Order(1)void registerPageLoadRight() throws IOException {driver.findElement(By.cssSelector("body > div.login-container > div > h3"));getScreenShot(getClass().getName());}/*** 检查正常注册的情况,会出现弹窗:注册成功!*/@ParameterizedTest@CsvSource({"na_na,123"})@Order(3)void registerSuc(String name,String password) throws InterruptedException, IOException {String expected = "注册成功!";driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();//处理弹窗WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}/*** 检查异常注册的情况:用户名或者密码为空* 会出现弹窗提示*/@ParameterizedTest@CsvSource({"oppop"})@Order(3)void registerFail(String name) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();String expected = "用户名或者密码不能为空!";driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#submit")).click();//处理弹窗WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}}

3.登录测试

//一个类注解,表明测试方法将按照@Order注解 指定执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class LoginPageTest extends AutotestUtils {//1.驱动对象public static EdgeDriver driver = createDriver();//被BeforeAll修饰的方法必须为静态的,而静态的方法内不能存取非静态变量和非静态方法//在当前测试类中所有测试方法执行之前只执行一次@BeforeAll/**访问登录页面的URL*/static void baseControl() {driver.get("http://127.0.0.1:8080/login.html");}/**检查登录页面是否正常打开检查点:登录按钮 登录框标题 是否存在*/@Test@Order(1)void loginPageLoadRight() throws IOException {driver.findElement(By.cssSelector("#submit"));driver.findElement(By.cssSelector("body > div.login-container > div > h3"));getScreenShot(getClass().getName());}/**检查正常登录的情况*/@ParameterizedTest//为参数化测试提供Csv格式的数据@CsvSource({"wukong,123","w_o.ogason,123"})@Order(2)void loginSuc(String name, String passwd) throws InterruptedException, IOException {//这三步只是登录的步骤,能不能保证登录是成功的呢?//clear 先清空driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(passwd);driver.findElement(By.cssSelector("#submit")).click();//处理“登录成功的弹窗”WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();alert.accept();//对登录结果进行检验——跳转到游戏大厅页面才算是登录成功//检查“个人信息框”元素是否存在//driver.findElement(By.cssSelector("#screen"));//检查“开始匹配按钮”元素是否存在driver.findElement(By.cssSelector("#match-button"));getScreenShot(getClass().getName());//页面返回——防止执行第二个测试用例时候因为页面跳转而导致元素查找失败driver.navigate().back();}/**检查异常登录的情况*/@ParameterizedTest@CsvSource({"wukong,12"})@Order(3)void loginFail(String name, String passwd) throws IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(passwd);driver.findElement(By.cssSelector("#submit")).click();//对登录失败的结果进行检验WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();String res = alert.getText();alert.accept();getScreenShot(getClass().getName());// System.out.println(res);assert res.equals("登录失败! 用户名密码错误! 或者该账号正在游戏中!");}}

3.“游戏大厅”测试

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class GameHallTest extends AutotestUtils {//1.驱动对象public static EdgeDriver driver = createDriver();/**访问游戏大厅页面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/game_hall.html");}/*** 检查登录状态下的游戏大厅页面是否正常打开* */@Test@Order(1)void gameHallLoadRight() throws IOException {//检查“开始匹配按钮”元素是否存在driver.findElement(By.cssSelector("#match-button"));getScreenShot(getClass().getName());}/*** 检查正登录状态下:点击“开始匹配”按钮否会变化*/@Test@Order(2)void gameHallSuc() throws InterruptedException, IOException {String expected = "匹配中...(点击取消)";WebElement matchButton = driver.findElement(By.cssSelector("#match-button"));matchButton.click();//强制等待,等按钮文字改变Thread.sleep(3);String accept = driver.findElement(By.cssSelector("#match-button")).getText();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}}

4.“游戏房间”测试

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class GameRoomTest extends AutotestUtils {//1.驱动对象public static EdgeDriver driver = createDriver();/**访问游戏大厅页面的URL*/@BeforeAllstatic void baseControl() {driver.get("http://127.0.0.1:8080/game_room.html");}/*** 检查登录——未匹配用户状态下的的游戏房间是否有弹窗*/@Test@Order(1)void gameRoomFail() throws InterruptedException, IOException {String expected = "连接游戏失败! reason: 用户并未匹配成功! 不能开始游戏!";Thread.sleep(1000);Alert alert = driver.switchTo().alert();String accept = alert.getText();alert.accept();getScreenShot(getClass().getName());Assertions.assertEquals(expected,accept);}
}

5.驱动退出和测试套件类

public class driverQuitTest extends AutotestUtils {public static EdgeDriver driver = createDriver();@Testvoid driverQuit() {driver.quit();}
}
@Suite//创建测试套件
// 用于Suite的注解,指定要包含在测试套件中的测试类
@SelectClasses({RegisterPageTest.class, LoginPageTest.class,GameHallTest.class,GameRoomTest.class,driverQuitTest.class})
public class runSuite {}

(四)测试结果

运行结果

四.性能测试

总体测试框架

例子

1.设置线程组

模拟 100 个虚拟用户同时进行登录操作,在10秒内完成

用于测试五子棋游戏登录功能在高并发场景下的性能和稳定性。

 2.添加http请求

3.结果分析

 总体而言,从这两个报告看,该 HTTP 请求的响应时间短且稳定,无异常请求,系统在当前测试场景下性能表现良好,能较快速且稳定地处理请求 。

五.总结

功能测试保障软件功能正常、无缺失和错误,让用户有预期体验;性能测试确保软件在不同负载下响应及时、不卡顿崩溃,评估承载能力;自动化测试提升效率、降成本、保准确一致,在开发流程中及时发现问题,稳定软件质量。

 


http://www.hkcw.cn/article/qyUboKngXv.shtml

相关文章

乌克兰袭击俄轰炸机基地画面曝光 大胆军事行动震动俄乌

乌克兰官员周日宣布,乌克兰军队对俄罗斯境内深处的多个军用机场进行了大规模无人机袭击。这些机场是用于进行空袭的战略轰炸机基地,这次行动被认为是自俄乌冲突爆发以来乌克兰军队最大胆的一次军事行动。此次代号为“蛛网”的袭击行动经过一年半的准备。乌克兰无人机的目标包…

卡友护送青藏线司机骨灰回家 爱心跨越2400公里

河南46岁的卡车司机常志荣在青海五道梁地区因高原缺氧离世,家中还有六个孩子需要抚养。为了省下一罐氧气的钱,他在出发前只购买了一罐氧气。五道梁地区海拔4665米,含氧量不足海平面的一半,自然环境极其恶劣。得知消息后,多名卡车司机自费远赴2000多公里护送常志荣的骨灰及…

北京全市上汛责任人名单公示 防汛抗旱任务明确

今日天气早晨有轻雾,白天晴转多云,西部北部有分散性阵雨或雷阵雨,北风一级转三四级,阵风六七级,最高气温31℃;夜间多云转晴,北风三级左右转一级,最低气温15℃。白天阵风明显,户外注意防风。尾号限行无昨日8时北京全市上汛,为做好2025年防汛抗旱工作,切实履行防汛抗旱…

Oracle递归/树状查询

目录 1.递归与LEVEL简介 2.往子项找 3.往父项找 4.练习题 练习1&#xff1a;找出BLAKE的直系下属有哪些&#xff1f; 练习2 5.递归的其他应用——生成连续的数字或日期 1.递归与LEVEL简介 递归&#xff1a;从顶层到下一层级&#xff0c;一层一层递归去找。 递归里…

美国发生针对性恐怖袭击 亲以色列团体遇袭

美国媒体6月1日报道,科罗拉多州博尔德市当天发生一起针对亲以色列团体活动的袭击事件,造成至少5人受伤。当地警方已经封锁事发街区并疏散数个邻近街区,一名男子被逮捕。美国联邦调查局将这一事件定性为“有针对性的恐怖袭击”。责任编辑:zhangxiaohua

巴媒称以军炸毁加沙中部清真寺 以色列暂无回应

据巴勒斯坦《圣城报》报道,当地时间6月2日凌晨,以色列军方飞机炸毁了加沙地带中部代尔拜拉赫的一座清真寺。目前,以色列方面尚未对此事作出回应。责任编辑:zhangxiaohua

InfluxDB 高级分析实战:预测、技术指标与异常检测全指南

InfluxDB 不仅是强大的时序数据存储引擎&#xff0c;更是企业构建智能分析系统的核心平台。本文全面解析如何利用 InfluxDB 内置函数与 Python 生态实现&#xff1a; ✅ ​​预测分析​​&#xff1a;从简单季节性预测&#xff08;HOLT_WINTERS&#xff09;到复杂模型集成&…

图解AI三大核心技术:RAG、大模型、智能体【推荐文章】

大模型中的Transformer与混合专家&#xff08;MoE&#xff09; 5种大模型微调技术 传统RAG与Agentic RAG对比 5种经典的智能体设计模式 5大文本分块策略 智能体系统的5个等级 传统RAG vs HyDE RAG vs Graph RAG KV caching 转载的原文链接&#xff1a;图解AI三大核心技术&#…

命令行部署金仓读写分离集群

有大佬会问&#xff0c;图形化方式部署多流畅&#xff0c;干嘛自虐非要倒腾命令行方式&#xff0c;那是因为我们的环境要通过VPN再到堡垒机最后才能xshell登录&#xff0c;而且VPN、堡垒机不定时频繁超时断开。 KingbaseES读写分离集群简介 在多数据库实例的热备模式下&#…

南部战区海军多艘舰艇实战化演练 提升协同作战能力

南部战区海军某训练中心联合某驱逐舰支队组织渭南舰、玉林舰等多艘舰艇,在多个海域展开多个课目训练,旨在检验编队协同作战能力和指挥员决策水平。在编队航行途中,突然接到上级通报,当前活动海区有敌方无人艇活动。各舰立即进入战斗状态。渭南舰雷达战位敏锐发现不明海上目…

乌对俄发动大规模特种作战 美方回应 未提前获知袭击计划

当地时间6月1日,美国政府官员表示,特朗普政府并未提前得知乌克兰将在周末对俄罗斯发起的大规模袭击行动。同一天,乌克兰国家安全局在社交媒体上宣布,对俄罗斯实施了特种作战行动,袭击了俄军的战略轰炸机。乌克兰总统泽连斯基当晚发表视频讲话称,乌国家安全局为此行动筹备…

VisionPro项目记录2 —— 不规则胶路检测

简介 本文介绍了一种基于Cognex视觉工具的胶路检测方法&#xff0c;分为直线和弧形两部分检测。 直线部分采用卡尺工具检测胶路宽度&#xff0c;通过动态调整仿射矩形区域进行多位置测量&#xff1b;弧形部分使用blob工具沿圆周设置检测区域。 两种方法均通过脚本实现工具映…

STM32F407寄存器操作(多通道单ADC+DMA)

1.前言 又是半年没更新了&#xff0c;趁着端午放假有点时间&#xff0c;并且最近项目要用这块知识&#xff0c;我就顺带研究一下ADC吧。 一般来说ADC主要用法包含了1.单通道软件触发&#xff08;这是最简单和最常用的用法&#xff09;2.单通道多次采集&#xff08;需要快速采…

RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇

一、背景 本文是RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇文章配套的,主要介绍前端对自定义字段传输加密的实现,两篇文章结合可以完整的完成RuoYi前后端分离框架对API通信过程中实现自定义字段加密传输。前端的加解密实现,不涉及到界面的修改,仅仅是方法的…

马斯克称不想为美政府所做一切担责 “政府效率部”成替罪羊

美国企业家埃隆马斯克在接受哥伦比亚广播公司采访时表达了对政府的看法。他表示自己并不想公开反对美国政府,但也不愿意为政府所做的一切承担责任。马斯克提到,他领导的“政府效率部”成了所有问题的替罪羊,所有的裁员无论真假都被归咎于这个部门。马斯克还表示,他对国会共…

苏超第三轮全部战罢 南通队强势领跑

6月1日晚9时28分,江苏省城市足球联赛第三轮结束。本轮赛事分为两个比赛日进行。5月31日,镇江队0∶2不敌宿迁队,常州队0∶1负于扬州队,徐州队2∶1战胜连云港队。6月1日,盐城队1∶0击败淮安队,泰州队0∶4输给南通队,南京队与无锡队的比赛以1∶0结束。本轮联赛中,南通队和…

节后粽子有买三送一还有6折出售 促销力度大吸引顾客

作为传统节令食品,粽子在今年端午节期间再次成为餐桌主角。与往年不同的是,除了经典的“咸甜之争”外,“低卡”、“低脂”等健康概念成为今年粽子市场的新亮点。据《2025中国粽子行业白皮书》,从规模上来看,2025年中国粽子行业市场规模将达到110亿元,增长率在7%左右,产量…

泽连斯基再提乌俄领导人会晤 需达成具体协议

据法新社报道,俄罗斯总统新闻秘书佩斯科夫周三对乌克兰总统泽连斯基呼吁举行美俄乌三国领导人会谈一事作出回应。佩斯科夫表示,只有在俄乌双方达成具体协议后,才有可能举行此类会谈。他强调,这样的会谈应是乌克兰和俄罗斯代表团之间达成具体协议的结果。此前,乌克兰总统泽…

3、禁止树莓派屏幕休眠,设置树莓派屏幕常亮

树莓派是微型电脑&#xff0c;系统自带休眠保护功能&#xff0c;但是有人可能会处理一些事务&#xff0c;想树莓派屏幕常亮&#xff0c;保证树莓派一直都处于活动状态&#xff0c;今天分享如何让树莓派屏幕常亮&#xff0c;禁止休眠的解决方案。 1、 系统&#xff1a;raspbia…

巴黎欧冠夺冠狂欢夜559人被捕 暴力事件引发谴责

法甲球队巴黎圣日耳曼在5月31日晚赢得欧冠联赛冠军奖杯,法国多地的球迷彻夜庆祝。然而,据法国内政部消息,在狂欢夜有559人因滋事被捕,并发生了两起命案。6月1日,法国总统马克龙在爱丽舍宫接见巴黎圣日耳曼球队时,严厉谴责了庆祝活动中发生的暴力事件,称这些行为“不可接…