博客系统自动化测试

基于SSM(Spring + Spring MVC + MyBatis)框架构建的个人博客系统,通过分层架构实现高效协作:Spring负责依赖注入与事务管理,Spring MVC处理HTTP请求分发,MyBatis完成数据持久化操作。系统包含以下核心功能模块:

1、系统核心页面与功能

  1. 用户登录页

    • 支持账号密码认证,通过拦截器限制未登录用户访问其他页面。
    • 集成Shiro框架实现密码加密(如MD5)与安全控制。
  2. 博客发表页

    • 提供富文本编辑器(如百度UEditor)支持标题、内容编辑,需登录后操作。
    • 发布时自动记录发布日期、时间、发布者信息。
  3. 博客编辑页

    • 支持已发布博客的标题与内容修改,更新后保留原始发布时间。
    • 前端验证必填字段,避免标题或内容为空提交。
  4. 博客列表页

    • 分页展示所有用户发布的博客,按发布时间倒序排列(最新置顶)。
    • 显示每篇博客的标题、发布日期、发布者及点击量统计。
  5. 博客详情页

    • 展示博客完整内容,支持登录用户进行评论或删除操作。
    • 提供“查看全文”入口,点击后跳转至详情页。

2、自动化测试核心内容(基于Selenium)

通过Selenium定位Web元素并模拟用户行为,覆盖以下测试场景:

  1. 用户登录验证

    • 测试成功登录后跳转至列表页,以及异常登录(错误密码/空输入)的提示处理。
    • 验证登录状态下的权限控制(如未登录禁止访问编辑页)。
  2. 博客内容操作

    • 发布流程:模拟标题/内容输入、提交,验证发布后列表页实时更新。
    • 编辑与删除:修改后检查更新时间不变性;删除后验证数据不可访问性。
    • 详情页校验:对比列表页与详情页的标题、内容、发布者信息一致性。
  3. 系统功能完整性

    • 统计用户信息展示准确性(如昵称、头像)。
    • 验证博客数量同步更新,删除后列表项减少。
    • 退出账号后重定向至登录页,会话终止。

关键技术与设计约束

  • 数据库设计:采用MySQL,表结构包含用户表、博客表、评论表,遵循职责分离原则。
  • 响应式前端:使用Bootstrap/Layui实现多设备适配。
  • 测试缺陷:已知问题包括删除后URL残留访问风险、更新时间未刷新等,需进一步修复。

注:系统测试需结合隐式等待、页面截图(便于问题追踪)及参数化测试用例(提高覆盖率)。完整源码与环境配置(Idea/MySQL 5.7+/Tomcat)详见文献。

3、 测试内容

3.1 编写测试用例

设计测试用例一般从一下六个方面展开:功能测试,易用性测试,界面测试,性能测试,安全性测试以及兼容性测试。在博客系统中主要围绕功能性测试展开

在这里插入图片描述

3.2 执行测试用例

1、用户登陆界面

在这里插入图片描述
2、输入正确的账号密码
例如(账号:zhangsan 密码:123456)
预期结果成功登陆进入到主页面
在这里插入图片描述
3,输入错误的账号密码
在这里插入图片描述

2、博客主页

在这里插入图片描述
从图中我们可以看到用户的头像,文章数量,用户名,GitHub地址

3、 博客编辑/发布/删除

博客编辑
1,首先打开查看全文
在这里插入图片描述
在这里插入图片描述

进入到编辑的主界面
在这里插入图片描述
然后我们对标题和内容进行修改,然后点击更新文章
在这里插入图片描述
运行结果:
在这里插入图片描述
博客发布
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
博客删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、用户退出

在这里插入图片描述
在这里插入图片描述

3.3 自动化测试

3.3.1 WebDriverManager与Selenium类库安装说明

WebDriverManager 是一款自动化管理浏览器驱动的工具,专为简化Selenium测试框架的配置流程而设计。其核心价值在于通过自动处理浏览器驱动的下载、版本匹配及环境配置,显著提升自动化测试的效率和可靠性。

1、核心功能与优势
  1. 自动化驱动管理

    • 版本兼容性:自动检测本地安装的浏览器版本(如Chrome/Firefox/Edge等),下载并配置对应的驱动程序(如chromedriver/geckodriver/msedgedriver)。
    • 环境配置:自动设置系统环境变量(如webdriver.chrome.driver),无需手动指定驱动路径。
    • 缓存机制:默认将驱动缓存于 ~/.cache/selenium,有效期内避免重复下载。
  2. 跨浏览器支持
    兼容主流浏览器驱动管理:

    WebDriverManager.chromedriver().setup();      // Chrome
    WebDriverManager.firefoxdriver().setup();     // Firefox
    WebDriverManager.edgedriver().setup();         // Edge
    
2、安装方法(Python)

“Python项目”
通过pip安装:
bash pip install selenium webdriver-manager
代码初始化示例:

    from selenium import webdriverfrom webdriver_manager.chrome import ChromeDriverManagerfrom selenium.webdriver.chrome.service import Servicedriver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
3、技术价值
  • 效率提升:消除手动下载驱动、匹配版本、配置路径的冗余操作。
  • 版本同步:实时适配浏览器更新,避免因驱动版本过旧导致的兼容性问题。
  • 跨平台支持:兼容Windows/macOS/Linux系统,适配CI/CD流水线环境。

:对于企业级测试框架,建议结合WebDriverManager高级配置项(如自定义缓存周期、私有镜像源)优化持续集成流程。

3.3.2 编写自动化测试脚本

3.3.2.1 Utils
import os
import datetime
import sysfrom selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager#创建一个浏览器对象
class Driver:driver = ""def __init__(self):options = webdriver.EdgeOptions()self.driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()),options=options)self.driver.implicitly_wait(5)def getScreenShot(self):#创建屏幕截图#图片文件名称  2025-06-11-145333.png#图片路径: ../images/2025-06-11/2025-06-11-145333.pngdirname = datetime.datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/" + dirname):os.makedirs("../images/" + dirname)#图片名称:2025-06-11-145333.png# filename = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"# 获取调用的方法名filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"self.driver.save_screenshot("../images/" + dirname +"/" + filename)BlogDriver = Driver()
3.3.2.2 BlogLogin
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver#测试博客登陆页面
class BlogLogin:url = ""driver = ""def __init__(self):self.url="http://8.137.19.140:9090/blog_login.html"self.driver = BlogDriver.driverself.driver.get(self.url)#成功登录的测试用例def loginsuc(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("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#通过对比成功登录后首页的名称来进行判断是否登陆成功# time.sleep(3)# self.driver.find_element(By.CSS_SELECTOR,"h3")# BlogDriver.getScreenShot()# self.driver.quit()# self.driver.back()#登陆失败的测试用例def loginfail(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("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")  # 错误密码# 点击登录 → 等待弹窗出现 → 关闭弹窗self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(3)  # 等待3秒alert = self.driver.switch_to.alert  # 获取弹窗alert.accept()  # 点击弹窗的"确定"# 截图保存证据BlogDriver.getScreenShot()time.sleep(3)# login = BlogLogin()
# login.loginsuc()
# login.loginfail()

在这里插入图片描述

3.3.2.3 BlogDetail
from selenium.webdriver.common.by import Byfrom common.Utils import BlogDriver
import time#测试博客主页
class BlogDetail:url = ""driver = ""def __init__(self):self.url="http://8.137.19.140:9090/blog_list.html"self.driver = BlogDriver.driverself.driver.get(self.url)
#登陆状态下博客详情页测试def BlogDetailtest(self):#检查标题time.sleep(3)self.driver.find_element(By.CSS_SELECTOR, "div.title")#检查时间self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.date")#检查内容self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")#检查用户名称self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")#屏幕截图BlogDriver.getScreenShot()
3.3.2.4 BlogEdit
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriver
#测试博客编辑页面
class BlogEdit:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = BlogDriver.driverself.driver.get(self.url)#正确发布博客(登陆状态下)def EditSucTestByLogin(self):self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("自动化测试创建")time.sleep(3)#找到编辑区域,输入关键词(编辑区域不可操作)#菜单栏无法元素无法定位#博客系统编辑区域默认情况下就不为空,可以暂不处理#直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(3)#点击完成之后出现页面的跳转,页面跳转需要加载时间,可能会出现代码执行的速度比页面渲染的速度要快,导致元素查找不到,因此可以添加等待#添加隐式等待和显示等待都可以,任选择一个#隐式等待:创建浏览器对象之后就可以加上,因为隐式等待的作用域在driver整个生命周期#显示等待:可以作用在当前代码中actual=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title").text#assert actual == "自动化测试创建"#屏幕截图BlogDriver.getScreenShot()
3.3.2.5 testRun
from Tests import BlogDetail
from Tests import BlogLogin
from Tests import BlogEdit
import timefrom common.Utils import BlogDriver
if __name__ == '__main__':BlogLogin.BlogLogin().loginsuc()BlogLogin.BlogLogin().loginfail()BlogLogin.BlogLogin().loginsuc()BlogDetail.BlogDetail().BlogDetailtest()time.sleep(3)BlogLogin.BlogLogin().loginsuc()time.sleep(3)BlogEdit.BlogEdit().EditSucTestByLogin()BlogDriver.driver.quit()

工作目录:
在这里插入图片描述

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

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

相关文章

animate.css详解:轻松实现网页动画效果

前言 在网页设计中,动画效果不仅仅是视觉上的装饰,更是提升用户体验的重要元素。animate.css 作为一个轻量级的 CSS 动画库,提供了丰富的预设动画效果,本文将探讨 animate.css 使用方法以及在实际项目中的应用案例,帮助…

【多智能体】基于嵌套进化算法的多代理工作流

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《人工智能》旨在记录最新的科研前沿,包括大模型、具身智能、智能体等相关领域,期待与你一同探索、学习、进步,一起卷起来叭&#xff…

电源知多少?LDO VS DCDC((下)

首先补充几个上一节没有提到的知识,我们通常说的DCDC同步整流是指什么? 同步是指采用通态电阻极低的专用功率MOS来取代整流二极管以降低整流损耗,,但是同步整流有以下两点需要注意:1、MOS在导通之后的压降比较低&…

数组方法_push()/pop()/数组方法_shift()/unshift()

push 方法用于在数组的末端添加一个或多个元素,并返回添加新元 素后的数组长度。注意,该方法会改变原数组 var arr [];arr.push("颤三") // 1arr.push(itbaizhan) // 2arr.push(true, {}) // 4arr // [颤三 , itbaizhan, true, {}] pop 方法用…

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…

多头与空头:市场博弈的两面

在金融市场中,多头(Bull)和空头(Bear)代表两种截然相反的投资策略,它们的博弈构成了市场价格波动的核心动力。 1. 概念对比:看涨与看跌的本质区别 多头(Bull)&#xff0…

Excel 发现此工作表中有一处或多处公式引用错误。请检查公式中的单元格引用、区域名称、已定义名称以及到其他工作簿的链接是否均正确无误。弹窗

Excel 提示“发现此工作表中有一处或多处公式引用错误”通常表示公式中存在无效引用。以下是系统化的检查步骤,帮助你定位和修复问题: 1. 检查单元格引用: 无效单元格引用:检查公式中的单元格地址(如 A1、B10&…

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …

【指针】(适合考研、专升本)

指针 &与*是两个作用相反的运算符。 二级指针只能保存一级指针变量的地址和指向指针数组,其余情况不考虑。 int *p[2];int a12;int b15;*p&a;*(p1)&b;printf("%d\n%d\n",**p,**(p1));int **rp;printf("%d\n",**r); 普遍变量…

电路图识图基础知识-行程开关自动往返运行控制电路详解(二十三)

行程开关自动往返运行控制电路详解 在机床设备运行中,部分工作台需在特定距离内自动往复循环,行程开关自动往返运行控制电路可实现该功能,通过行程开关自动控制电动机正反转,保障工作台有序运动,以下展开详细解析。 …

SpringBoot学习day1-SpringBoot的简介与搭建

springboot回顾springspringbootspringboot搭建(新闻为例)springboot中的配置文件spring集成jdbc,mybatis,阿里巴巴数据源**SpringBoot 集成日志功能**(了解)常用日志组件日志级别 springboot统一异常处理 springboot 回顾spring spring是一个轻量级的…

【牛客小白月赛117】E题——种类数小结

1 初步想法 1.1 前置知识:vector数组的去重操作 unique()将不重复的元素放在数组前面,重复元素移到后面,qs获取不重复元素的后一个位置,之后用erase()函数去除重复元素。 qsunique(a.begin()1,a.begin()k1); a.erase(qs,a.end(…

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…

MatAnyone本地部署,视频分割处理,绿幕抠像(WIN/MAC)

大家好,今天要和大家分享的项目是MatAnyone,与上一篇分享的SAM2LONG类似,不过上次的分享没有提到如何在 MAC 上部署,后来有小伙伴私信说希望能出一个 MAC 版本的。那正好看到MatAnyone这个项目顺手就写下来。该项目基于SAM2同样可…

记录下blog的成长过程

2025-06-11 新人榜83 2025-06-09 新人榜87 北京市原力月榜 80

C语言学习20250611

指针 指针类型 int p;》普通的整形变量int *p;》p先与*结合,表示p为指针,该指针指向的内容的数据类型为整型int p[3];》p为一个由整型数据组成的数组int *p[3];》因为[]比*优先级高,p先与方括号结合,所以p为一个数组&#xff0c…

【AI智能体】Dify 从部署到使用操作详解

目录 一、前言 二、Dify 介绍 2.1 Dify 是什么 2.2 Dify 核心特性 2.2.1 多模型支持 2.2.2 可视化编排工作流 2.2.3 低代码/无代码开发 2.3 Dify 适用场景 2.4 Dify 与Coze的对比 2.4.1 定位与目标用户 2.4.2 核心功能对比 2.4.3 开发体验与成本 2.4.4 适用场景对比…

Java爬虫库的选择与实战代码

如果你的项目正在Java中考虑引入爬虫能力,无论是做数据分析、信息聚合,还是竞品监测,选对库确实能大幅提升开发效率和运行效果。结合当前主流库的特点与适用场景,我整理了一份更贴近实战的对比分析,并附上可直接运行的…

详细解释aruco::markdetection _detectInitialCandidates函数

_detectInitialCandidates 是 OpenCV 的 ArUco 模块中一个非常关键的函数,它负责检测图像中的候选 ArUco 标记。该函数的主要目标是: 使用多个尺度(scale)对输入图像进行自适应阈值处理;在每个尺度下提取轮廓并筛选出…

Android 开发中配置 USB 配件模式(Accessory Mode) 配件过滤器的配置

在 Android 开发中配置 USB 配件模式(Accessory Mode) 的配件过滤器(accessory_filter.xml),需要以下步骤: 1. 创建配件过滤器文件 在项目的 res/xml/ 目录下创建 accessory_filter.xml 文件(若…