基于websocket的多用户网页五子棋 --- 测试报告

目录

  • 功能测试
  • 自动化测试
  • 性能测试

功能测试

在这里插入图片描述

1.登录注册页面
在这里插入图片描述
2.游戏大厅页面
在这里插入图片描述

3.游戏房间页面
在这里插入图片描述

自动化测试

1.使用脑图编写web自动化测试用例
在这里插入图片描述

2.创建自动化项目,根据用例通过selenium来实现脚本
根据脑图进行测试用例的编写:

  1. 每个页面一个测试类,然后再各个测试类中进行测试用例的编写。
  2. 注意公共属性需要单独放一个类,方便进行代码复用。
  3. 使用测试套件便于运行以及修改。
  4. 创建启动以及现场截图就是会频繁进行复用,所以单独创建一个类进行存储。
  5. 注意添加隐式等待,为了确保页面正确加载显示。

步骤一、初始化测试用例

#创建一个浏览器对象
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个线程并发访问。

  1. 对注册功能进行性能测试
  2. 对登录功能进行性能测试
  3. 对匹配功能进行性能测试
  4. 对对战功能进行性能测试

测试结果概述
在本次测试中,对系统的关键性能指标进行了全面评估,包括但不限于响应时间、吞吐量和错误率。测试覆盖了以下3个核心功能模块:用户管理、用户匹配、游戏对战功能。
(1)响应时间
总体表现:系统在大多数情况下响应时间较为稳定。用户登录、题目列表加载、具体题目查看、提交评测等操作在高并发场景下表现良好。
例外情况:注册功能在高并发场景下出现性能瓶颈,响应时间显著增加,部分请求达到 30,000ms 以上,影响用户体验。
(2)吞吐量
系统在高负载条件下表现出良好的吞吐能力,能够有效处理大量并发请求。尽管在某些时段出现小幅波动,但整体保持稳定。
(3)错误率
系统的错误率维持在 0%,没有出现服务不可用或关键功能故障的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker学习与使用

一、docker概述 1.docker是什么 是一个开源的应用容器引擎,基于go语言开发并遵循apache2.0协议开源 是在Linux容器里运行应用的开源工具 是一种轻量级的 “虚拟机” Docker的容器技术,可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器…

2025-03-04 学习记录--C/C++-C语言 判断是否是素数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 判断是否是素数 一、代码 ⭐️ #include <stdio.h> #include <stdbool.h> // 使用 bool 类型// 判断是否是…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用

离散傅里叶变换&#xff08;DFT&#xff09;及其在图像处理中的应用 什么是离散傅里叶变换&#xff1f; 离散傅里叶变换&#xff08;Discrete Fourier Transform, DFT&#xff09;是一种强大的数学工具&#xff0c;用于将离散信号从时域&#xff08;或空间域&#xff09;转换…

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍 Google Test&#xff08;GTest&#xff09;是 Google 开源的 C 单元测试框架&#xff0c;它提供了简单易用的断言、测试夹具&#xff08;Fixtures&#xff09;和测试运行机制&#xff0c;使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…

Oracle SQL优化实战要点解析(11)——索引、相关子查询及NL操作(1)

11.1. 充分利用索引有序特性,避免发生大表上的FTS,以及对中间大数据集的排序。 11.1.1. 适用场景 从一个或多个大表(例如:亿行级或TB级数据量)中过滤出全列大数据集(例如:数百万或千万行数据),对该大数据集按其中某列进行排序,最终,只取最前面的少部分数据(例如:…

软考架构师笔记-计算机网络

1.9 计算机网络 OSI/RM 七层模型 物理层 二进制传输(中继器、集线器) (typedef) 数据链路层 传送以帧为单位的信息(网桥、交换机、网卡) 网络层 分组传输和路由选择(三层交换机、路由器)ARP/RARP/IGMP/ICMP/IP 传输层 端到端的连接(TCP/UDP)在前向纠错系统中&#xff0c;当接…

STM32MP157A单片机移植Linux系统使用python链接云服务器

思维导图 需求分析 stm32mp157a单片机上移植Linux操作系统&#xff0c;包括LCD驱动、触摸驱动、Ethernet/WiFi支持&#xff0c;设备树信息包括ADC、GPIO、LCD&#xff0c;使用QT上位机在PC端显示&#xff0c;通过TCP与stm32交互&#xff0c;将ad数据传输到PC端和云服务器&…

【MySQL】Can‘t connect to server in ‘localhost‘

【问题】连接MySQL数据库时报错&#xff1a; 【原因】没有启动MySQL服务 【解决方法】&#x1f447;&#x1f447;&#x1f447; 1.以管理员身份运行PowerShell 2.执行命令&#xff1a;net start MySQL 提示 “MySQL服务已经启动成功” 就说明成功了&#xff0c;这时再连…

OceanBase-obcp-v3考试资料梳理

集群架构 基本概念 集群: 集群由一个或多个Region组成,Region 由一个或多个Zone组成,Zone由一个或多个OBServer组成,每个OBServer里有若干个partition的Replica。 Region: 对应物理上的一个城市或地域,当OB集群由多个Region组成时, 数据库的数据和服务能力就具备地域…

Vue 系列之:组件通讯

子组件调用父组件方法 1、直接在子组件中通过 this.$parent.event 来调用父组件的方法 父组件&#xff1a; <template><p><child></child></p> </template> <script>import child from ./child;export default {components: {chi…

ComfyUI简介

一、ComfyUI 是什么&#xff1f; ComfyUI 是一款基于节点的图形用户界面&#xff08;GUI&#xff09;&#xff0c;专为 Stable Diffusion 设计。它通过模块化节点连接的方式构建复杂的图像生成工作流&#xff0c;用户可自由组合加载模型、输入提示词、调整采样器等操作模块&am…

我的两个医学数据分析技术思路

我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究&#xff0c;是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分&#xff0c;可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…

【YOLOv12改进trick】StarBlock引入YOLOv12,创新涨点优化,含创新点Python代码,方便发论文

🍋改进模块🍋:StarBlock 🍋解决问题🍋:采用StarBlock将输入数据映射到一个极高维的非线性特征空间,生成丰富的特征表示,使得模型在处理复杂数据时更加有效。 🍋改进优势🍋:简单粗暴的星型乘法涨点却很明显 🍋适用场景🍋:目标检测、语义分割、自然语言处理…

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…

《今日AI-人工智能-编程日报》

1. 字节跳动发布AI编程工具Trae国内版 发布背景&#xff1a;字节跳动于2025年3月3日正式推出国内版AI编程工具Trae&#xff0c;这是国内首个AI原生集成开发环境&#xff08;AI IDE&#xff09;&#xff0c;旨在提升开发者的编程效率与智能化体验。 核心功能&#xff1a; 搭载d…

doris: MySQL

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 MySQL 数据库。本文档介绍如何配置 MySQL 数据库连接。 使用须知​ 要连接到 MySQL 数据库&#xff0c;您需要 MySQL 5.7, 8.0 或更高版本 MySQL 数据库的 JDBC 驱动程序&#xff0c;您可以从 Maven 仓库下载最新或指定版本的…

【LangChain】存储与管理对话历史

0. 代码演示 from langchain_community.chat_message_histories import SQLChatMessageHistorydef get_session_history(session_id):# 通过 session_id 区分对话历史&#xff0c;并存储在 sqlite 数据库中return SQLChatMessageHistory(session_id, "sqlite:///memory.d…

从0开始的操作系统手搓教程21:进程子系统的一个核心功能——简单的进程切换

目录 具体说说我们的简单RR调度 处理时钟中断处理函数 调度器 schedule switch_to 我们下面&#xff0c;就要开始真正的进程切换了。在那之前&#xff0c;笔者想要说的是——我们实现的进程切换简单的无法再简单了——也就是实现一个超级简单的轮询调度器。 每一个进程按照…

mysql新手常见问题解决方法总结

1. 安装与配置问题 1.1 无法安装MySQL Server MySQL Server安装失败是新手常见的问题之一&#xff0c;以下是具体原因及解决方案&#xff1a; 系统要求不满足&#xff1a;MySQL对操作系统有最低版本要求&#xff0c;如Windows 7 SP1及以上、macOS 10.13及以上。若系统版本过…