基于websocket的多用户网页五子棋 --- 测试报告
目录
- 功能测试
- 自动化测试
- 性能测试
功能测试

1.登录注册页面

2.游戏大厅页面

3.游戏房间页面

自动化测试
1.使用脑图编写web自动化测试用例

2.创建自动化项目,根据用例通过selenium来实现脚本
根据脑图进行测试用例的编写:
- 每个页面一个测试类,然后再各个测试类中进行测试用例的编写。
- 注意公共属性需要单独放一个类,方便进行代码复用。
- 使用测试套件便于运行以及修改。
- 创建启动以及现场截图就是会频繁进行复用,所以单独创建一个类进行存储。
- 注意添加隐式等待,为了确保页面正确加载显示。
步骤一、初始化测试用例
#创建一个浏览器对象
import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)self.driver.implicitly_wait(2)def getScreeShot(self):#创建屏幕截图#图片文件名称:./2024-09-24-173456.pngdirname = datetime.datetime.now().strftime("%Y-%m-%d")#判断dirname文件夹是否已经存在,若不存在则创建文件夹# ../images/2024-09-24if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)#2024-09-24-173456.png#图片路径:../images/调用方法-2024-09-24/2024-09-24-173456.png#图片路径:../images/LoginSucTest-2024-09-24/2024-09-24-173456.png#图片路径:../images/LoginFailTest-2024-09-24/2024-09-24-173456.pngfilename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"self.driver.save_screenshot("../images/"+dirname+"/"+filename)GBDriver = Driver()
步骤二、对登录注册页面的测试
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import GBDriver
#测试在线OJ系统登陆页面class GBLogin:url = ""driver = ""def __init__(self):self.url = "http://1.117.75.202:8080/login.html"self.driver = GBDriver.driverself.driver.get(self.url)#成功登陆的测试用例def LoginSucTest(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#能够找到首页用户的昵称,说明登录成功,否则登录失败self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")#添加屏幕截图GBDriver.getScreeShot()#返回到登陆页面self.driver.back()#异常登陆的测试用例def LoginFailTest1(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")#错误的密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否登录失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"def LoginFailTest2(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")#错误的密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否登录失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"def LoginFailTest3(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")#错误的密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否登录失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"def LoginFailTest4(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")#错误的密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否登录失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"#成功注册的测试用例def RegisterSucTest(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("lisi")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#检查是否注册成功actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "注册成功!"#异常注册的测试用例def RegisterFailTest1(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()#已存在的用户名self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否注册失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名已存在!"def RegisterFailTest2(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")#密码为空self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否注册失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"def LoginFailTest3(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi")#密码为空self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否注册失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"def LoginFailTest4(self):#若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#检查是否注册失败actual=self.driver.find_element(By.CSS_SELECTOR,"body").text#添加屏幕截图GBDriver.getScreeShot()#断言检测一下是否符合预期assert actual == "用户名或密码为空!"login = GBLogin()
login.LoginSucTest()
login.LoginFailTest()
步骤三、对游戏大厅页面测试
from selenium.webdriver.common.by import Byfrom common.Utils import GBDriver
class GBHall:url = ""driver = ""def __init__(self):self.url = "http://1.117.75.202:8080/game_hall.html"self.driver = BlogDriver.driverself.driver.get(self.url)#测试游戏大厅页面def HallTest(self):#测试游戏大厅页面是否正常显示,如果正常显示那么必有“游戏大厅”这一段标题actual = self.driver.titleassert actual == "游戏大厅"#添加屏幕截图GBDriver.getScreeShot()#测试游戏大厅页面是否有玩家信息模块screen_element = self.driver.find_element(By.ID, "screen")#添加屏幕截图GBDriver.getScreeShot()#点击“开始匹配”按钮,检查是否有匹配成功或匹配失败self.driver.find_element(By.CSS_SELECTOR,"body > div > div > div.match-button").click()# 设置隐式等待self.driver.implicitly_wait(5)#获取当前urlurl = self.driver.current_url#比较期望url和当前的urlassert url == "http://1.117.75.202:8080/game_hall.html"#添加屏幕截图GBDriver.getScreeShot()
步骤四、对游戏房间页面测试
from selenium.webdriver.common.by import Byfrom common.Utils import GBDriver
class GBRoom:url = ""driver = ""def __init__(self):self.url = "http://1.117.75.202:8080/game_room.html"self.driver = BlogDriver.driverself.driver.get(self.url)#测试游戏房间页面def RoomTest(self):# 设置隐式等待self.driver.implicitly_wait(5)#测试游戏房间页面是否正常显示,如果正常显示那么必有“游戏房间”这一段标题actual = self.driver.titleassert actual == "游戏房间"#添加屏幕截图GBDriver.getScreeShot()#测试游戏房间页面是否有玩家聊天区域screen_element = self.driver.find_element(By.ID, "body > div > div.chat_area")#添加屏幕截图GBDriver.getScreeShot()
性能测试
使用 jmeter 进行简单性能测试:针对用户管理、用户匹配、游戏对战功能进行简单的性能测试。
测试策略为并发梯度测试,每隔10s新增10个线程,最终达到100个线程并发访问。
- 对注册功能进行性能测试
- 对登录功能进行性能测试
- 对匹配功能进行性能测试
- 对对战功能进行性能测试
测试结果概述
在本次测试中,对系统的关键性能指标进行了全面评估,包括但不限于响应时间、吞吐量和错误率。测试覆盖了以下3个核心功能模块:用户管理、用户匹配、游戏对战功能。
(1)响应时间
总体表现:系统在大多数情况下响应时间较为稳定。用户登录、题目列表加载、具体题目查看、提交评测等操作在高并发场景下表现良好。
例外情况:注册功能在高并发场景下出现性能瓶颈,响应时间显著增加,部分请求达到 30,000ms 以上,影响用户体验。
(2)吞吐量
系统在高负载条件下表现出良好的吞吐能力,能够有效处理大量并发请求。尽管在某些时段出现小幅波动,但整体保持稳定。
(3)错误率
系统的错误率维持在 0%,没有出现服务不可用或关键功能故障的情况。
相关文章:
基于websocket的多用户网页五子棋 --- 测试报告
目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目,根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写: 每个页面一个测试类&am…...
TypeError: Cannot assign to read only property ‘xxx‘ of object ‘#<Object>‘
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
SyntaxError: Unexpected token ‘xxx‘
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
简记_开关电源基础知识(二)
一、控制器与稳压器 假设开关损耗、导通损耗、驱动损耗的变化远小于输出功率的变化(可忽略),则占空比越大,Po越大,效率越高。 二、同步与非同步 同步是采用通态电阻极低的MOSFET来取代整流二极管,以降低整…...
grum-与gam-词源故事
“grum”词根的含义主要与“咕隆、发哼声、咕咕叫、发隆隆声”等相关。在16世纪90年代后,这个词开始被用来表示发出低沉持续的咆哮声或隆隆声,类似于饥饿的胃或某些动物发出的声音。 早期的富贵家族经常雇佣人去干活,体力活很容易因为劳工过…...
联合索引关于In和范围查询影响索引使用的情况分析
索引类型 1、unique ,唯一索引 2、normal,普通索引 3、fulltext, 全文索引 4、spatial,空间索引 样例 三个字段的联合索引,走一个字段是key_len是5,三个是15. 联合索引关于 使用in是不影响后续列 范围查询大于或小于…...
【目标检测】【NeuralPS 2023】Gold-YOLO:通过收集与分发机制实现的高效目标检测器
Gold-YOLO: Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO:通过收集与分发机制实现的高效目标检测器 0.论文摘要 在过去的几年中,YOLO系列模型已成为实时目标检测领域的领先方法。许多研究通过修改架构、增强数…...
2025上软考下周开启报名!附报考流程和常见问题解答
报名时间 :3月10日开始报名(以当地报名时间为准) 考试时间 :2025年5月24日~27日(具体时间以准考证为准) 报名网址 :中国计算机技术职业资格网(https://bm.ruankao.org.cn/sign/welcome) 目前已…...
PPT 小黑第16套
对应大猫19 在excel中复制表格 粘贴-选择性粘贴 -粘贴链接 业务部门和档案管理部门 剩下都是他们的下属级别 业务部门下面的选中按Tab 再选中Tab降级变成所属...
Swagger-01.介绍和使用方式
一.Swagger介绍 有了接口文档,我们就可以根据接口文档来开发后端的代码了。如果我们开发完了某个功能,后端如何验证我们开发的是否正确呢?我们就需要测试,使用Swagger就可以帮助后端生成接口文档,并且可以进行后端的接…...
从CL1看生物计算机的创新突破与发展前景:技术、应用与挑战的多维度剖析
一、引言 1.1 研究背景与意义 随着科技的飞速发展,计算机技术已经成为推动现代社会进步的核心力量之一。从最初的电子管计算机到如今的大规模集成电路计算机,计算机的性能得到了极大的提升,应用领域也不断拓展。然而,传统计算机…...
OpenCV视频解码性能优化十连击(实测帧率提升300%)
解密工业级视频处理优化方案!从硬件加速到多线程榨干CPU/GPU性能,附RTSP流调优参数与内存泄漏排查技巧。 🔧 优化前准备 环境检测脚本 import cv2# 验证硬件加速支持 print("CUDA支持:", cv2.cuda.getCudaEnabledDeviceCount() &…...
springboot3 RestClient、HTTP 客户端区别
1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...
智能手表不可插卡怎么用
一、连接蓝牙 智能手表一般都可以通过蓝牙连接手机,以实现一些基础功能。连接方式一般分为以下几步: 1、首先打开手机的蓝牙功能,并在蓝牙列表中搜索手表的设备名称。 2、找到手表的设备名称后,点击连接即可完成蓝牙连接。 3、…...
blender看不到导入的模型
参考:blender 快捷键 常见问题_blender材质预览快捷键-CSDN博客 方法一:视图-裁剪起点,设置一个很大的值 方法二:选中所有对象,对齐视图-视图对齐活动项-选择一个视图...
【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器
更新日期:2025年3月7日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中,文件夹锁定器能够为任何文件夹加…...
智能体开发:推理-行动(ReAct)思维链提示
人类在处理一个需要多个步骤才能完成任务时,显著特点是能够将言语推理(内心独白)和实际行动融合在一起,在面对陌生或不确定的情况时通过这种方法学习新知识,做出决策,并执行,从而应对复杂的任务…...
机试准备第11天
第一题是浮点数加法,目前写过最长的代码。 #include <stdio.h> #include <string> #include <iostream> #include <vector> using namespace std; int main() {string str1;string str2;while (getline(cin, str1) && getline(cin…...
【Proteus仿真】【STM32单片机】智能阳台控制系统
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用按键、LCD1604液晶、DHT11温湿度模块、PCF8591 ADC、光线传感器、PM2.5传感器、土壤湿度传感器、继电器、水泵、电灯、28BYJ48步进电机等。 主要…...
Manus AI Agent 技术解读:架构、机制与竞品对比
目录 1. Manus 是什么? 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在? 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
