当前位置: 首页 > news >正文

论坛系统自动化测试

1、项目背景与测试目标

  1. 系统定位
    论坛系统作为典型的高并发Web应用,需支持用户注册、登录、发帖、评论、私信及个人中心管理等核心功能,是用户公开交流与信息共享的核心平台。其稳定性与响应效率直接影响用户体验及平台活跃度。

  2. 测试必要性

    • 功能可靠性:用户高频操作(如发帖、回复)需保证流程完整性与数据一致性,避免因功能缺陷导致信息丢失或操作中断。
    • 性能瓶颈:高并发场景下(如热门板块访问),系统需维持低延迟响应(平均<2秒),并确保资源利用率合理(CPU/内存无溢出)。
    • 用户体验:界面易用性、跨浏览器兼容性及错误处理机制是用户留存的关键因素。

在这里插入图片描述


2、技术架构与测试挑战

  1. 系统架构特点

    • 后端:Spring Boot + MyBatis + MySQL集群(主从复制+读写分离)。
    • 前端:Bootstrap响应式设计,依赖多浏览器兼容。
    • 部署:Nginx负载均衡分发请求至多台应用服务器。
  2. 测试核心挑战

    • 场景复杂度:需覆盖用户从注册到互动的完整路径(正向/逆向操作)。
    • 环境依赖:真实模拟高并发(>1000用户)及多终端(Chrome/Edge/Firefox)场景。
    • 缺陷隐蔽性:界面逻辑错误(如未提示注册成功)及性能瓶颈(搜索功能无响应)需深度遍历才能暴露。

3、核心功能模块与质量要求

模块功能场景质量风险
用户注册信息校验、协议勾选、重复账号检测用户信息入库失败、错误提示缺失
用户登录凭证验证、空输入处理、错误反馈安全漏洞(暴力破解)、跳转逻辑错误
帖子交互发帖/回复/私信、内容持久化数据丢失、页面加载超时、权限控制失效
个人中心信息修改、历史记录查看数据更新延迟、页面元素加载不全

4、测试目标与质量指标

  1. 功能覆盖
    • 自动化脚本覆盖核心链路(注册→登录→发帖→退出)通过率100%
    • 缺陷修复率100%(含界面提示缺失、功能无响应等)。
  2. 兼容性要求
    • 支持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()

核心功能

  1. 初始化浏览器

    • 通过 webdriver_manager 自动下载并管理最新版Chrome驱动(无需手动安装驱动)。
    • 启动浏览器时自动最大化窗口(maximize_window())。
    • 示例:forum = Driver() 会立刻打开一个全屏Chrome窗口。
  2. 智能截图保存

    • 调用 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 自动处理驱动下载,提升代码可移植性。

实际应用场景

  1. 自动化测试:在测试用例执行失败时自动截图存档。
  2. 网页监控:定时对特定页面截图,用于内容变更追踪。
  3. 爬虫调试:在数据抓取过程中保存页面快照,便于排查问题。

✅ 总结:这段代码是浏览器自动化+智能截图工具,适合需要反复操作浏览器并记录结果的场景(如测试、爬虫)。通过封装常用操作,大幅简化了代码复杂度。

6.2 登录功能自动化测试脚本详解

这个代码是一个自动化测试脚本,用于测试一个论坛的登录功能。我来用简单易懂的方式解释一下它的工作原理和设计思路:

核心功能概述

这是一个登录页面的自动化测试工具:

  1. 可以模拟用户输入不同组合的用户名和密码
  2. 测试登录功能的正常情况和各种异常情况
  3. 自动截屏记录每次测试的结果
  4. 自动验证系统反馈信息是否正确

代码结构解析

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种不同的错误登录情况:

  1. 错误用户名 + 错误密码

    # 输入错误凭据
    self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11")
    self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
    # 点击登录
    # 验证警告信息:assert adim == "警告"
    
  2. 错误用户名 + 正确密码

    # 输入错误用户名
    self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test11")
    self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
    # 点击登录
    # 验证警告信息:assert adim == "警告"
    
  3. 正确用户名 + 错误密码

    # 输入错误密码
    self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1")
    self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
    # 点击登录
    # 验证警告信息:assert adim == "警告"
    
  4. 只输入密码,不输入用户名

    # 只输入密码
    self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
    # 点击登录
    # 验证提示信息:assert adim == "用户名不能为空"
    
  5. 只输入用户名,不输入密码

    # 只输入用户名
    self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("Test1")
    # 点击登录
    # 验证提示信息:assert adim == "密码不能为空"
    

每个测试步骤都会进行页面截屏保存

如何使用

# 创建测试对象
login = forumlogin()# 运行正常登录测试
login.normalTest()# 运行异常登录测试(当前被注释)
# login.abnormalTest()

6.3 注册功能自动化测试脚本详解

测试脚本核心功能

  1. 注册页面测试

    • 测试正常注册流程(用户名、昵称、密码输入正确)
    • 测试4种异常注册场景(关键字段缺失或协议未同意)
  2. 自动化操作

    • 自动填充表单字段
    • 自动点击注册按钮
    • 智能验证操作结果
    • 自动截屏保存测试证据

代码结构解析

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种错误情况:

  1. 用户名缺失
    # 不填用户名 → 验证提示"用户名不能为空" 
    
  2. 协议未勾选
    # 填写信息但取消勾选 → 验证停留在注册页 
    
  3. 昵称缺失
    # 不填昵称 → 验证提示"昵称不能为空" 
    
  4. 密码缺失
    # 不填密码 → 验证错误提示 
    

验证机制亮点

  1. 元素定位验证
    使用CSS选择器精确检测页面元素:

    self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > h2")
    
  2. 智能截屏
    调用forum.getscreenshot()自动按日期分类保存截图:

    # 示例路径:../images/2025-06-13/2025-06-13-143022.png
    
  3. 状态检测
    对复选框进行智能判断:

    if checkbox.is_selected():  # 检测是否已勾选checkbox.click()  # 取消勾选
    

执行方式

signUP = signUp()  # 创建测试对象
# signUP.snormal()  # 执行正常测试(当前被注释)
signUP.failsign()   # 执行异常测试

6.4 论坛首页自动化测试脚本详解

代码功能解析

  1. 基础结构
class fpega:driver = ""def __init__(self):self.driver = forum.driver  

这段代码创建了一个论坛首页测试类,复用了之前初始化的浏览器对象,符合自动化测试的资源复用原则。

  1. 元素验证方法
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()  # 执行截图

该方法实现了:

  • 验证首页关键元素是否存在(文章标题、用户昵称、导航菜单等)
  • 执行页面截图保存测试证据

测试执行流程

创建fpega实例
调用fcheckelement方法
等待1秒
验证元素1存在
验证元素2存在
...验证其他元素
执行页面截图
保存到日期分类文件夹

6.5 发布自动化此时脚本详解

核心功能设计

  1. 页面元素检查 (eCheck 方法)

    • 导航流程:首页 → 点击发帖按钮 → 进入发帖页面
    • 验证关键元素存在性:
      • 板块选择下拉框(#article_post_borad
      • 标题输入框(#article_post_title
      • 富文本编辑器(复杂 CSS 选择器定位 CodeMirror 组件)
      • 发布按钮(#article_post_submit
    • 使用 time.sleep() 强制等待页面加载(需优化)
  2. 功能测试 (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"))
      
  2. 富文本编辑器交互问题

    • 难点:CodeMirror 编辑器非标准 input 元素
      # 当前无法操作:
      # edit-article > div.CodeMirror... > div > pre
      
    • 解决方案
      # 通过JavaScript注入内容
      js_script = "document.querySelector('div.CodeMirror').CodeMirror.setValue('自动化测试内容')"
      driver.execute_script(js_script)
      
  3. 验证机制强化

    • 现状:仅打印提示文本
      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[返回首页]

测试用例扩展建议

  1. 边界值测试
    # 超长标题测试(>255字符)
    long_title = "A"*256
    driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys(long_title)
    
  2. 特殊字符测试
    special_chars = "!@#$%^&*()_+"
    driver.find_element(...).send_keys(special_chars)
    
  3. 敏感词过滤验证
    driver.find_element(...).send_keys("违禁词测试")
    assert "包含敏感词" in error_text
    

最佳实践总结

  1. 等待策略:优先使用 显式等待 > 隐式等待 > 强制等待
  2. 元素定位:简化 CSS 选择器,优先用 ID/ClassName
  3. 异常处理:增加 try/except 捕获 NoSuchElementException
  4. 截图管理:保留 forum.getscreenshot() 便于故障回溯
  5. 动作封装:将 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()

相关文章:

  • GRUB2 启动配置的工作原理与优先级规则详解
  • SSH远程连接到Windows服务器
  • 概率基础——不确定性的数学
  • 1.3、SDH光接口类型
  • 批处理实现:自动抓取perfetto日志 自动导出到当前文件夹 自动打开分析页面
  • (nice!!!)(LeetCode 每日一题) 2616. 最小化数对的最大差值 (二分查找)
  • 落地 DDD 领域模型(常见的实现模式)
  • 单项链表的操作及其实现
  • 【二叉树】(四)二叉搜索树的基础修改构造及属性求解1
  • Spring 事务传播行为详解
  • AbMole小课堂:从肿瘤研究到体内模型构建,Mitomycin C一“剂”搞
  • 寻找区域中的面积和中心点
  • java哨兵底层原理
  • linux下安装所有用户能共享的anaconda
  • rocketmq producer和consumer连接不同的集群,如何隔离
  • Windows10电脑开始菜单快速查找应用程序
  • Web网页端即时通讯源码/IM聊天源码RainbowChat-Web
  • RocketMQ总结
  • 导出支付宝账单步骤
  • Unity 接入抖音小游戏一
  • 网站租用服务器多少钱/网站推广排名收费
  • 手机版网站做一下多少钱/网络优化工程师骗局
  • 做不锈钢管网站/品牌网站建设制作
  • 简单自适应网站/搜索引擎优化特点
  • 河北响应式网站建设/广告主平台
  • c2c网站是什么/营销助手下载app下载