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

news2025/3/9 11:55:26

目录

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

功能测试

在这里插入图片描述

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%,没有出现服务不可用或关键功能故障的情况。

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

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

相关文章

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

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

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际,《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经,不仅预测了2025年AI技术爆发点,更将「天人合一」的东方智慧融入AI伦理建构,堪称数字时代的《道德经》。 文档:清华大学第…

【论文笔记】Attentive Eraser

标题:Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source:https://arxiv.org/pdf/2412.12974 收录:AAAI 25 作者单位:浙工商,字节&#…

97k倍区间

97k倍区间 ⭐️难度:中等 🌟考点:暴力,2017省赛 📖 📚 import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…

cursor使用经验分享(java后端服务开发向)

前言 cursor是一款基于vscode,并集成AI能力的代码编辑器,其功能包括但不限于代码生成及补全、AI对话(能够直接将代码环境作为上下文)、即时应用建议等等,是一款面向未来的代码编辑器。 对于vscode,最先想…

SpringBoot3—场景整合:AOT

一、AOT与JIT AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码 JIT:Just in Time(即时编译): 程序边编译,边运行; 编译:源代码&am…

蓝桥与力扣刷题(蓝桥 数字三角形)

题目: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述…

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产:game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程,从像素渲染到不使用GPU的方式,我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…

嵌入式学习L5D2-exec函数族和守护进程

exec函数族1 下面那个加了p环境变量就不用那个了。 输出的是系统 exec函数族2 后面不执行了 第二个参数瞎写也可以,但是要填 这里是说不想被替换,就在子进程里面执行这个。 守护进程概念 后台进程 守护进程是后台进程 一个fork了一个进程&#xff…

洛谷P1091

题目如下 思路 谢谢观看

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式,它的主要设计思想是提供一个可以操作聚合对象(容器或者复杂数据类型)表示(迭代器类)。通过迭代器类去访问操作聚合对象可以隐藏内部表示,也可以使客户端可以统一处理…

【五.LangChain技术与应用】【29.LangChain Agent小案例1:智能代理的实战应用】

“为什么我的Agent总是处理不好实时数据?”“如何让AI自己调用API查股票?” 这些困扰开发者的问题,今天咱们用一个真实案例来彻底解决。不聊虚的,直接上手教你怎么用LangChain Agent造一个会自己查股价、算指标、生成报告的股票分析助手。全程高能,代码可直接复制粘贴到项…

windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐

windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐 一、Spleeter 是什么? Spleeter 是由法国音乐流媒体公司 Deezer 开发并开源的一款基于深度学习的音频分离工具。它能够将音乐中的不同音轨(如人声、鼓、贝斯、钢琴等)分…

dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体

故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…

pytorch3d学习(二)——安装与纹理显示demo测试

文章目录 零、安装一、渲染0. 导入模块1. 加载网格和纹理文件零、安装 参考了这篇文章:Pytorch3D Linux环境下安装(踩坑)记录 经历了红框子里面的步骤,然后测试一下官方给的代码,尝试一些 3D 算子,例如计算两个网格之间的倒角损失: from pytorch3d.utils import ico_s…

C语言基础之【指针】(下)

C语言基础之【指针】(下) 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…

Redis--Hash类型

目录 一、引言 二、介绍 三、操作 1.HSET,HGET,HEXISTS,HDEL 2.HKEYS,HVALS 3.HGETALL,HMGET,HSAN 4.HLEN,HSETNX,HINCRBY,HINCRBYFLOAT 四、编码方式 1.ziplist(压缩列表) 2.hashtable(哈希表&am…

大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)

前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段: Pre-train:根据大量可获得的文本资料&#…

共享模型之管程(悲观锁)

共享模型之管程(悲观锁) 文章目录 共享模型之管程(悲观锁)一、常见线程安全的类二、对象头三、Monitor(监视器 / 管程)四、偏向锁偏向锁的实现原理撤销偏向锁 五、轻量级锁轻量级锁的释放 六、重量级锁七、…

零基础C语言学习日志22(自定义类型:联合和枚举)

目录 联合体 联合体类型的声明 联合体的特点 相同成员联合体和结构体的对比 联合体大小的计算 例子 枚举类型 枚举类型的声明 枚举类型的优点 枚举类型的使用 联合体 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成…