【测试】五子棋项目测试报告

news2025/1/11 7:38:25

目录

一、项目概述及测试目标

二、项目功能 

三、测试类型 

1)功能测试      

​编辑

2)自动化测试 

四、测试总结


一、项目概述及测试目标

本项目是一个基于Web的五子棋实时对战应用,旨在提供用户之间的多人实时游戏体验。项目采用前后端分离的方法来实现,使用了数据库来存储相关的数据,并将其部署到了云服务器上。前端主要有四个页面构成:登录页、注册页、游戏大厅页以及游戏房间页,测试的目标是验证游戏的功能完整性。

二、项目功能 

该五子棋对战项目主要实现了以下几个功能:登录、注册、匹配和对战功能。

  1. 用户注册与登录:玩家可以注册账户并进行登录,每个玩家保存个人积分信息以及游戏记录(场数、胜场数)。
  2. 游戏大厅页面:展示在线玩家信息和进行玩家匹配功能。使用 WebSocket 协议实现实时匹配功能,处理了多开问题、线程安全问题及忙等问题,避免因并发而导致的意外行为。
  3. 游戏房间页面:当两个积分相近的玩家成功匹配后,会进入游戏房间界面,使用 WebSocket 进行页面初始化,并发送请求和接收响应,前端发送落子请求,后端进行胜利逻辑判断并返回落子响应,实现实时对战。
  4. 掉线处理:针对玩家掉线进行及时处理,当一名玩家掉线后,另一名玩家能第一时间收到通知,并进行胜负判定。

三、测试类型 

1)功能测试      

测试用例:

实际执行测试的部分操作步骤/截图:

a)登录界面 - 输入正确用户名和密码进行登录

b)游戏大厅页面

c)匹配逻辑测试

d)游戏胜负判定

e)多开处理 - 后登录的将被强制退出

f)掉线处理 - 对方直接关闭页面或网络异常,直接判定游戏胜负

以上测试均成功通过。 

2)自动化测试 

使用 Selenium 对登录,匹配等基础功能进行了简单测试。

五子棋项目自动化测试代码仓库(gitee)

自动化中涉及到的通用操作封装在一个类中,如创建驱动对象,屏幕截图等。

import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.time.Duration;

public class InitAndEndBrowser {
    static WebDriver webDriver;

    @BeforeAll
    static void openGobangSystem() {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        webDriver = new ChromeDriver(options);
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    }

    @AfterAll
    static void closeGobangSystem() {
        webDriver.quit();
    }
}

部分功能的自动化测试 

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;

import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.assertNotNull;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class GobangTest extends InitAndEndBrowser {

    //登录成功测试
    @Order(2)
    @ParameterizedTest
    @CsvSource({"'zhangsan', '123456'"})
    void loginSuccessful(String username, String password) {
        webDriver.get("http://47.121.113.16:9090/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        //登录后,应跳转到游戏大厅页面
        //检验是否有开始匹配这个按钮
        String text = webDriver.findElement(By.cssSelector("#match-button")).getText();
        if ("开始匹配".equals(text)) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    //登录失败测试
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "loginfalied.csv")
    void loginFailed(String username, String password) throws InterruptedException {
        webDriver.get("http://47.121.113.16:9090/login.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(2000);
        //登录失败,会出现一个alert弹窗
        Alert alert = webDriver.switchTo().alert();
        if (alert != null) {
            System.out.println("测试通过,弹框内容: " + alert.getText());
        } else {
            System.out.println("测试不通过");
        }
        assertNotNull(alert);
        alert.dismiss();  //关闭弹窗
    }

    //匹配按钮的显示功能测试(放在登录成功测试之后执行)
    @Order(3)
    @Test
    void matchButtonTest() throws InterruptedException {
//        webDriver.get("http://47.121.113.16:9090/login.html");
//        webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
//        webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
//        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(2000);
        //此时按钮显示的是开始匹配,点击后看是否变成了匹配中
        webDriver.findElement(By.cssSelector("#match-button")).click();
        sleep(2000);
        String text = webDriver.findElement(By.cssSelector("#match-button")).getText();
        if (text.equals("匹配中...(点击停止)")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }
}

四、测试总结

五子棋实时对战Web项目在功能方面表现良好,测试过程中发现的问题都及时修复。但由于云服务器资源不足,带宽有限,与客户端的网络连接不够稳定,因此暂时未能进行完整的性能和压力测试。

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

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

相关文章

阿里巴巴图标库iconfont的使用方式

文章目录 什么是 iconfong创建一个自己的项目如何使用Unicode 使用方法Font class 使用方式Symbol 使用方式还有一种使用方式 在线链接(不推荐,但可用于测试) 什么是 iconfong Iconfont 是一种图标字体服务。它将各种图标设计转换为字体格式…

pgrouting使用

pgRouting是一个为PostgreSQL和PostGIS提供路由功能的开源库,它支持复杂的图论算法,用于在地理网络中进行最短路径搜索。以下是pgRouting的一些应用实例。 注意事项: 1、路网表中的id、source、target必须是int类型,否则创建拓扑…

Docker(二):Docker image Docker Container

本文将介绍 Docker 映像和容器以及 docker 文件之间的差异与联系,本文还将解释如何以及何时使用它们。 什么是 Dockerfile? 它是一个简单的文本文件,包含命令或过程的集合。我们运行的这些命令和准则作用于配置为创建新的 Docker 镜像的基本…

【linux学习---1】点亮一个LED---驱动一个GPIO

文章目录 1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结 1、原理图找对应引脚 从上图 可以看出, 蜂鸣器 接到了 BEEP 上, BEEP 就是 GPIO5_IO05 2、IO复用 查找IMX6UL参考手册 和 STM32一样,如果某个 IO 要作为…

[不可抗拒的吸引]韩漫日漫无删减完整版,免费在线观看漫画

[不可抗拒的吸引]韩漫日漫无删减完整版,免费在线观看漫画 不能多说,怕审-核不过,自己看图吧。 食用方法: https://blog.csdn.net/qq_42098517/article/details/140079915 https://gitee.com/zzwuweijun/manhua/blob/master/READ…

入门Axure:快速掌握原型设计技能

2002 年,维克托和马丁在旧金山湾区的一家初创公司工作,发现自己一再被软件开发生命周期的限制所困扰,而且产品团队在编写规范之前很难评估他们的解决方案,开发人员经常不理解(或不阅读)给出的规范&#xff…

springboot城市菜园共享系统00524

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2 国内外研究现状和发展趋势 1.3论文结构与章节安排 2 城市菜园共享系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.…

Guitar Pro怎么把和弦图放在谱子上方 Guitar Pro怎么设置和弦

在音乐中,和弦是音乐的基本单位。而吉他和弦是指在吉他上按压弦与弹奏弦的组合,我们可以在乐谱中通过和弦图来表现吉他的按压点位,以及弹奏的弦。下面我们看看Guitar Pro怎么把和弦图放在谱子上方,Guitar Pro怎么设置和弦的相关内…

Python+pytest接口自动化之token关联登录的实现

在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示需要先登录。 这其实就…

【Python】从文本字符串中提取数字、电话号码、日期、网址的方法汇总(全!)

我们在做数据清洗的时候,有时候会遇到将一堆文本中提取我们需要的内容,最常见的是,从一大段文本中提取出数字、电话号码、日期、网址等。而在Python中,正则表达式re,则可以满足我们从文本中提取数字、电话号码和日期等…

测试Andrew NG的语言翻译Agent

我正在测试 Andrew Ng 的语言翻译 A​​I 代理系统及其在逆变换下的稳定性。 给定源语言的文本,我们应用翻译函数 f,然后应用 f 的逆。它应该是不变的: 但是,数学与语言翻译有什么关系? 在完美的系统中,从…

德翔海运核心盈利指标大幅下滑,大额分红56亿不缺钱仍募资补流

《港湾商业观察》黄懿 5月30日,航运公司德翔海运(TS Lines,下称“德翔海运”)再一次向港交所递交招股书,计划在主板挂牌上市,由摩根大通和招商证券国际担任联席保荐人。 据悉,2022年至2023年&…

【js】数组元素拼接、数组元素类型转换

一、数组元素拼接 二、数组元素类型转换 1、字符串数组 转换成 数字型数组 [1, 2, 3].map(Number) // [1,2,3] 2、数字型数组 转换成 字符串数组 [1, 2, 3].map(String) // [1, 2, 3]

Java语法 小白入门参考资料 数组

数组的基本概念 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。 比如现实中的车库: 在java中,包含6个整形类型元素的数组,就相当于上图中连在一起的6个车位,从上图中可以看到: 数组…

【C++】开源:量化金融计算库QuantLib配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#…

【linux】网络基础(3)——tcp协议

文章目录 TCP协议概括TCP头部格式TCP连接管理建立连接(三次握手)数据传输确认应答机制捎带应答 滑动窗口丢包问题 拥塞控制延时应达 终止连接(四次挥手) TCP协议概括 TCP是一个面向连接的协议,在传输数据之前需要建立连…

Zabbix 配置进程监控

Zabbix 进程监控介绍 Zabbix可以很方便地监控服务器上的各种进程。在使用Zabbix进行进程监控时,被监控的节点通常需要安装Zabbix Agent。Zabbix Agent 是一个轻量级的代理程序,安装在被监控的主机上,用于收集系统的各种性能数据和指标&#…

OpenBMB × Hugging Face × THUNLP,大模型课开班丨伙伴活动推荐

2022 年,OpenBMB 开源社区联合 THUNLP 开国内大模型公开课先河,全网百万级播放量,已帮助无数大模型爱好者从入门到精通。 这个夏天,OpenBMB 携手 HuggingFace、THUNLP 和面壁智能,推出大模型公开课第二季。全球知名开…

vue实现一个简单的审批绘制功能

1、vue代码 <div class"approval"><div class"approval_ul" v-for"(item,key) in approvalList" :key"key"><div><el-radio-group v-model"item.jointlySign"><el-radio label"1">…

人大出品!最适合大模型初学者人手的LLM大语言模型综述,爆火全网

今天给大家推荐一本大模型&#xff08;LLM&#xff09;这块的一本外文书&#xff0c;经过整理已经出中文版了&#xff0c;就是这本《大型语言模型综述》&#xff01;本书在git上有9.2k star&#xff0c;还是很不错的一本大模型方面的书。 本教程内容主要内容&#xff1a;中文版…