文章目录
论坛系统测试报告
一、项目简介
本项目是一个论坛系统,采用前后端分离的方式实现,该系统旨在为用户提供一个基于 Web 的文章发布和讨论平台。
用户可以进行注册登录、查看和修改个人信息,进行帖子的增删改查等基础操作。
用户可以点赞、评论帖子,私信其他用户,并在帖子详情页上查看点赞数和阅读量等信息。
二、测试计划
目的:确保论坛系统功能符合设计需求,发现并修复系统中的bug
测试范围:包括功能测试,界面测试、兼容性测试、易用性测试、安全测试
- 测试范围
- 功能测试:覆盖用户注册、用户登录、帖子发布、帖子编辑、论坛主页、帖子详情、评论与私信自动化测试:关键业务流程,如登录、帖子浏览、评论与私信、发布帖子等功能
- 自动化测试:覆盖注册页、登录页、论坛首页、帖子详情页、帖子发布和编辑、私信与评论等页面
- 测试环境
- Windows11
- Chrome版本 134.0.6998.89(正式版本) (64 位)、Edge版本 131.0.2903.112 (正式版本) (64 位)、Firefox版本 131.0.2903.112 (正式版本) (64 位)
- 测试工具
- 功能测试:手动测试
- 自动化测试:PyCharm+Selenium+Python
- 测试任务:
- 编写用户注册、登录、帖子浏览、帖子发布与编辑、点赞评论与私信等模块的测试用例,保证主体功能完整
- 执行测试用例
- 记录出现的bug以及设计缺陷
- 进行回归测试
三、测试用例设计
四、功能测试
1.登录功能
场景一:输入正确用户名和密码点击登录
预期结果:提示登陆成功,跳转到论坛首页
实际结果:登陆成功,跳转到主页
场景二:输入错误用户名或密码点击登录
预期结果:提示用户名或密码错误
实际结果:提示用户名或密码错误
场景三:只输入密码不输入用户名点击登录
预期结果:提示请输入用户名
实际结果:提示用户名不能为空
场景四:只输入用户名不输入密码点击登录
预期结果:提示请输入密码
实际结果:提示密码不能为空
2.注册功能
场景一:输入用户名,昵称,密码,点击同意条款进行注册
预期结果:提示注册成功,跳转页面
实际结果:跳转到首页
缺陷:未提示 注册成功
场景二:输入已存在用户名,输入昵称、密码、点击同意条款进行注册
预期结果:提示用户已存在,注册失败
实际结果:提示用户已存在
场景三:不输入用户名,输入昵称、密码、同意条款进行注册
预期结果:提示用户名不能为空
实际结果:提示用户名不能为空
场景四:输入用户名、昵称、密码,不点击同意条款进行注册
预期结果:勾选条款变红色,提示用户勾选
实际结果:同意条款按钮变红色,提示用户勾选
3.论坛首页功能
场景一:点击C++板块帖子
预期结果:跳转到C++板块,可看到C++板块的帖子数量
实际结果:跳转到C++板块,可看到C++板块的帖子数量
Bug:部分板块没有标题
场景二:点击发帖按钮
预期结果:跳转到发帖页面
实际结果:跳转到发帖页面
场景三:点击任意一个帖子
预期结果:进入帖子详情页面
实际结果:进入帖子详情页面
场景四:点击搜索,输入:自动化测试
预期结果:提示搜索结果,并显示相关帖子
实际结果:点击搜索按钮无反应,回车可以进行搜索页面刷新,但是帖子列表仍不变,没有显示搜索结果
BUG:搜索功能无效
场景五:点击主页切换主题按钮
预期结果:主题发生切换
实际结果:图标由月亮变成太阳,主题切换成功。
场景六:点击个人信息,点击我的帖子
预期结果:跳转到我发布的帖子
实际结果:跳转到我的帖子页面
场景七:点击个人信息,点击个人中心
预期结果:跳转到个人中心
实际结果:跳转到个人中心
场景八:点击个人信息,点击退出
预期结果:回到登录页面
实际结果:回到登录页面
4.帖子详情页功能
场景一:给帖子点赞
预期结果:提示点赞成功,帖子点赞数量+1
实际结果:可以弹出点赞成功提示,点赞数量增加,但是一个用户可以无限点赞。
BUG:可以无限点赞,存在刷赞bug
场景二:对帖子进行回复
预期结果:提示回复成功,回复显示在评论区,并且帖子评论数量+1
实际结果:提示回复成功,评论数量增加,但是评论时间并不准确
Bug:评论时间不准确
场景三:点击私信按钮,发送你好,点击发送
预期结果:提示发送成功
实际结果:提示发送成功
场景四:点击评论用户昵称
预期结果:跳转到评论者主页
实际结果:跳转到评论者主页,显示其所发的帖子以及基本信息
场景五:点击已评论用户的私信按钮,输入你好,点击发送
预期结果:发送成功
实际结果:发送成功
5.发帖功能
场景一:选择板块,输入标题、内容,点击发布按钮进行发布
预期结果:提示发布成功,跳转到论坛首页,可以看到刚发布的帖子
实际结果:
场景二:不输入标题,输入内容点击发布
预期结果:提示请输入帖子标题
实际结果:弹窗提示请输入标题,并且标题框高亮,显示最近所发的标题
6.我的帖子页面功能
场景一:点击已发布帖子
预期结果:进入已发布帖子详情页
实际结果:正确进入已发布帖子详情页
缺陷:没有返回上一页功能,只能重新点击我的个人主页返回
场景二:点击已发布帖子,点击编辑,更改内容,点击发布按钮
预期结果:提示发布成功,跳转到我的帖子主页
实际结果:自己发布的帖子没有编辑按钮!
Bug:无法编辑自己发布的帖子
场景三:点击已发布帖子,点击删除
预期结果:提示删除成功,跳转到帖子列表
实际结果:自己发布的帖子没有删除按钮!
Bug:无法删除自己发布的帖子
7.回复私信功能
场景一:点击私信,点击收到的私信,编辑并回复评论
预期结果:系统提示发送成功
实际结果:未读标记红点变为绿色,提示操作成功,私信消息显示:已回复。符合预期结果。
场景二:不输入内容,点击发送
预期结果:提示请输入发送内容
实际结果:自动关闭回复框,提示请输入要回复的内容,未读红点没有消失。
8.个人中心页面功能
场景一:点击修改头像,本地选择图片,点击确定
预期结果:提示修改成功,头像更改
实际结果:没反应
Bug:无法修改头像
场景二:输入修改昵称,点击修改
预期结果:提示修改成功,昵称更改
实际结果:弹窗提示修改成功,主页昵称发生改变。
场景三:修改密码,正确输入原密码、新密码、确认密码,点击提交修改
预期结果:提示修改成功,提示登录信息已过期,跳转到登录页面要求重新登录
实际结果:没有提示修改成功和登录信息已过期,直接跳转到登录页面
缺陷:没有提示登录信息已过期,用户体验不好
场景四:输入错误的原密码,输入新密码进行修改
预期结果:提示原密码错误
实际结果:弹窗提示参数校验失败,并不是提示 原密码错误
缺陷:提示词缺陷,影响用户体验
场景五:正确输入原密码,新密码还是原来的旧密码
预期结果:提示新密码不能与旧密码相同
实际结果:跳转到登录页面要求重新登陆
Bug:新旧密码相同也可以修改
Bug:点击显示密码明文,没反应,无法确定自己输入的密码是什么
五、兼容性测试
测试场景:分别在Chrome、Firefox、Edge下登录论坛,分别进行浏览帖子等流程。
Firefox:
Edge:
预期结果:两个浏览器下界面显示并无异处
实际结果:两个浏览器下进行论坛系统并没有什么不同
六、自动化测试
测试核心功能
1.封装常用的方法
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import datetime
import os
import sys
from selenium.webdriver.support import expected_conditions as EC
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
options.add_argument('--start-maximized') # 浏览器最大化
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
self.driver.implicitly_wait(2)
# 创建屏幕截图(利用selenium提供的截屏方法)
def getScreenShot(self):
# 目录: ../images/2025/3/20/ 自动创建当天日期的文件夹,方便查找
# 文件名: 调用方法名-2025-03-19-120530.png (年-月-日-时分秒)
dirname = datetime.datetime.now().strftime("%y-%m-%d") # 2025-03-20
# 判断是否已经存在文件夹,不存在即创建文件夹
if not os.path.exists("../images/" + dirname):
os.mkdir("../images/" + dirname)
# 得到调用当前函数的函数名,即上一层栈帧
filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%H_%M_%S") + ".png"
# ../images/2025-03-20/ForumLogin-12_20_06
self.driver.save_screenshot("../images/" + dirname +"/" + filename)
ForumDriver=Driver()
2.登录功能测试
import time
from selenium.webdriver.common.by import By
from common.Ulitys import ForumDriver
class ForumLogin:
driver=""
url=""
def __init__(self):
self.driver=ForumDriver.driver
self.url="http://127.0.0.1:9580/sign-in.html"
self.driver.get(self.url)
def LoginSuccTest(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("kongyan")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
# 等待两秒加载,查看主页元素是否存在
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR,"#article_list_board_title")
# 截图保存
ForumDriver.getScreenShot()
def LoginFailTest(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("dasdasd")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
# 点击之后,弹出错误提示
alertText = self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div:nth-child(1) > h2").text
ForumDriver.getScreenShot() # 截图
assert alertText=="警告"
# 输入正确的用户名、错误的密码
# 清理输入框
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("kongyan")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("wrongpass")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
# 点击之后,弹出错误提示
alertText = self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div:nth-child(1) > h2").text
ForumDriver.getScreenShot() # 截图
assert alertText=="警告"
# 不输入用户名 只输入密码
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,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
# 提示:用户名不能为空
text=self.driver.find_element(By.CSS_SELECTOR,"#signInForm > div.mb-3 > div").text
ForumDriver.getScreenShot() # 截图
assert text=="用户名不能为空"
# 不输入密码 只输入用户名
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("kongyan")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
ForumDriver.getScreenShot() # 截图
# 提示:密码不能为空
text=self.driver.find_element(By.CSS_SELECTOR,"#signInForm > div.mb-2 > div > div").text
ForumDriver.getScreenShot() # 截图
assert text=="密码不能为空"
# ForumLogin().LoginFailTest()
# ForumLogin().LoginSuccTest()
3.注册功能测试
from common.Ulitys import ForumDriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class ForumRegister:
driver=""
url=""
def __init__(self):
self.driver = ForumDriver.driver
self.url = "http://127.0.0.1:9580/sign-up.html"
self.driver.get(self.url)
def RegisterSuccTest(self):
# 清理输入框和 取消勾选协议
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
time.sleep(1)
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
# 输入用户名、昵称、密码、确认密码,且密码与确认密码一致,勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testkySuc1123")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testkySuc1123")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
# 勾选同意协议
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
# 点击注册
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
# 跳转到登录页面
time.sleep(2)
text=self.driver.find_element(By.CSS_SELECTOR,"body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2").text
assert text=="用户登录"
def RegisterFailTest(self):
# 清理输入框和 取消勾选协议
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
# 1.不输入用户名, 输入昵称、密码、确认密码,勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(2) > div").text
assert text=="用户名不能为空"
# 2.不输入昵称, 输入用户名、密码、确认密码,勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(3) > div").text
assert text=="昵称不能为空"
# 3.不输入密码, 输入用户名、昵称、确认密码,勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(4) > div > div").text
assert text=="密码不能为空"
# 4.不输入确认密码, 输入用户名、昵称、密码,勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(5) > div > div").text
assert text=="请检查确认密码"
# 5.输入用户名、昵称、密码、确认密码,确认密码与密码不一致
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(5) > div > div").text
assert text=="请检查确认密码"
# 6.输入用户名、昵称、密码、确认密码,不勾选协议,点击注册
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图
## 检查协议是否勾选
checkbox = self.driver.find_element(By.CSS_SELECTOR,"#policy")
assert checkbox.is_selected() == False
time.sleep(1)
# 7. 用户名已存在
self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()
checkbox=self.driver.find_element(By.CSS_SELECTOR,"#policy")
if checkbox.is_selected(): # 检查复选框是否被选中
checkbox.click() # 取消勾选
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys("testky")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys("1234")
# print("复选框状态:", checkbox.is_selected()) # 打印当前状态
self.driver.find_element(By.CSS_SELECTOR,"#policy").click()
# print("复选框状态:", checkbox.is_selected()) # 打印当前状态
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
# 显示等待
WebDriverWait(self.driver,10).until(
EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2"))
)
ForumDriver.getScreenShot() # 截图
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text=="警告"
4.论坛主页功能测试
from common.Ulitys import ForumDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from tests import ForumLogin
class ForumHome:
driver=""
url=""
def __init__(self):
self.driver=ForumDriver.driver
# self.url="http://127.0.0.1:9580/index.html"
# self.driver.get(self.url)
def HomeTest(self):
# 检查首页元素
self.driver.find_element(By.CSS_SELECTOR,"#article_list_board_title")
self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a > span.nav-link-title")
self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a")
self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(2) > a")
self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(3) > a")
# 检查第一个帖子是否存在,因为是动态加载,所以显示等待
WebDriverWait(self.driver,5).until(
EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1)"))
)
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1)")
# 测试导航栏跳转 -> 跳到C++
# 记录首页按钮
home_index=self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a")
# 点击C++模块,topBoardList > li:nth-child(3) > a
self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(3) > a").click()
# 检查page_title是否为C++
time.sleep(1) # 等待页面加载
text=self.driver.find_element(By.CSS_SELECTOR,"#article_list_board_title").text
assert text=="C++"
# 返回首页
home_index.click()
time.sleep(2)
# 测试发布帖子按钮
self.driver.find_element(By.CSS_SELECTOR,"#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post").click()
# 检查是否跳转到发布帖子页面
WebDriverWait(self.driver,5).until(
EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"#bit-forum-content > div.page-header.d-print-none > div > div > div > h2"))
)
text=self.driver.find_element(By.CSS_SELECTOR,"#bit-forum-content > div.page-header.d-print-none > div > div > div > h2").text
print(text)
assert text=="发新贴"
home_index.click()
# 点击帖子 - 显示等待
WebDriverWait(self.driver,5).until(
EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a"))
)
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a").click()
# 检查是否跳转到帖子详情页面
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR,"#details_article_content_title")
# 返回首页
home_index.click()
5.帖子详情页功能测试
from common.Ulitys import ForumDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
class PostDetails:
driver=""
url=""
def __init__(self):
self.driver=ForumDriver.driver
# self.url="http://127.0.0.1:9580/index.html"
# self.driver.get(self.url)
def PostDetailsUITest(self):
# 点击C++板块帖子
self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(3) > a").click()
# 等待帖子加载,点击
WebDriverWait(self.driver,5).until(
EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a"))
)
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a").click()
# 进入帖子详情页面
time.sleep(2)
# 检查元素
self.driver.find_element(By.CSS_SELECTOR,"#details_article_content_title") # 标题
self.driver.find_element(By.CSS_SELECTOR,"#details_article_createTime") # 发布时间
self.driver.find_element(By.CSS_SELECTOR,"#details_article_content") # 内容
self.driver.find_element(By.CSS_SELECTOR,"#article_details_author_name") # 作者
self.driver.find_element(By.CSS_SELECTOR,"#details_btn_like_count") # 点赞按钮
self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply") # 回复按钮
self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre") # 回复框
ForumDriver.getScreenShot() # 截图
def PostDetailsFuncTest(self):
# 点赞
self.driver.find_element(By.CSS_SELECTOR,"#details_btn_like_count").click()
time.sleep(1)
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text=="成功"
ForumDriver.getScreenShot()
self.driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
# 不编辑内容点击回复
btn=self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply")
btn.click()
time.sleep(1)
ForumDriver.getScreenShot() ## 截图验证, 获取不到“请输入回复内容”文本提示
# 评论发布
self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.editormd-toolbar > div > ul > li:nth-child(6) > a").click()
# 点击发布
time.sleep(1)
btn.click()
time.sleep(1)
ForumDriver.getScreenShot() # 截图验证,获取不到“回复成功”文本提示
# 回到顶部
self.driver.execute_script("var q=document.documentElement.scrollTop=0")
time.sleep(1)
6.私信功能测试
from common.Ulitys import ForumDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
class ForumDM:
driver=""
url=""
def __init__(self):
self.driver=ForumDriver.driver
# 帖子详情页私信
def PostDetailsDM(self):
self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a").click()
time.sleep(1)
# 找到第一个帖子
self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a").click()
time.sleep(1)
# 给作者私信
#btn_details_send_message
self.driver.find_element(By.CSS_SELECTOR,"#btn_details_send_message").click()
time.sleep(1)
# 输入私信内容
#index_message_receive_content
self.driver.find_element(By.CSS_SELECTOR,"#index_message_receive_content").send_keys("你好,我是测试用户")
time.sleep(1)
# 发送私信
#btn_index_send_message
self.driver.find_element(By.CSS_SELECTOR,"#btn_index_send_message").click()
time.sleep(1)
# 检查是否发送成功
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text=="成功"
ForumDriver.getScreenShot()
# 回复私信
def ReplyDM(self):
# 回到主页
self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a").click()
# 点击私信按钮
WebDriverWait(self.driver,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a")))
self.driver.find_element(By.CSS_SELECTOR,"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a").click()
time.sleep(1)
# 点击第一个未读私信
self.driver.find_element(By.CSS_SELECTOR,"#index_div_message_list > div:nth-child(1) > div > div.col.text-truncate > a").click()
time.sleep(1)
# 点击回复按钮 #btn_index_message_reply
self.driver.find_element(By.CSS_SELECTOR,"#btn_index_message_reply").click()
time.sleep(1)
# 编辑回复内容 #index_message_reply_receive_content
self.driver.find_element(By.CSS_SELECTOR,"#index_message_reply_receive_content").send_keys("生活愉快哦")
time.sleep(1)
# 点击发送 #btn_index_send_message_reply
self.driver.find_element(By.CSS_SELECTOR,"#btn_index_send_message_reply").click()
time.sleep(1)
# 提示发送成功 /html/body/div[4]/div/text()
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text=="成功"
ForumDriver.getScreenShot()
# 关闭私信页面
self.driver.find_element(By.CSS_SELECTOR,"#index_message_offcanvasEnd > div.offcanvas-header > button").click()
time.sleep(1)
7.发布帖子功能测试
from common.Ulitys import ForumDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
class ForumPost:
def __init__(self):
self.driver = ForumDriver.driver
def Post(self):
# 回到主页
self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a").click()
time.sleep(1)
# 点击发布帖子
self.driver.find_element(By.CSS_SELECTOR,"#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post").click()
time.sleep(1)
# 标题
self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys("自动化测试帖子")
# 内容
self.driver.find_element(By.CSS_SELECTOR,"#edit-article > div.editormd-toolbar > div > ul > li:nth-child(6) > a").click()
# 点击发布
self.driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR,"#article_post_submit").click()
# 检查是否发布成功
time.sleep(1)
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text=="成功"
ForumDriver.getScreenShot()
8.启动文件(核心功能流测试)
from ForumLogin import ForumLogin
from ForumRegister import ForumRegister
from common.Ulitys import ForumDriver
from ForumHome import ForumHome
from PostDetails import PostDetails
from ForumDM import ForumDM
from ForumPost import ForumPost
if __name__ == '__main__':
# 注册
ForumRegister().RegisterFailTest()
# ForumRegister().RegisterSuccTest()
# 登录
ForumLogin().LoginFailTest()
ForumLogin().LoginSuccTest()
# 主页
ForumHome().HomeTest()
# 帖子详情UI测试
PostDetails().PostDetailsUITest()
# 帖子详情功能测试
PostDetails().PostDetailsFuncTest()
# 私信
ForumDM().PostDetailsDM()
ForumDM().ReplyDM()
# 帖子发布
ForumPost().Post()
ForumDriver.driver.quit()
七、项目Bug简述
序号 | 功能模块 | Bug 描述 | 影响范围 | 优先级 |
---|---|---|---|---|
1 | 注册 | 注册成功后未提示“注册成功” | 用户体验 | 低 |
2 | 论坛首页 | 部分板块没有标题 | 页面显示 | 中 |
3 | 论坛首页 | 搜索功能无效,点击搜索无反应,回车刷新但列表未变 | 搜索功能 | 高 |
4 | 帖子详情页 | 用户可以无限点赞,存在刷赞风险 | 互动公平性 | 高 |
5 | 帖子详情页 | 评论时间不准确 | 时间显示 | 低 |
6 | 我的帖子 | 无法编辑自己发布的帖子 | 贴子管理 | 高 |
7 | 我的帖子 | 无法删除自己发布的帖子 | 贴子管理 | 高 |
8 | 我的帖子 | 进入帖子详情后无返回上一页功能 | 用户体验 | 中 |
9 | 回复私信 | 不输入内容点击发送,提示但未读红点未消失 | 交互逻辑 | 低 |
八、测试结论
测试范围:本次测试覆盖了论坛系统的 注册、首页、帖子管理、互动功能、私信系统 等核心模块,共发现 9 个 Bug,问题涉及功能实现、用户体验、交互逻辑等方面。
测试结果总结
1. 功能性问题
- 搜索功能无效(高优先级):搜索框点击搜索按钮无反应,即便按回车刷新,搜索结果仍未更新,严重影响用户查找内容的效率。
- 帖子管理异常(高优先级):用户 无法编辑或删除 自己发布的帖子,导致无法进行内容修改或撤销,对用户管理体验产生较大影响。
- 点赞系统漏洞(高优先级):用户可以无限点赞帖子,容易被恶意刷赞,影响论坛的公平性和真实性。
2. 界面及用户体验问题
- 无“注册成功”提示(低优先级):注册成功后,用户未收到任何成功提示,容易造成用户疑惑,影响使用体验。
- 部分板块无标题(中优先级):首页部分板块缺少标题,影响用户对内容的辨识度,不利于导航和信息获取。
- 帖子详情页无返回上一页功能(中优先级):用户进入帖子后无法直接返回上一页,导致操作不便,需要额外手动返回首页。
- 评论时间不准确(低优先级):评论时间显示错误,可能会导致用户对评论顺序产生误解。
3. 交互逻辑问题
- 私信系统未读红点异常(低优先级):在私信回复框内不输入内容直接点击发送,虽然系统有提示无法发送,但未读消息的红点仍未消失,影响交互体验。
测试结论
- 核心功能存在缺陷,影响正常使用
- 搜索功能、帖子管理、点赞逻辑 需要尽快修复,否则影响用户的基本操作和公平性。
- 用户体验仍有优化空间
- 缺少 “注册成功”提示、帖子详情页返回上一页功能、私信红点交互异常 等问题虽然不会影响基本使用,但降低了用户的体验流畅度,建议优化。
- UI 细节优化
- 论坛首页部分板块无标题、评论时间不准确,影响视觉体验,建议调整。
最终结论:论坛系统基本功能可用,但仍有关键功能缺陷,尤其是 搜索、帖子管理、点赞机制 需要优先修复,以提升用户体验和系统稳定性。