论坛系统自动化测试

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChipWhisperer教程(一)

一、ChipWhisperer介绍 ChipWhisperer 是一个完整的开源工具链&#xff0c;用于学习嵌入式设备上的侧信道攻击并验证这些设备的侧信道抗性。ChipWhisperer主要用于功耗分析&#xff0c;利用设备功耗泄露的信息进行攻击&#xff0c;也可用于故障攻击&#xff08;电压和时钟毛刺…

【持续更新】计算机网络试题

问题1 请简要说明TCP/IP协议栈的四层结构&#xff0c;并分别举出每一层出现的典型协议或应用。 答案 应用层&#xff1a;ping,telnet,dns 传输层&#xff1a;tcp,udp 网络层&#xff1a;ip,icmp 数据链路层&#xff1a;arp,rarp 问题2 下列协议或应用分别属于TCP/IP协议…

短剧系统开发:打造高效、创新的短视频娱乐平台 - 从0到1的完整解决方案

一、短剧市场迎来爆发式增长 - 不容错过的万亿级蓝海 随着5G技术的普及和移动互联网的深度渗透&#xff0c;短剧市场正在经历前所未有的爆发式增长。根据权威机构艾瑞咨询最新发布的《2023年中国网络短剧行业发展报告》显示&#xff1a; 市场规模&#xff1a;2023年中国短剧市…

ChipWhisperer教程(三)

——CW305目标板的波形采集 一、目标板介绍 CW305 是一款独立的 FPGA 目标板&#xff0c;搭载的FPGA芯片为Xilinx Artix-7系列。 它具有与 FPGA 通信的 USB 接口、为 FPGA 提供时钟的外部 PLL、编程 VCC-INT 电源以及用于故障注入环境的二极管保护。 CW305 电路板有多种配置&…

django中如何解析content-type=application/json的请求

django中如何解析content-typeapplication/json的请求 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 往期文章回顾: …

Chainlink VRF 深度解析与实战

背景 在区块链的去中心化应用中&#xff0c;随机性是一个常见但难以实现的需求。例如&#xff0c;区块链游戏需要随机决定战斗结果&#xff0c;NFT 项目需要随机分配稀有属性&#xff0c;去中心化抽奖需要公平选择获奖者。然而&#xff0c;传统的链上随机数生成方法&#xff0…

7. TypeScript接口

TypeScript 中的接口&#xff08;Interfaces&#xff09;用于定义对象的结构。它们允许开发者指定一个对象应具有哪些属性以及这些属性的类型。接口有助于确保对象遵循特定的结构&#xff0c;从而在整个应用中提供一致性&#xff0c;并提升代码的可维护性。 一、认识接口 Typ…

UE 新版渲染器输出视频

安装包解压到C盘 打开UE插件 Movie Render Queue 进入UE引擎在项目设置找到 libx264 aac mp4 影片渲染队列调用出 命令行编码器安装包路径&#xff0c;序列输出路径&#xff0c;定序器不能有中文

基于用户的协同过滤推荐算法实现(Java电商平台)

在电商平台中&#xff0c;基于用户的协同过滤推荐算法是一种常见的推荐系统方法。它通过分析用户之间的相似性来推荐商品。以下是一个简单的实现思路和示例代码&#xff0c;使用Java语言。 实现思路 数据准备&#xff1a;收集用户的评分数据&#xff0c;通常以用户-商品评分矩…

LeetCode - 904. 水果成篮

题目 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 思路 题目本质 你有一个整数数组&#xff0c;每个元素代表一种水果。你只能用两个篮子&#xff0c;每个篮子只能装一种水果。你要在数组中找一个最长的连续子数组&#xff0c;这个子数组里最多只包含两种不同的…

发现 Kotlin MultiPlatform 的一点小变化

最近发现 Kotlin 官方已经开始首推 Idea 的社区版的 KMP 插件了. 以前有网页创建 KMP 的项目的文档也消失了. 虽然有 Android Studio 的选项. 但是却不是在默认的位置上了. 足以说明官方是有意想让大家直接使用 Idea 社区版或者专业版 所以我直接在社区版上安装 KMP 插件. 尝试…

【Photoshop】金属字体制作

新建一个空白项目&#xff0c;选择横排文字工具&#xff0c;输入想要的文件建立文字图层 选择横排文字工具选择出文字内容&#xff0c;在通知栏出点击’拾色器‘&#xff0c;设置好需要的文字颜色 图层面板右下角点击‘添加图层样式’&#xff0c;选择斜面和浮雕 样式设置为内斜…

centos 7.9 升级ssh版本 7.4p1 升级到 8.2p1

centos 7.9 升级ssh版本 7.4p1 升级到 8.2p1 1、安装包下载2、安装telnet3、安装openssl-OpenSSL_1_1_1f.tar.gz4、安装openssh-8.2p1.tar.gz5、修改ssh服务的相关配置文件6、确定可以ssh连接服务器后&#xff0c;卸载telnet&#xff0c;因为telnet不安全 本文是离线环境下升级…

stm32---dma串口发送+fifo队列框架

之前分享了一个关于gd32的fifo框架&#xff0c;这次就用stm32仿照写一个&#xff0c;其实几乎一样&#xff0c;这次说的更详细点&#xff0c;我全文都写上了注释&#xff0c;大家直接cv模仿我的调用方式即可 uasrt.c #include "stm32f10x.h" // D…

【生产就曲篇】让应用可观测:Actuator监控端点与日志最佳实践

摘要 本文是《Spring Boot 实战派》系列的终章&#xff0c;我们将探讨如何让应用真正达到**“生产就绪” (Production-Ready)** 的标准。文章的核心是可观测性 (Observability)&#xff0c;即从外部了解一个系统内部运行状态的能力。 我们将深度挖掘 Spring Boot Actuator 的…

操作系统知识(1)

操作系统的分类总结 1、批处理操作系统:单道批处理和多道批处理(主机与外设可并行) 2、分时操作系统:一个计算机系统与多个终端设备连接。将CPU的工作时间划分为许多很短的时间片&#xff0c;轮流为各个终端的用户服务。 3、实时操作系统:实时是指计算机对于外来信息能够以足…

一.Sharding分库分表-基因法+自定义多key分片实现多字段查询

前言 当下遇到这样一个场景&#xff0c;由于订单数据量达到千万级别&#xff0c;采用分库分表进行优化&#xff0c;根据订单的热查条件&#xff1a;order_no订单编号进行分表&#xff0c;但是这样带来一个问题&#xff0c;用户查询自己的订单怎么查&#xff1f;由于分片键使用…

【leetcode】543. 二叉树的直径

二叉树的直径 题目题解解释 题目 543. 二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 题解 …

AI基础知识(07):基于 PyTorch 的手写体识别案例手册

目录 实验介绍 实验对象 实验时间 实验流程 实验介绍 随着人工智能技术的飞速发展&#xff0c;图像识别技术在众多领域得到了广泛应用。手写体识别作为图像 识别的一个重要分支&#xff0c;其在教育、金融、医疗等领域具有广泛的应用前景。本实验旨在利用深度 学习框架 PyTorc…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…