论坛系统自动化测试
1、项目背景与测试目标
-
系统定位
论坛系统作为典型的高并发Web应用,需支持用户注册、登录、发帖、评论、私信及个人中心管理等核心功能,是用户公开交流与信息共享的核心平台。其稳定性与响应效率直接影响用户体验及平台活跃度。 -
测试必要性
- 功能可靠性:用户高频操作(如发帖、回复)需保证流程完整性与数据一致性,避免因功能缺陷导致信息丢失或操作中断。
- 性能瓶颈:高并发场景下(如热门板块访问),系统需维持低延迟响应(平均<2秒),并确保资源利用率合理(CPU/内存无溢出)。
- 用户体验:界面易用性、跨浏览器兼容性及错误处理机制是用户留存的关键因素。
2、技术架构与测试挑战
-
系统架构特点
- 后端:Spring Boot + MyBatis + MySQL集群(主从复制+读写分离)。
- 前端:Bootstrap响应式设计,依赖多浏览器兼容。
- 部署:Nginx负载均衡分发请求至多台应用服务器。
-
测试核心挑战
- 场景复杂度:需覆盖用户从注册到互动的完整路径(正向/逆向操作)。
- 环境依赖:真实模拟高并发(>1000用户)及多终端(Chrome/Edge/Firefox)场景。
- 缺陷隐蔽性:界面逻辑错误(如未提示注册成功)及性能瓶颈(搜索功能无响应)需深度遍历才能暴露。
3、核心功能模块与质量要求
模块 | 功能场景 | 质量风险 |
---|---|---|
用户注册 | 信息校验、协议勾选、重复账号检测 | 用户信息入库失败、错误提示缺失 |
用户登录 | 凭证验证、空输入处理、错误反馈 | 安全漏洞(暴力破解)、跳转逻辑错误 |
帖子交互 | 发帖/回复/私信、内容持久化 | 数据丢失、页面加载超时、权限控制失效 |
个人中心 | 信息修改、历史记录查看 | 数据更新延迟、页面元素加载不全 |
4、测试目标与质量指标
- 功能覆盖:
- 自动化脚本覆盖核心链路(注册→登录→发帖→退出)通过率100%。
- 缺陷修复率100%(含界面提示缺失、功能无响应等)。
- 兼容性要求:
- 支持Chrome 134+、Edge 131+、Firefox 131+等主流浏览器。
5、测试内容
登陆界面
,
注册界面
6、测试代码
6.1 自动化测试脚本详解
import os.path
from datetime import datetimeimport webdriver_manager.drivers.chrome
from requests import options
from selenium import webdriver
from selenium.webdriver.ie.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.maximize_window()#屏幕截图def getscreenshot(self):diam = datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/"+diam):os.mkdir("../images/"+diam)#设置图片的名称格式fliename = datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"self.driver.save_screenshot("../images/"+diam+"/"+fliename)forum = Driver()
核心功能
-
初始化浏览器
- 通过
webdriver_manager
自动下载并管理最新版Chrome驱动(无需手动安装驱动)。 - 启动浏览器时自动最大化窗口(
maximize_window()
)。 - 示例:
forum = Driver()
会立刻打开一个全屏Chrome窗口。
- 通过
-
智能截图保存
- 调用
getscreenshot()
时,会按日期生成文件夹(如../images/2025-06-13/
)。 - 截图文件名包含精确时间(如
2025-06-13-143022.png
),避免重复。 - 示例:
forum.getscreenshot()
会保存当前浏览器页面到指定路径。
- 调用
代码关键点
# 自动安装Chrome驱动并启动浏览器
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), # 自动管理驱动options=options
)
# 按日期分类保存截图
diam = datetime.now().strftime("%Y-%m-%d") # 当前日期作为文件夹名
fliename = datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png" # 时间戳作为文件名
self.driver.save_screenshot("../images/"+diam+"/"+fliename)
设计意图
- 复用浏览器对象:通过
Driver
类封装初始化逻辑,避免重复创建浏览器实例。 - 自动化文件管理:日期文件夹 + 时间戳文件名,确保截图有序存储。
- 简化依赖:
webdriver_manager
自动处理驱动下载,提升代码可移植性。
实际应用场景
- 自动化测试:在测试用例执行失败时自动截图存档。
- 网页监控:定时对特定页面截图,用于内容变更追踪。
- 爬虫调试:在数据抓取过程中保存页面快照,便于排查问题。
✅ 总结:这段代码是浏览器自动化+智能截图工具,适合需要反复操作浏览器并记录结果的场景(如测试、爬虫)。通过封装常用操作,大幅简化了代码复杂度。
6.2 登录功能自动化测试脚本详解
这个代码是一个自动化测试脚本,用于测试一个论坛的登录功能。我来用简单易懂的方式解释一下它的工作原理和设计思路:
核心功能概述
这是一个登录页面的自动化测试工具:
- 可以模拟用户输入不同组合的用户名和密码
- 测试登录功能的正常情况和各种异常情况
- 自动截屏记录每次测试的结果
- 自动验证系统反馈信息是否正确
代码结构解析
1. 初始化设置 (__init__
方法)
def __init__(self):self.url = "http://127.0.0.1:9580/sign-in.html" # 登录页面地址self.driver = forum.driver # 使用共享的浏览器实例self.driver.get(self.url) # 打开登录页面
2. 正常登录测试 (normalTest
方法)
def normalTest(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("Test1")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, "header中的用户名字段选择器")# 截屏保存self.driver.maximize_window()forum.getscreenshot()
3. 异常登录测试 (abnormalTest
方法)
这个测试方法模拟了5种不同的错误登录情况:
-
错误用户名 + 错误密码
# 输入错误凭据 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 点击登录 # 验证警告信息:assert adim == "警告"
-
错误用户名 + 正确密码
# 输入错误用户名 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234") # 点击登录 # 验证警告信息:assert adim == "警告"
-
正确用户名 + 错误密码
# 输入错误密码 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1") self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 点击登录 # 验证警告信息:assert adim == "警告"
-
只输入密码,不输入用户名
# 只输入密码 self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123") # 点击登录 # 验证提示信息:assert adim == "用户名不能为空"
-
只输入用户名,不输入密码
# 只输入用户名 self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1") # 点击登录 # 验证提示信息:assert adim == "密码不能为空"
每个测试步骤都会进行页面截屏保存
如何使用
# 创建测试对象
login = forumlogin()# 运行正常登录测试
login.normalTest()# 运行异常登录测试(当前被注释)
# login.abnormalTest()
6.3 注册功能自动化测试脚本详解
测试脚本核心功能
-
注册页面测试
- 测试正常注册流程(用户名、昵称、密码输入正确)
- 测试4种异常注册场景(关键字段缺失或协议未同意)
-
自动化操作
- 自动填充表单字段
- 自动点击注册按钮
- 智能验证操作结果
- 自动截屏保存测试证据
代码结构解析
class signUp: # 注册测试主类def __init__(self): # 初始化self.url = "http://127.0.0.1:9580/sign-up.html" # 注册页面地址self.driver = forum.driver # 复用浏览器实例self.driver.get(self.url) # 打开注册页面
1. 正常注册测试 (snormal
)
def snormal(self):# 清空输入框 → 填写完整信息 → 勾选协议 → 点击注册# 验证是否跳转到登录页(通过检测登录页元素)# 自动截屏保存结果
2. 异常注册测试 (failsign
)
测试了4种错误情况:
- 用户名缺失
# 不填用户名 → 验证提示"用户名不能为空"
- 协议未勾选
# 填写信息但取消勾选 → 验证停留在注册页
- 昵称缺失
# 不填昵称 → 验证提示"昵称不能为空"
- 密码缺失
# 不填密码 → 验证错误提示
验证机制亮点
-
元素定位验证
使用CSS选择器精确检测页面元素:self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > h2")
-
智能截屏
调用forum.getscreenshot()
自动按日期分类保存截图:# 示例路径:../images/2025-06-13/2025-06-13-143022.png
-
状态检测
对复选框进行智能判断:if checkbox.is_selected(): # 检测是否已勾选checkbox.click() # 取消勾选
执行方式
signUP = signUp() # 创建测试对象
# signUP.snormal() # 执行正常测试(当前被注释)
signUP.failsign() # 执行异常测试
6.4 论坛首页自动化测试脚本详解
代码功能解析
- 基础结构
class fpega:driver = ""def __init__(self):self.driver = forum.driver
这段代码创建了一个论坛首页测试类,复用了之前初始化的浏览器对象,符合自动化测试的资源复用原则。
- 元素验证方法
def fcheckelement(self):time.sleep(1) # 固定等待# 定位多个关键页面元素self.driver.find_element(By.CSS_SELECTOR,"#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")self.driver.find_element(By.CSS_SELECTOR,"#index_nav_nickname")... # 其他元素定位forum.getscreenshot() # 执行截图
该方法实现了:
- 验证首页关键元素是否存在(文章标题、用户昵称、导航菜单等)
- 执行页面截图保存测试证据
测试执行流程
6.5 发布自动化此时脚本详解
核心功能设计
-
页面元素检查 (
eCheck
方法)- 导航流程:首页 → 点击发帖按钮 → 进入发帖页面
- 验证关键元素存在性:
- 板块选择下拉框(
#article_post_borad
) - 标题输入框(
#article_post_title
) - 富文本编辑器(复杂 CSS 选择器定位 CodeMirror 组件)
- 发布按钮(
#article_post_submit
)
- 板块选择下拉框(
- 使用
time.sleep()
强制等待页面加载(需优化)
-
功能测试 (
eFuncTest
方法)- 测试用例 1:正常发帖(当前被注释)
# self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys("测试帖子1") # ...(内容编辑被注释因技术难点)
- 测试用例 2:标题为空提交
ActionChains(self.driver).move_to_element(element).click().perform() # 无标题点击发布 text1 = self.driver.find_element(...).text # 捕获错误提示 forum.getscreenshot() # 截图存档
- 测试用例 3:内容为空提交
self.driver.find_element(...).send_keys("测试帖子1") # 输入标题 ActionChains(...).click().perform() # 提交 text2 = self.driver.find_element(...).text # 捕获错误
- 测试用例 1:正常发帖(当前被注释)
关键问题与优化建议
-
等待机制缺陷
- 现状:全使用
time.sleep()
强制等待time.sleep(1) # 无条件等待1秒
- 风险:页面加载快则浪费时间,加载慢则元素定位失败
- 优化方案(三选一):
# 方案1:显式等待(推荐) from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "article_post_submit")) ).click()# 方案2:隐式等待(全局设置) driver.implicitly_wait(5) # 在__init__中设置一次# 方案3:Fluent等待(复杂场景) wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[TimeoutException]) wait.until(lambda d: d.find_element(By.ID, "article_post_submit"))
- 现状:全使用
-
富文本编辑器交互问题
- 难点:CodeMirror 编辑器非标准 input 元素
# 当前无法操作: # edit-article > div.CodeMirror... > div > pre
- 解决方案:
# 通过JavaScript注入内容 js_script = "document.querySelector('div.CodeMirror').CodeMirror.setValue('自动化测试内容')" driver.execute_script(js_script)
- 难点:CodeMirror 编辑器非标准 input 元素
-
验证机制强化
- 现状:仅打印提示文本
print(text1) # 未做断言验证
- 优化方向:
assert "标题不能为空" in text1 # 添加断言 assert "内容不能为空" in text2
- 现状:仅打印提示文本
执行流程优化
graph TDA[初始化浏览器] --> B[eCheck 元素检查]B --> C[导航至发帖页]C --> D[验证关键元素]D --> E[eFuncTest 功能测试]E --> F[用例1:正常发帖]E --> G[用例2:空标题提交]E --> H[用例3:空内容提交]H --> I[返回首页]
测试用例扩展建议
- 边界值测试:
# 超长标题测试(>255字符) long_title = "A"*256 driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys(long_title)
- 特殊字符测试:
special_chars = "!@#$%^&*()_+" driver.find_element(...).send_keys(special_chars)
- 敏感词过滤验证:
driver.find_element(...).send_keys("违禁词测试") assert "包含敏感词" in error_text
最佳实践总结
- 等待策略:优先使用 显式等待 > 隐式等待 > 强制等待
- 元素定位:简化 CSS 选择器,优先用 ID/ClassName
- 异常处理:增加
try/except
捕获NoSuchElementException
- 截图管理:保留
forum.getscreenshot()
便于故障回溯 - 动作封装:将
ActionChains
操作封装为独立方法
通过优化等待机制和增加断言验证,该脚本可显著提升测试稳定性和验证严谨性。建议优先解决富文本编辑器交互问题以解锁完整功能测试能力。
6.6 启动文件
from Test import entryTest
from Test import firstPega
from Test import postContent
from Test import editPage
from Test import privates
if __name__ =="main":#首先测试登录失败entryTest.forumlogin().abnormalTest()#然后登录成功entryTest.forumlogin().normalTest()#进入首页进行测试firstPega.fpega().fcheckelement()#进入博客详情页测试postContent.pContent().pCheck()postContent.pContent().pFunTest()#进入博客编辑页面editPage.epega().eCheck()editPage.epega().eFuncTest()