网络五子棋对战游戏测试报告
1. 项目背景
本次测试的对象为网络五子棋对战游戏项目(线上地址:http://106.53.219.176:8085
,项目源码:网络五子棋对战项目),该项目支持用户注册、登录、游戏大厅交互(用户信息查看、匹配对战)等核心功能,面向普通玩家提供在线五子棋对战服务。本次测试旨在通过功能验证、自动化执行等手段,确保游戏核心模块(注册、登录、游戏大厅)界面以及功能正确性、稳定性。
2. 测试范围
2.1 功能测试范围
模块 | 覆盖功能点 |
---|---|
注册模块 | 1. 新用户成功注册(唯一用户名);2. 重复用户名注册失败;3. 空用户名 / 空密码注册失败;4. 注册页面元素显示正确性 |
登录模块 | 1. 正确账号密码登录成功;2. 错误账号 / 密码登录失败;3. 空账号 / 空密码登录失败;4. 登录后弹窗处理;5. 登录页面标题显示正确性 |
游戏大厅模块 | 1. 未登录进入大厅的警告弹窗处理;2. 登录后用户信息(积分、比赛场次)显示正确性;3. 匹配按钮功能(开始匹配 / 停止匹配);4. 大厅页面元素显示正确性 |
对战房间模块 | 1.棋盘显示正常;2.聊天界面显示正常;3.双方进入对战后,一方下棋时另一方不能下棋;4.双方能自由聊天;5.一方五子连珠时游戏正常结束;6.聊天敏感词汇(“菜鸡”)不允许发送 |
2.2 非功能测试范围
测试类型 | 覆盖场景 |
---|---|
稳定性测试 | 1. 连续多次登录 / 注册操作无崩溃;2. 匹配按钮反复点击(开始 / 停止)功能正常;3. 页面跳转(登录→大厅)无卡死 |
弱网测试 | 1. 弱网环境下(网络延迟 500ms+)注册 / 登录的弹窗响应是否正常;2. 弱网下用户信息加载是否正常 |
兼容性测试 | 1. Chrome 浏览器(141.0.7390.76版本)下功能正常;2.不同浏览器(QQ浏览器、Edge浏览器)下页面是否异常 |
3. 需求分析
3.1 功能需求
模块 | 功能需求描述 | 优先级 |
---|---|---|
注册模块 | 1. 用户名需唯一,重复用户名提示 “用户名已被占用”;2. 用户名 / 密码不能为空,空值提示 “请输入用户名 / 密码”;3. 注册成功提示 “注册用户成功” 并跳转 | 高 |
登录模块 | 1. 正确账号密码登录后弹出 “登录成功”“连接大厅成功” 弹窗;2. 错误凭证登录提示 “账号或密码错误”;3. 登录后支持返回登录页重新登录 | 高 |
游戏大厅模块 | 1. 未登录进入大厅弹出警告弹窗;2. 登录后显示当前用户积分、比赛场次;3. 点击 “开始匹配” 切换为 “匹配中… 点击按钮停止匹配!”,再次点击恢复初始状态 | 高 |
对战房间模块 | 1.直接连接对战房间网页无响应;2.双方游戏中一方退出游戏判另一方直接获胜;3.其中一方下棋时另一方不能下棋;4.可自由聊天且不能包含敏感词(“菜鸡”);5.一方五子连珠后,可正常退出房间且游戏场次获胜场次增加正确 | 高 |
3.2 非功能需求
需求类型 | 需求描述 | 优先级 |
---|---|---|
稳定性 | 单会话内连续执行 10 次登录 / 注册操作,无 “无效会话”“元素未找到” 异常 | 中 |
弱网容错 | 弱网下操作超时(如登录等待 10s+)时,需有明确提示(而非直接崩溃) | 低 |
页面兼容性 | 核心元素(输入框、按钮)在 Chrome 141.0.7390.76版本版本中可正常点击 / 输入,在不同浏览器下界面显示要求正常 | 中 |
4. 测试设计
4.1 功能测试:测试用例设计
4.1.1 注册模块功能用例
用例 ID | 用例名称 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 |
---|---|---|---|---|---|---|
REG-001 | 新用户成功注册 | 用户名未被占用 | 1. 进入注册页;2. 输入新用户名(自动生成年/月/日+时间);3. 输入密码(自动生成年/月/日+时间);4. 点击 “注册” | 1. 弹出 “注册用户成功” 弹窗;2. 关闭弹窗后可返回登录页 | 注册成功 | 已执行 |
REG-002 | 重复用户名注册 | 用户名已存在 | 1. 进入注册页;2. 输入 lqf123;3. 输入任意密码;4. 点击 “注册” | 弹出 “用户名已被占用” 弹窗 | 注册失败 | 已执行 |
REG-003 | 空用户名注册 | 无 | 1. 进入注册页;2. 用户名留空;3. 输入密码;4. 点击 “注册” | 弹出 “请输入用户名 / 密码” 弹窗 | 注册失败 | 已执行 |
REG-004 | 注册页面标题验证 | 进入注册页 | 1. 进入注册页;2. 查看页面标题 “网络五子棋对战游戏” 和 “注册” 文本(自动化测试) | 1. 标题 “网络五子棋对战游戏” 存在且正确;2. “注册” 文本存在且正确 | 注册页面界面测试正常 | 已执行 |
4.1.2 登录模块功能用例
用例 ID | 用例名称 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 |
---|---|---|---|---|---|---|
LOG-001 | 正确账号密码登录 | 账号 lqf123 / 密码 123456 有效 | 1. 进入登录页;2. 输入 lqf123 和 123456;3. 点击 “登录”(自动化测试) | 1. 弹出 “登录成功” 弹窗;2. 关闭后弹出 “连接大厅成功” 弹窗;3. 进入大厅 | 登录成功 | 已执行 |
LOG-002 | 正确账号 + 错误密码登录 | 账号 lqf123 有效 | 1. 进入登录页;2. 账号输入 lqf123 和 密码输入456789(错误密码);3. 点击 “登录” | 弹出 “账号或密码错误” 弹窗 | 登录失败 | 已执行 |
LOG-003 | 空密码登录 | 账号 lqf123 有效 | 1. 进入登录页;2. 输入 lqf123;3. 密码留空;4. 点击 “登录” | 弹出 “请输入用户名 / 密码” 弹窗 | 登录失败 | 已执行 |
LOG-004 | 登录后返回登录页 | 登录成功进入大厅 | 1. 登录成功后;2. 点击浏览器 “返回” 按钮 | 返回到登录页,且输入框为空 | 正常返回登录大厅 | 已执行 |
4.1.3 游戏大厅模块功能用例
用例 ID | 用例名称 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 |
---|---|---|---|---|---|---|
HALL-001 | 未登录进入大厅 | 未登录状态 | 1. 直接访问大厅页;2. 查看弹窗 | 弹出警告弹窗,点击确认后返回登录大厅 | 正常弹出弹窗,点击后回到登录界面 | 已执行 |
HALL-002 | 登录后用户信息验证 | 登录账号 lqf123 | 1. 登录成功进入大厅;2. 查看 “用户:lqf123 积分:1040” 和 “比赛场次:10 获胜场次:6” | 文本显示正确,无缺失或错误 | 文本显示正确,无缺失或错误 | 已执行 |
HALL-003 | 匹配按钮功能验证 | 登录进入大厅 | 1. 点击 “开始匹配”;2. 查看按钮文本;3. 再次点击按钮 | 1. 首次点击后文本变为 “匹配中… 点击按钮停止匹配!”;2. 再次点击恢复 “开始匹配” | 与预期相符 | 已执行 |
4.1.4 对战房间模块功能用例
用例 ID | 用例名称 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 |
---|---|---|---|---|---|---|
ROOM-001 | 对战房间显示正常 | 双方匹配成功 | 1.登录两个同分段账号进行匹配;2.匹配进入房间后查看棋盘、聊天界面时候正常显示 | 棋盘、聊天界面时候正常显示 | 棋盘、聊天界面时候正常显示 | 已执行 |
ROOM-002 | 对战时一方退出 | 双方在对战房间中 | 1.登录两个同分段账号进行匹配;2.匹配进入房间后一方直接退出游戏;3.查看另一方是否直接获胜 | 另一方直接获胜且能正常退出到大厅 | 另一方直接获胜且能正常退出到大厅 | 已执行 |
ROOM-003 | 对战判胜验证 | 双方在对战房间中 | 1.登录两个同分段账号进行匹配;2.匹配进入房间后一方五子相连;3.查看游戏是否结束且该方是否胜利 | 五子优先相连一方胜利且能正常退出到大厅 | 五子优先相连一方胜利且能正常退出到大厅 | 已执行 |
ROOM-004 | 聊天功能验证 | 双方在对战房间中 | 1.登录两个同分段账号进行匹配;2.匹配进入房间分别在聊天界面发送消息(“你好”) | 能发送消息且对方能看见 | 能发送消息且对方能看见 | 已执行 |
ROOM-005 | 聊天敏感词验证 | 双方在对战房间中 | 1.登录两个同分段账号进行匹配;2.匹配进入房间分别在聊天界面发送敏感词(“菜鸡”) | 提示敏感词无法发送且对方看不到该消息 | 提示敏感词无法发送且对方看不到该消息 | 已执行 |
4.2 自动化测试:测试用例设计与代码
4.2.1 自动化测试用例
自动化用例 ID | 对应功能用例 ID | 用例名称 | 自动化步骤概述 |
---|---|---|---|
AUTO-REG-001 | REG-001 | 新用户成功注册自动化 | 1. 初始化注册页;2. 生成时间戳用户名和密码;3. 输入并注册;4. 断言弹窗文本;5. 截图留存 |
AUTO-REG-002 | REG-002 | 重复用户名注册 | 1. 初始化注册页;2. 输入已注册用户用户名;3. 输入不同密码并点击注册;4. 断言弹窗文本;5. 截图留存 |
AUTO-REG-003 | REG-003 | 空用户名注册 | 1. 初始化注册页;2. 用户名留空;3. 生成时间戳密码;4. 断言弹窗文本;5. 截图留存 |
AUTO-REG-004 | REG-004 | 注册页面标题验证 | 1. 进入注册页;2.验证页面文字是否与设计相同;3.打印结果 |
AUTO-LOG-001 | LOG-001 | 正确账号登录自动化 | 1. 初始化登录页;2. 输入 lqf123/123456;3. 处理两次弹窗;4. 断言是否进入大厅 |
AUTO-LOG-002 | LOG-002 | 正确账号 + 错误密码登录 | 1. 初始化登录页;2. 输入 lqf123/456789;3. 处理两次弹窗;4. 断言是否进入大厅 |
AUTO-LOG-003 | LOG-003 | 空密码登录 | 1. 初始化登录页;2. 输入 lqf123;3. 处理两次弹窗;4. 断言是否进入大厅 |
AUTO-HALL-002 | HALL-002 | 大厅用户信息验证自动化 | 1. 登录后进入大厅;2. 获取用户信息文本;3. 断言文本与预期一致 |
AUTO-HALL-003 | HALL-003 | 匹配按钮功能自动化 | 1. 登录后进入大厅;2. 点击匹配按钮;3. 断言文本切换;4. 再次点击断言恢复 |
4.2.2 自动化测试代码
4.2.2.1 公共工具类(commen/Utils.py)
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):dirname = datetime.datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)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)gobang_driver = Driver()
4.2.2.2 register.py
import datetime
import timefrom selenium.webdriver.common.by import By
from common.Utils import gobang_driverclass gobang_register:url = ""driver = ""def __init__(self):self.url = "http://106.53.219.176:8085/register.html"self.driver = gobang_driver.driverself.driver.get(self.url)# 网页页面测试def web_page_test(self):# 标题if self.driver.find_element(By.CSS_SELECTOR, "body > div.nav"):print("(注册界面)游戏标题存在")else:print("(注册界面)游戏标题不存在")if self.driver.find_element(By.CSS_SELECTOR, "body > div.nav").text == "网络五子棋对战游戏":print("(注册界面)游戏标题正确")else:print("(注册界面)游戏标题错误")# 注册界面页面测试if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > h3"):print("(注册界面)注册标题存在")else:print("(注册界面)注册标题不存在")if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > h3").text == "注册":print("(注册界面)'注册(txt)'标题正确")else:print("(注册界面)'注册(txt)'标题错误")if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > div:nth-child(2) > span"):print("(注册界面)'用户名(txt)'存在")else:print("(注册界面)'用户名(txt)'不存在")if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > div:nth-child(2) > span").text == "用户名":print("(注册界面)'用户名(txt)'正确")else:print("(注册界面)'用户名(txt)'错误")if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > div:nth-child(3) > span"):print("注册界面)'密码(txt)'存在")else:print("(注册界面)'密码(txt)'不存在")if self.driver.find_element(By.CSS_SELECTOR, "body > div.login-container > div > div:nth-child(3) > span").text == "密码":print("注册界面)'密码(txt)'正确")else:print("(注册界面)'密码(txt)'错误")# 功能测试(能成功注册)def register_suc_test(self):self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()user_name = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")password = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys(user_name)self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertif alert.text == "注册用户成功":print("注册成功")alert.accept()else:print("注册失败")alert.accept()self.driver.back()# 功能测试(不能成功注册)def register_fal_test(self):self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()# 已存在账号self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()# 未输入账号self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()password = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()# 未输入密码self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()user_name = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys(user_name)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()#register = gobang_register()
#register.register_suc_test()
#register.register_fal_test()
#register.web_page_test()
4.2.2.3 login.py
import time
from selenium.webdriver.common.by import Byfrom common.Utils import gobang_driverclass gobang_login:url = ""driver = ""def __init__(self):self.url = "http://106.53.219.176:8085/login.html"self.driver = gobang_driver.driverself.driver.get(self.url)# 成功登录的测试用例def login_suc_test(self):self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)gobang_driver.getScreeShot()self.driver.back()time.sleep(3)self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf456")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)gobang_driver.getScreeShot()self.driver.back()print("登陆成功测试完毕")# 登录失败测试用例def login_fal_test(self):# 正确账号+错误密码 1self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("456789")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(正确账号+错误密码 1)完毕")# 正确账号+错误密码 2self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf456")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(正确账号+错误密码 2)完毕")# 错误账号+正确密码 1self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf321")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(错误账号+正确密码 1)完毕")# 错误账号+正确密码 2self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(错误账号+正确密码 2)完毕")# 错误账号+错误密码 1self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(错误账号+错误密码 1)完毕")# 错误账号+错误密码 2self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("lqf456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(错误账号+错误密码 2)完毕")# 未输入账号self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(未输入账号)完毕")# 未输入密码self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(未输入密码)完毕")# 未输入账号和密码self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)print("登陆失败测试(未输入账号和密码)完毕")def exist_title(self):if self.driver.find_element(By.CSS_SELECTOR, "body > div.nav"):print("标题存在")else:print("标题不存在")txt = self.driver.find_element(By.CSS_SELECTOR, "body > div.nav").textif txt == "网络五子棋对战游戏":print("标题正确")else:print("标题错误")#login = gobang_login()
#login.exist_title()
#login.login_suc_test()
#login.login_fal_test()
4.2.2.4 game_hall.py
import time
from selenium.webdriver.common.by import Byfrom common.Utils import gobang_driverclass gobang_game_hall:url = ""driver = ""def __init__(self):self.url = "http://106.53.219.176:8085/game_hall.html"self.driver = gobang_driver.driverself.driver.get(self.url)# 直接进入(未登录状态)def none_login(self):# 警告弹窗time.sleep(3)alert = self.driver.switch_to.alertif alert:print(alert.text)alert.accept()else:print("未出现弹窗,请检查问题")# 登录后进入def has_login(self):self.none_login()self.driver.find_element(By.CSS_SELECTOR, "#user_name").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#user_name").send_keys("lqf123")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)alert = self.driver.switch_to.alertalert.accept()time.sleep(3)# 页面测试# 获取整个p元素的文本p_text = self.driver.find_element(By.XPATH, '//*[@id="screen"]/p').text# 按换行分割文本(假设两行文本用换行分隔)lines = p_text.split('\n')# 检查第一行文本if len(lines) >= 1 and lines[0] == "用户:lqf123 积分:1040":print("(game_hall)用户 积分txt正确")else:print("(game_hall)用户 积分txt错误")# 检查第二行文本if len(lines) >= 2 and lines[1] == "比赛场次:10 获胜场次:6":print("(game_hall)比赛场次 获胜场次txt正确")else:print("(game_hall)比赛场次 获胜场次txt错误")if self.driver.find_element(By.CSS_SELECTOR, "#match-button"):print("(game_hall)匹配按钮存在")else:print("(game_hall)匹配按钮不存在")if self.driver.find_element(By.CSS_SELECTOR, "#match-button").text == "开始匹配":print("(game_hall)匹配按钮文字正确")else:print("(game_hall)匹配按钮文字错误")time.sleep(3)self.driver.find_element(By.CSS_SELECTOR, "#match-button").click()time.sleep(3)if self.driver.find_element(By.CSS_SELECTOR, "#match-button").text == "匹配中....点击按钮停止匹配!":print("(game_hall)匹配中按钮文字正确")else:print("(game_hall)匹配中按钮文字错误")time.sleep(3)self.driver.find_element(By.CSS_SELECTOR, "#match-button").click()#game_hall = gobang_game_hall()
#game_hall.none_login()
#game_hall.has_login()
#gobang_driver.driver.close()
4.2.2.5 执行代码
from gobang import register
from gobang import login
from gobang import game_hall
from common.Utils import gobang_driverif __name__ == "__main__":register.gobang_register().register_fal_test()register.gobang_register().register_suc_test()register.gobang_register().web_page_test()login.gobang_login().exist_title()login.gobang_login().login_suc_test()login.gobang_login().login_fal_test()#game_hall.gobang_game_hall().none_login()game_hall.gobang_game_hall().has_login()gobang_driver.driver.quit()
5.自动化测试核心介绍
5.1、核心架构
三段脚本(login.py
/register.py
/game_hall.py
)采用统一模式:类初始化(驱动+URL+页面跳转)→ 业务场景测试(成功/失败)→ 结果输出(日志+截图)
5.2、各模块核心点
5.2.1 登录模块(login.py
)
- 场景全覆盖:成功场景(2 个有效账号登录 + 双重弹窗处理 + 截图);失败场景(9 种,含错误凭证、空值提交);
- 状态重置:每次输入前用
clear()
清空输入框,避免残留文本干扰; - UI 验证:检查标题元素(
body > div.nav
)存在性与文本正确性。
5.2.2 注册模块(register.py
)
- 动态数据:用时间戳生成唯一用户名 / 密码,解决重复注册问题;
- 元素校验:按层级验证标题、“用户名 / 密码” 文本提示等 UI 完整性;
- 结果断言:通过弹窗文本(“注册用户成功”)判断注册结果,而非仅关闭弹窗。
5.2.3 游戏大厅模块(game_hall.py
)
- 双态验证:未登录(处理警告弹窗)、登录后(串联登录流程)场景;
- 信息精准校验:拆分用户信息文本(积分 / 比赛场次),按行匹配;
- 交互验证:完整测试匹配按钮状态切换(开始→匹配中→停止)。
三、通用核心技术
- 元素定位:以 CSS 选择器为主(高效稳定),复杂元素用 XPath;
- 弹窗处理:适配多弹窗场景(如登录双重弹窗),
time.sleep()
等待 +accept()
关闭; - 依赖复用:统一调用
gobang_driver
驱动,支持跨模块流程串联。
6.bug管理
6.1 空值注册bug
6.1.1 bug描述
在用户注册时,用户名为空时输入密码注册成功(正常应注册失败)
6.1.2 触发bug步骤
1.打开Edge浏览器(版本 141.0.3537.71 (正式版本) (64 位));
2.输入注册页面网址(http://106.53.219.176:8085/register.html)并进入;
3.用户名为空,输入密码123456,点击注册;
4.显示注册成功
6.1.3 解决方法
排查后端代码判断用户名为空操作是否仅判断了用户名为空而没有判断是否为空字符串,前端同步增加非空校验
7.总结
本次测试围绕网络五子棋对战游戏的注册、登录、游戏大厅、对战房间四大核心模块展开,覆盖功能验证、非功能验证及自动化执行,全面评估游戏核心业务流程的正确性与稳定性,现将测试结果总结如下:
7.1 测试覆盖范围与用例执行情况
7.1.1 功能模块覆盖
本次测试完整覆盖游戏核心业务模块,具体包括:
注册模块:新用户注册、重复用户名拦截、空值提交校验、页面 UI 元素验证;
登录模块:正确凭证登录、错误凭证拦截(错误账号 / 密码)、空值提交校验、登录后状态重置;
游戏大厅模块:未登录访问拦截、登录后用户信息(积分 / 场次)展示、匹配按钮交互;
对战房间模块:房间界面(棋盘 / 聊天区)展示、对战规则(轮流下棋 / 退出判负 / 五子连珠判胜)、聊天敏感词过滤。
7.1.2 测试用例执行统计
本次测试共设计 16 条功能测试用例,涵盖成功场景与失败场景,全部执行完毕,具体分布如下:
模块 | 用例数量 | 执行状态 | 成功用例数 | 失败用例数(关联 Bug) |
---|---|---|---|---|
注册模块 | 4 | 全部执行 | 3 | 1 |
登录模块 | 4 | 全部执行 | 4 | 0 |
游戏大厅模块 | 3 | 全部执行 | 3 | 0 |
对战房间模块 | 5 | 全部执行 | 5 | 0 |
合计 | 16 | 全部执行 | 15 | 1 |
7.2 Bug 统计与处理情况
本次测试共发现 1 个功能类 Bug,无非功能类(稳定性 / 弱网 / 兼容性)Bug,具体信息如下:
Bug ID | Bug 类型 | 涉及模块 | 严重程度 | 描述 | 处理建议 |
---|---|---|---|---|---|
BUG-001 | 功能缺陷 | 注册模块 | 一般 | 用户名为空、仅输入密码时,点击 “注册” 可成功注册,未触发空用户名拦截校验 | 排查后端注册接口逻辑,补充 “用户名不可为空字符串” 的判断,前端同步增加非空校验 |
7.3 测试结论
- 功能正确性:游戏核心模块(登录、游戏大厅、对战房间)功能正常,15 条用例执行通过,占比 93.75%;仅注册模块存在 “空用户名注册” 的功能漏洞,修复后可保障注册流程的合法性;
- 自动化有效性:自动化脚本(
login.py
/register.py
/game_hall.py
)可稳定覆盖注册、登录、大厅的核心场景,支持自动生成测试数据(时间戳用户名)、留存截图日志,可替代人工重复执行,提升测试效率; - 非功能达标性:在 Chrome 141.0.7390.76、Edge 141.0.3537.71 等浏览器下页面显示正常,连续 10 次登录 / 注册无崩溃,弱网(延迟 500ms+)下弹窗响应与信息加载正常,满足非功能需求。