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

目录

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

功能测试

在这里插入图片描述

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

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

自动化测试

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

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

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

步骤一、初始化测试用例

#创建一个浏览器对象
import datetime
import os.path
import sys

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


class 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.png
        dirname = datetime.datetime.now().strftime("%Y-%m-%d")
        #判断dirname文件夹是否已经存在,若不存在则创建文件夹
        # ../images/2024-09-24
        if 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.png
        filename = 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 time

from selenium.webdriver.common.by import By

from 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.driver
        self.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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        #错误的密码
        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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        #错误的密码
        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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        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则会出现关键词拼接,而不是替换。若要替换需要先clear
        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("")
        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 By

from 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.driver
        self.driver.get(self.url)
    #测试游戏大厅页面
    def HallTest(self):
        #测试游戏大厅页面是否正常显示,如果正常显示那么必有“游戏大厅”这一段标题
        actual = self.driver.title
        assert 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)
        #获取当前url
 		url = self.driver.current_url
        #比较期望url和当前的url
        assert url == "http://1.117.75.202:8080/game_hall.html"
        #添加屏幕截图
        GBDriver.getScreeShot()
     

步骤四、对游戏房间页面测试

from selenium.webdriver.common.by import By

from 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.driver
        self.driver.get(self.url)
    #测试游戏房间页面
    def RoomTest(self):
        
        # 设置隐式等待
        self.driver.implicitly_wait(5)
        #测试游戏房间页面是否正常显示,如果正常显示那么必有“游戏房间”这一段标题
        actual = self.driver.title
        assert 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%,没有出现服务不可用或关键功能故障的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机: 1、理解: 2、内核态与用户态: 1、概念: 2、重谈地址空间: 3、处理时机: 补充知识: 1、sigaction: 2、函数重入: 3、volatile&…

(三) 征服MySQL面试:30+高频核心问题深度剖析与实战指南

一、为什么MySQL是面试的"必答题"? 数据库领域占比:MySQL占据全球关系型数据库市场份额Top 3,阿里、腾讯、美团等大厂核心系统深度依赖技术栈深度检验:通过MySQL问题可考察候选人的数据结构理解、系统设计能力、性能优…

TensorFlow深度学习实战(10)——迁移学习详解

TensorFlow深度学习实战(10)——迁移学习详解 0. 前言1. 迁移学习1.1 迁移学习基本概念1.2 迁移学习的重要性1.3 ImageNet1.4 迁移学习流程2. Inception V3 架构3. 构建迁移学习模型小结系列链接0. 前言 迁移学习( Transfer Learning )是一种利用从一项任务中获得的知识来解…

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念

大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …

蓝桥杯题型

蓝桥杯题型分类 二分 123 传送门 1. 小区间的构成 假设数列的构成是如下形式: 第 1 个区间包含 1 个元素(1)。第 2 个区间包含 2 个元素(1 2)。第 3 个区间包含 3 个元素(1 2 3)。第 4 个区…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式,实现一般是通过SQL能直接生成数据API,同时能对产生的数据API进行全生命周期的管理,典型的SQL2API的实现模式。 以下是针对…

本地部署pangolin获取谱系,从而达到预测新冠的流行趋势

步骤 1:安装Docker 注:此步骤忽略,可通过Docker官网对于文档进行安装,地址如下 Docker: Accelerated Container Application Developmenthttps://www.docker.com/ 步骤 2:拉取Pangolin镜像 docker pull staphb/pangolin:latest 步…

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中,动画是提升用户体验的关键要素。通过巧妙运用动画,我们能让应用界面更加生动、交互更加流畅,从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力&…

K8S学习之基础十:k8s中初始化容器和主容器

init容器和主容器 init容器和主容器的区别 初始化容器不支持 Readinessprobe,因为他们必须在pod就绪之前运行完成每个init容器必须运行成功,下一个才能够运行 # 定义两个初始化容器,完成后再运行主容器 vi pod-init.yaml apiVersion: v1 …

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了,mybatis 的基本用法,动态SQL,学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中,对数据库的操作,常常涉及多张表。 因此本篇博客的目标:通过my…

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限,厂商并没有实现完整的OpenGL特性,而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台,最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…

【Python项目】基于深度学习的电影评论情感分析系统

【Python项目】基于深度学习的电影评论情感分析系统 技术简介:采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介:该系统基于深度学习技术,特别是Word2Vec模型,用于分析电影评论的情感倾向。系统分为前台…

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…

第二次CCF-CSP认证(思路及源码)

第二次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)基本思路及AC代码 第三道(mid)基本思路及AC代码solution 1 (模拟)solution 2(KMP) 第一道(easy) 题…

RAGflow 无法加载Embedding模型

部署0.17版本的RAGflow,在模型列表中已经添加了嵌入模型,但是知识库配置时,嵌入模型灰显: 问题原因: 提前上传了一个文档,在知识库有文档之后,就不能够修改嵌入模型了。删除文档之后&#xff0…

C++ Primer 拷贝、赋值与销毁

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…