博客系统自动化测试

发布于:2025-06-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

基于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 webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    driver = 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 sys

from 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.png
        dirname = 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.driver
        self.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 By

from 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.driver
        self.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 time

from selenium.webdriver.common.by import By

from 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.driver
        self.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 time


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

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