博客系统测试

目录

一、项目背景

[1. 项目背景与意义](#1. 项目背景与意义)

[2. 项目概述](#2. 项目概述)

[2.1 已实现的主要功能包括](#2.1 已实现的主要功能包括)

[2.2 当前系统存在的不足](#2.2 当前系统存在的不足)

[3. 测试目标](#3. 测试目标)

[4. 测试项目相关信息](#4. 测试项目相关信息)

二、测试安排

三、测试分类

(一)自动化功能测试

[1. 编写 Web 测试用例​编辑](#1. 编写 Web 测试用例编辑)

[2. 搭建 Python 自动化项目](#2. 搭建 Python 自动化项目)

[2.1 环境配置准备](#2.1 环境配置准备)

[2.2 封装公共驱动对象](#2.2 封装公共驱动对象)

[2.3 分模块编写 tests 测试用例](#2.3 分模块编写 tests 测试用例)

[2.4 自动化执行过程中发现的业务缺陷](#2.4 自动化执行过程中发现的业务缺陷)

(二)性能测试

[1. 模拟并发访问项目事务各页面](#1. 模拟并发访问项目事务各页面)

[2. 高并发下系统产生的问题观测与验证](#2. 高并发下系统产生的问题观测与验证)

四、遗留风险

五、测试结果评估


项目名称 博客系统 版本号 V1.0
发布类型 迭代发布 测试负责人 本人
测试完成日期 2026.07.02 联系方式 -
评审人 前端开发、后端开发、测试、产品、交互 批准人 产品负责人

一、项目背景

1. 项目背景与意义

随着博客内容发布、浏览、编辑等线上业务需求落地,需要保障系统多页面、多登录状态下功能稳定可用。单纯依靠手工回归测试会消耗大量重复人力,迭代新版本冒烟效率低下。

本次开展手工功能全量测试 + Python Selenium UI 自动化测试,一方面验证系统核心业务流程无阻断缺陷,保障上线质量;另一方面搭建可持续复用的自动化回归框架,后续版本迭代可一键执行冒烟用例,降低重复测试成本,提前发现页面渲染、弹窗拦截、权限控制等前端交互缺陷。

2. 项目概述

本项目为 Web 端博客管理系统,支持访客未登录浏览、登录用户发布 / 编辑 / 删除个人博客、查看他人博客等核心业务,包含四大核心页面:登录页面、博客列表主页、博客详情页、博客编辑页。测试覆盖登录权限控制、页面渲染、博客编辑发布、访客拦截等全场景。

2.1 已实现的主要功能包括

  1. 用户登录:支持正确账号密码登录、错误账号 / 空密码异常拦截弹窗提示;
  2. 博客列表主页:区分未登录 / 登录两种状态,未登录访问自动弹窗并跳转登录页;登录成功展示个人信息、导航菜单、博客列表三大模块;
  3. 博客详情页:登录用户可查看他人博客仅浏览;查看本人博客可跳转编辑页面,修改内容后重新发布;
  4. 博客编辑页:支持直接链接访问、列表 / 详情页跳转进入;区分未登录、登录两种状态,支持标题 + 富文本正文编辑、提交发布;未登录提交触发登录拦截弹窗;
  5. 基础权限控制:未登录用户无法提交发布博客,仅可打开编辑页面填写内容

2.2 当前系统存在的不足

  1. 页面异常弹窗缺陷:打开博客详情页会高频弹出无关弹窗 "1",遮挡操作按钮,干扰用户操作与自动化脚本执行;
  2. 页面加载性能缺陷:未登录状态直接访问博客编辑页面,页面渲染速度极慢,长时间空白后才加载表单元素;
  3. 交互提示不完善:未登录填写完整博客内容点击提交,仅弹出简易弹窗,无清晰文字引导用户登录;
  4. 前端 DOM 结构不稳定:大量页面元素依靠绝对 XPath 定位,前端微调页面布局会直接导致操作失效;
  5. 无自动化持续集成机制,每次版本更新只能本地手动执行回归脚本。

3. 测试目标

4. 测试项目相关信息

  • 系统测试地址:博客列表页
  • 前端接口文档:后端 Swagger 接口文档
  • 自动化代码仓库:https://gitee.com/dwaekkiyo/blog-auto-test
  • 配套文档:《博客系统测试计划》、《产品需求文档》、《前端 UI 设计稿》
  • 测试技术栈:Python3 + Selenium4 + WebDriverWait 显式等待 + ActionChains 富文本操作

二、测试安排

模块 子模块 提测时间 工时 排期 进度 备注
用户模块 登录功能 06.31 0.2d 06.31 测试完成 登录成功、异常登录场景全覆盖
博客列表模块 主页渲染、未登录拦截、页面三大模块 07.01 0.2d 07.01 测试完成 区分登录 / 未登录两种状态校验页面渲染、弹窗跳转逻辑
博客详情模块 访客浏览、本人博客编辑重发、权限拦截 07.01 0.2d 07.01 测试完成 区分他人 / 本人博客操作权限,处理高频异常弹窗
博客编辑模块 多入口打开页面、表单提交、空内容校验 07.01 0.2d 07.01 测试完成 覆盖登录 / 未登录两种状态,标题、富文本完整编辑流程
自动化回归 四大核心页面自动化脚本开发调试 07.01 0.2d 07.01 测试完成 Python+Selenium PO 分层自动化框架,封装通用工具类

三、测试分类

(一)自动化功能测试

博客系统测试

博客系统未登录情况下提交博客测试

1. 编写 Web 测试用例

登陆界面详细完成用例:

2. 搭建 Python 自动化项目

2.1 环境配置准备
  1. Python3 环境安装,通过 pip 安装 selenium、webdriver-manager 依赖包;
  2. 配置 Chrome 浏览器驱动,使用 WebDriverManager 自动匹配浏览器版本,无需手动配置驱动文件;
  3. 项目目录分层:comm 公共工具层、tests 页面测试用例层,实现代码解耦复用;
  4. 导入 Selenium 核心组件:WebDriverWait 显式等待、ActionChains 键盘操作、By 元素定位、EC 预期条件类。
2.2 封装公共驱动对象

Utils为工具类,用来封装上述方法:driver,统一等待、截图、点击工具方法

python 复制代码
import datetime
import os
import sys
import time

from selenium import webdriver
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager


class Driver:
    driver = ""
    def __init__(self):
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
        self.driver.implicitly_wait(5)
        self.driver.maximize_window()

    # 登录页面弹窗+获取弹窗文本+关闭弹窗
    def HandleLoginAlert(self):
        for _ in range(10):  # 强制清10次,弹多少清多少
            try:
                alert = self.driver.switch_to.alert
                print("关闭弹窗:", alert.text)
                alert.accept()
                time.sleep(0.1)
            except NoAlertPresentException:
                break

    # 公共获取用户名
    def get_name(self):
            return "zhangsan"

    def getScreeShot(self):
        # 创建屏幕截图
        # 图片文件名称:./2024-05-08-173456.png
        dirname = datetime.datetime.now().strftime("%Y-%m-%d")
        # 判断dirname文件夹是否已经存在,若不存在则创建文件夹
        if not os.path.exists("../images/" + dirname):
            os.mkdir("../images/" + dirname)
        # 图片路径:../images/调用方法-2024-05-08/2024-05-08-173456.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()
2.3 分模块编写 tests 测试用例

此处仅放置博客详情页代码作为展示:

python 复制代码
# 博客详情页
import time
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from comm.Utils import BlogDriver

class BlogDetailPageTest():
    url = ""
    driver = ""
    def __init__(self):
        self.driver = BlogDriver.driver
        self.url = "http://47.108.157.13:8090/blog_list.html"
        self.driver.get(self.url)
        BlogDriver.HandleLoginAlert()
        time.sleep(2)
    # 查看他人博客
    def ViewOtherBlog(self):
        # 打开一篇其他用户的博客
        BlogDriver.HandleLoginAlert()
        path = '//div[@class="title" and text()="7.1"]/following-sibling::a[@class="detail"]'
        self.driver.find_element(By.XPATH,path).click()
        time.sleep(2)

        self.driver.back()
        time.sleep(2)
    # 查看本人博客
    def viewSelfBlog(self):
        BlogDriver.HandleLoginAlert()
        my_path = '//div[@class="title" and text()="7.1 自动化test"]/following-sibling::a[@class="detail"]'
        self.driver.find_element(By.XPATH,my_path).click()
        time.sleep(2)
        wait = WebDriverWait(self.driver, 10)
        BlogDriver.HandleLoginAlert()
        # 进入编辑页面
        self.driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div/div[4]/button[1]').click()
        wait = WebDriverWait(self.driver, 15)

        pre_xpath = '//*[@id="editor"]/div[1]/div[6]/div[1]/div/div/div/div[5]/div/pre'
        # 等待pre可点击
        edit_pre = wait.until(EC.element_to_be_clickable((By.XPATH, pre_xpath)))

        # 1. 点击激活输入框
        editor_element = self.driver.find_element(By.XPATH,'//*[@id="editor"]/div[1]/div[6]/div[1]/div/div/div/div[5]/div/pre')
        editor_element.click()
        time.sleep(0.5)

        # 2. 使用 ActionChains 执行 Ctrl+A 全选
        actions = ActionChains(self.driver)
        actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
        time.sleep(0.3)

        # 3. 删除选中内容
        actions = ActionChains(self.driver)
        actions.send_keys(Keys.DELETE).perform()
        time.sleep(0.3)

        # 4. 输入新博客内容
        actions = ActionChains(self.driver)
        actions.send_keys("这里测试博客编辑内容").perform()
        time.sleep(2)

        # 5. 点击保存
        editor = self.driver.find_element(By.XPATH,'//*[@id="submit"]')
        editor.click()
        time.sleep(0.5)

        BlogDriver.HandleLoginAlert()
        time.sleep(0.5)
        BlogDriver.HandleLoginAlert()
        BlogDriver.getScreeShot()

具体代码链接:BlogAutoTest: 这是我的博客系统自动化测试项目 - Gitee.com

所有模块测试用例通过 RunTest.py 批量执行

2.4 自动化执行过程中发现的业务缺陷
  1. 博客详情页面弹窗缺陷(BlogDetailPageTest):打开任意博客详情页时,频繁弹出无关弹窗 "1",遮挡编辑、返回按钮,每一步操作前都需要重复调用弹窗处理方法,脚本稳定性差;
  2. 博客编辑页面性能缺陷(BlogEditPageTest.UnLoginShowCheck):未登录状态直接访问编辑页面渲染速度极慢,页面长时间空白,DOM 表单元素加载延迟,极易出现元素定位超时报错;

自动化执行结果:总用例 8 条,正常通过 6 条,2 条偶发执行失败,失败原因为弹窗干扰、页面加载超时

(二)性能测试

1. 模拟并发访问项目事务各页面

4 个接口,每个接口 150 样本

  • 响应时间长,吞吐量小或相对稳定,可能系统达到了性能瓶颈
  • 响应时间短,吞吐量大,性能越好
  • 总样本 600 条,全部接口异常率 0%,无报错、无接口失败,功能可用性达标

通过观察线程响应图,发现最后有一个线程没有退出

分析一下聚合列表推测核心原因:

  • 博客列表接口查询耗时极长(最高 94 秒),该线程卡在等待接口返回

通过Jmeter生成的报告可以得出:

  • 150 并发压力下所有接口无报错,业务逻辑健壮,不存在并发锁、数据库崩溃、服务宕机问题;
  • 博客列表页为系统最大性能瓶颈未做分页、数据一次性全量查询返回,数据量大导致数据库查询、前端渲染耗时爆炸,并发越高等待越久,最高等待 94 秒,完全无法满足用户使用;
  • 登录、博客详情页面响应时间过长平均耗时 10~20 秒,99% 用户请求需要等待 30 秒左右,用户体验极差;
  • 系统整体吞吐量极低全部接口合计每秒仅处理 6 个请求,并发承载能力弱,少量用户同时访问就会出现长时间加载;
  • 负载越高性能衰减越明显并发 150 稳定运行时,列表页耗时持续上涨,存在数据库查询无索引、内存未缓存、循环查询等性能损耗累积问题。

但若直接提升并发至 200,会再次出现超时、响应雪崩问题

2. 高并发下系统产生的问题观测与验证

  1. 总样本 800,**博客列表页 200 样本产生 3 条报错,**并发上升,列表一次性返回海量数据,传输体量过大,超出缓冲区限制,直接触发数据截断报错;同时响应时间飙升至几十秒,吞吐量仅 1.58,系统处理能力严重不足
  2. 高并发下服务端分片 / 缓冲区配置不足以承载列表超大返回报文,TCP 传输过程中数据块截断,出现非 HTTP 类异常,低并发时不会触发,只有加压后才暴露传输缺陷
  3. 列表页在并发升高时同时出现超时卡顿 + 数据传输失败,验证列表未做分页、缓存、数据压缩优化

小幅提升并发就出现业务报错,说明现有架构、数据库查询、前端接口传输逻辑无法支撑多用户同时查看博客列表,线上流量一涨就会出现功能异常

当并发增加到每个接口350时

  • 博客列表是致命性能瓶颈,因未做分页,一次性拉取全量数据,出现响应持续飙升、吞吐量持续下降、数据截断报错;后端线程、数据库连接池被慢查询耗尽,大量请求阻塞,JMeter 线程卡死残留;登录、详情、新增接口读写性能正常,仅列表查询承压能力极差

四、遗留风险

  1. 博客列表页存在严重性能瓶颈,高并发响应极慢且出现数据截断报错,未做分页、缓存优化,线上高峰期易加载失败;
  2. 前端页面缺陷未修复:博客详情页高频弹出无关弹窗 "1" 干扰操作;
  3. 自动化脚本依赖 DOM 结构,无定时 CI 执行,维护与回归效率低;
  4. 后续补充极限并发、长时间稳定性压测

五、测试结果评估

  1. 基础功能正常,低并发下业务流程无阻断缺陷,可临时上线;
  2. 自动化脚本覆盖全核心页面,可用于迭代冒烟,但受弹窗、页面加载慢问题影响,脚本稳定性一般;
  3. 系统并发承载能力差,博客列表是致命短板,高流量会严重影响用户体验甚至报错;
  4. 上线前需优先优化列表分页、缓存、报文压缩,同步修复弹窗、页面渲染慢问题;后续补充全链路自动化与极限性能测试。