论坛系统测试报告(含自动化测试)

论坛系统测试报告

一、项目简介

本项目是一个论坛系统,采用前后端分离的方式实现,该系统旨在为用户提供一个基于 Web 的文章发布和讨论平台。

用户可以进行注册登录、查看和修改个人信息,进行帖子的增删改查等基础操作。

用户可以点赞、评论帖子,私信其他用户,并在帖子详情页上查看点赞数和阅读量等信息。

二、测试计划

目的:确保论坛系统功能符合设计需求,发现并修复系统中的bug

测试范围:包括功能测试,界面测试、兼容性测试、易用性测试、安全测试

  1. 测试范围
  • 功能测试:覆盖用户注册、用户登录、帖子发布、帖子编辑、论坛主页、帖子详情、评论与私信自动化测试:关键业务流程,如登录、帖子浏览、评论与私信、发布帖子等功能
  • 自动化测试:覆盖注册页、登录页、论坛首页、帖子详情页、帖子发布和编辑、私信与评论等页面
  1. 测试环境
  • Windows11
  • Chrome版本 134.0.6998.89(正式版本) (64 位)、Edge版本 131.0.2903.112 (正式版本) (64 位)、Firefox版本 131.0.2903.112 (正式版本) (64 位)
  1. 测试工具
    • 功能测试:手动测试
    • 自动化测试:PyCharm+Selenium+Python
  2. 测试任务:
    • 编写用户注册、登录、帖子浏览、帖子发布与编辑、点赞评论与私信等模块的测试用例,保证主体功能完整
    • 执行测试用例
    • 记录出现的bug以及设计缺陷
    • 进行回归测试

三、测试用例设计

论坛系统测试用例

四、功能测试

1.登录功能

场景一:输入正确用户名和密码点击登录

预期结果:提示登陆成功,跳转到论坛首页

image-20250327122916295

image-20250327122935070

实际结果:登陆成功,跳转到主页

场景二:输入错误用户名或密码点击登录

预期结果:提示用户名或密码错误

image-20250327123026838

image-20250327123051372

实际结果:提示用户名或密码错误

场景三:只输入密码不输入用户名点击登录

预期结果:提示请输入用户名

实际结果:提示用户名不能为空

场景四:只输入用户名不输入密码点击登录

预期结果:提示请输入密码

image-20250327123130504

实际结果:提示密码不能为空

2.注册功能

场景一:输入用户名,昵称,密码,点击同意条款进行注册
预期结果:提示注册成功,跳转页面

image-20250327123342074

image-20250327123352456

实际结果:跳转到首页

缺陷:未提示 注册成功

场景二:输入已存在用户名,输入昵称、密码、点击同意条款进行注册

预期结果:提示用户已存在,注册失败

image-20250327123500965

image-20250327123523749

实际结果:提示用户已存在

场景三:不输入用户名,输入昵称、密码、同意条款进行注册

预期结果:提示用户名不能为空

image-20250327123556115

实际结果:提示用户名不能为空

场景四:输入用户名、昵称、密码,不点击同意条款进行注册

预期结果:勾选条款变红色,提示用户勾选

image-20250327123635187

实际结果:同意条款按钮变红色,提示用户勾选

3.论坛首页功能

场景一:点击C++板块帖子

预期结果:跳转到C++板块,可看到C++板块的帖子数量

image-20250327123752451

image-20250327123810524

实际结果:跳转到C++板块,可看到C++板块的帖子数量

Bug:部分板块没有标题

场景二:点击发帖按钮

预期结果:跳转到发帖页面

image-20250327123907742

实际结果:跳转到发帖页面

场景三:点击任意一个帖子

预期结果:进入帖子详情页面

image-20250327124232226

image-20250327124242102

实际结果:进入帖子详情页面

场景四:点击搜索,输入:自动化测试

预期结果:提示搜索结果,并显示相关帖子

image-20250327124420748

image-20250327124503512

实际结果:点击搜索按钮无反应,回车可以进行搜索页面刷新,但是帖子列表仍不变,没有显示搜索结果

BUG:搜索功能无效

场景五:点击主页切换主题按钮

预期结果:主题发生切换

image-20250327124546106

image-20250327124603561

实际结果:图标由月亮变成太阳,主题切换成功。

场景六:点击个人信息,点击我的帖子

预期结果:跳转到我发布的帖子

image-20250327124637142

实际结果:跳转到我的帖子页面

场景七:点击个人信息,点击个人中心

预期结果:跳转到个人中心

image-20250327125104694

image-20250327125114897

实际结果:跳转到个人中心

场景八:点击个人信息,点击退出

预期结果:回到登录页面

image-20250327125132943

image-20250327125142545

实际结果:回到登录页面

4.帖子详情页功能

场景一:给帖子点赞

预期结果:提示点赞成功,帖子点赞数量+1

image-20250327130447368

image-20250327130505168

实际结果:可以弹出点赞成功提示,点赞数量增加,但是一个用户可以无限点赞。

BUG:可以无限点赞,存在刷赞bug

场景二:对帖子进行回复

预期结果:提示回复成功,回复显示在评论区,并且帖子评论数量+1

image-20250327130640862

image-20250327130738014

image-20250327130805206

实际结果:提示回复成功,评论数量增加,但是评论时间并不准确

Bug:评论时间不准确

场景三:点击私信按钮,发送你好,点击发送

预期结果:提示发送成功

image-20250327131322247

image-20250327131337254

image-20250327131345050

实际结果:提示发送成功

场景四:点击评论用户昵称

预期结果:跳转到评论者主页

image-20250327131400543

image-20250327131408898

实际结果:跳转到评论者主页,显示其所发的帖子以及基本信息

场景五:点击已评论用户的私信按钮,输入你好,点击发送

预期结果:发送成功

image-20250327131054446

image-20250327131112877

image-20250327131120973

实际结果:发送成功

5.发帖功能

场景一:选择板块,输入标题、内容,点击发布按钮进行发布

预期结果:提示发布成功,跳转到论坛首页,可以看到刚发布的帖子

image-20250327131517901

image-20250327131529714

image-20250327131536117

实际结果:

场景二:不输入标题,输入内容点击发布

预期结果:提示请输入帖子标题

image-20250327131648515

实际结果:弹窗提示请输入标题,并且标题框高亮,显示最近所发的标题

6.我的帖子页面功能

场景一:点击已发布帖子

预期结果:进入已发布帖子详情页

image-20250327132109200

image-20250327132115994

实际结果:正确进入已发布帖子详情页

缺陷:没有返回上一页功能,只能重新点击我的个人主页返回

场景二:点击已发布帖子,点击编辑,更改内容,点击发布按钮

预期结果:提示发布成功,跳转到我的帖子主页

image-20250327132253835

实际结果:自己发布的帖子没有编辑按钮!

Bug:无法编辑自己发布的帖子

场景三:点击已发布帖子,点击删除

预期结果:提示删除成功,跳转到帖子列表

实际结果:自己发布的帖子没有删除按钮!

Bug:无法删除自己发布的帖子

7.回复私信功能

场景一:点击私信,点击收到的私信,编辑并回复评论

预期结果:系统提示发送成功

image-20250327132605994

image-20250327132620102

image-20250327132642349

image-20250327132700244

实际结果:未读标记红点变为绿色,提示操作成功,私信消息显示:已回复。符合预期结果。

场景二:不输入内容,点击发送

预期结果:提示请输入发送内容

image-20250327132804382

image-20250327133101858

实际结果:自动关闭回复框,提示请输入要回复的内容,未读红点没有消失。

8.个人中心页面功能

场景一:点击修改头像,本地选择图片,点击确定

预期结果:提示修改成功,头像更改

image-20250327133431756

image-20250327133437989

实际结果:没反应

Bug:无法修改头像

场景二:输入修改昵称,点击修改

预期结果:提示修改成功,昵称更改

image-20250327133508004

image-20250327133521254

实际结果:弹窗提示修改成功,主页昵称发生改变。

场景三:修改密码,正确输入原密码、新密码、确认密码,点击提交修改

image-20250327133603635

image-20250327133611650

预期结果:提示修改成功,提示登录信息已过期,跳转到登录页面要求重新登录

实际结果:没有提示修改成功和登录信息已过期,直接跳转到登录页面

缺陷:没有提示登录信息已过期,用户体验不好

场景四:输入错误的原密码,输入新密码进行修改

预期结果:提示原密码错误

image-20250327133716163

实际结果:弹窗提示参数校验失败,并不是提示 原密码错误

缺陷:提示词缺陷,影响用户体验

场景五:正确输入原密码,新密码还是原来的旧密码

预期结果:提示新密码不能与旧密码相同

image-20250327133813312

image-20250327133818474

实际结果:跳转到登录页面要求重新登陆

Bug:新旧密码相同也可以修改

Bug:点击显示密码明文,没反应,无法确定自己输入的密码是什么

五、兼容性测试

测试场景:分别在Chrome、Firefox、Edge下登录论坛,分别进行浏览帖子等流程。

Firefox:

image-20250327140635962

image-20250327140646628

Edge:

image-20250327140722625

image-20250327140731120

预期结果:两个浏览器下界面显示并无异处

实际结果:两个浏览器下进行论坛系统并没有什么不同

六、自动化测试

测试核心功能

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. 交互逻辑问题

  • 私信系统未读红点异常(低优先级):在私信回复框内不输入内容直接点击发送,虽然系统有提示无法发送,但未读消息的红点仍未消失,影响交互体验。

测试结论

  1. 核心功能存在缺陷,影响正常使用
    • 搜索功能、帖子管理、点赞逻辑 需要尽快修复,否则影响用户的基本操作和公平性。
  2. 用户体验仍有优化空间
    • 缺少 “注册成功”提示、帖子详情页返回上一页功能、私信红点交互异常 等问题虽然不会影响基本使用,但降低了用户的体验流畅度,建议优化。
  3. UI 细节优化
    • 论坛首页部分板块无标题、评论时间不准确,影响视觉体验,建议调整。

最终结论:论坛系统基本功能可用,但仍有关键功能缺陷,尤其是 搜索、帖子管理、点赞机制 需要优先修复,以提升用户体验和系统稳定性。

自动化脚本链接:

Gitee:论坛系统自动化测试脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值