目录
[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 已实现的主要功能包括
- 用户登录:支持正确账号密码登录、错误账号 / 空密码异常拦截弹窗提示;
- 博客列表主页:区分未登录 / 登录两种状态,未登录访问自动弹窗并跳转登录页;登录成功展示个人信息、导航菜单、博客列表三大模块;
- 博客详情页:登录用户可查看他人博客仅浏览;查看本人博客可跳转编辑页面,修改内容后重新发布;
- 博客编辑页:支持直接链接访问、列表 / 详情页跳转进入;区分未登录、登录两种状态,支持标题 + 富文本正文编辑、提交发布;未登录提交触发登录拦截弹窗;
- 基础权限控制:未登录用户无法提交发布博客,仅可打开编辑页面填写内容
2.2 当前系统存在的不足
- 页面异常弹窗缺陷:打开博客详情页会高频弹出无关弹窗 "1",遮挡操作按钮,干扰用户操作与自动化脚本执行;
- 页面加载性能缺陷:未登录状态直接访问博客编辑页面,页面渲染速度极慢,长时间空白后才加载表单元素;
- 交互提示不完善:未登录填写完整博客内容点击提交,仅弹出简易弹窗,无清晰文字引导用户登录;
- 前端 DOM 结构不稳定:大量页面元素依靠绝对 XPath 定位,前端微调页面布局会直接导致操作失效;
- 无自动化持续集成机制,每次版本更新只能本地手动执行回归脚本。
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 环境配置准备
- Python3 环境安装,通过 pip 安装 selenium、webdriver-manager 依赖包;
- 配置 Chrome 浏览器驱动,使用 WebDriverManager 自动匹配浏览器版本,无需手动配置驱动文件;
- 项目目录分层:comm 公共工具层、tests 页面测试用例层,实现代码解耦复用;
- 导入 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 自动化执行过程中发现的业务缺陷
- 博客详情页面弹窗缺陷(BlogDetailPageTest):打开任意博客详情页时,频繁弹出无关弹窗 "1",遮挡编辑、返回按钮,每一步操作前都需要重复调用弹窗处理方法,脚本稳定性差;
- 博客编辑页面性能缺陷(BlogEditPageTest.UnLoginShowCheck):未登录状态直接访问编辑页面渲染速度极慢,页面长时间空白,DOM 表单元素加载延迟,极易出现元素定位超时报错;
自动化执行结果:总用例 8 条,正常通过 6 条,2 条偶发执行失败,失败原因为弹窗干扰、页面加载超时
(二)性能测试
1. 模拟并发访问项目事务各页面
4 个接口,每个接口 150 样本



- 响应时间长,吞吐量小或相对稳定,可能系统达到了性能瓶颈
- 响应时间短,吞吐量大,性能越好
- 总样本 600 条,全部接口异常率 0%,无报错、无接口失败,功能可用性达标
通过观察线程响应图,发现最后有一个线程没有退出
分析一下聚合列表推测核心原因:
- 博客列表接口查询耗时极长(最高 94 秒),该线程卡在等待接口返回

通过Jmeter生成的报告可以得出:
- 150 并发压力下所有接口无报错,业务逻辑健壮,不存在并发锁、数据库崩溃、服务宕机问题;
- 博客列表页为系统最大性能瓶颈未做分页、数据一次性全量查询返回,数据量大导致数据库查询、前端渲染耗时爆炸,并发越高等待越久,最高等待 94 秒,完全无法满足用户使用;
- 登录、博客详情页面响应时间过长平均耗时 10~20 秒,99% 用户请求需要等待 30 秒左右,用户体验极差;
- 系统整体吞吐量极低全部接口合计每秒仅处理 6 个请求,并发承载能力弱,少量用户同时访问就会出现长时间加载;
- 负载越高性能衰减越明显并发 150 稳定运行时,列表页耗时持续上涨,存在数据库查询无索引、内存未缓存、循环查询等性能损耗累积问题。
但若直接提升并发至 200,会再次出现超时、响应雪崩问题
2. 高并发下系统产生的问题观测与验证
- 总样本 800,**博客列表页 200 样本产生 3 条报错,**并发上升,列表一次性返回海量数据,传输体量过大,超出缓冲区限制,直接触发数据截断报错;同时响应时间飙升至几十秒,吞吐量仅 1.58,系统处理能力严重不足
- 高并发下服务端分片 / 缓冲区配置不足以承载列表超大返回报文,TCP 传输过程中数据块截断,出现非 HTTP 类异常,低并发时不会触发,只有加压后才暴露传输缺陷
- 列表页在并发升高时同时出现超时卡顿 + 数据传输失败,验证列表未做分页、缓存、数据压缩优化
小幅提升并发就出现业务报错,说明现有架构、数据库查询、前端接口传输逻辑无法支撑多用户同时查看博客列表,线上流量一涨就会出现功能异常

当并发增加到每个接口350时
- 博客列表是致命性能瓶颈,因未做分页,一次性拉取全量数据,出现响应持续飙升、吞吐量持续下降、数据截断报错;后端线程、数据库连接池被慢查询耗尽,大量请求阻塞,JMeter 线程卡死残留;登录、详情、新增接口读写性能正常,仅列表查询承压能力极差
四、遗留风险
- 博客列表页存在严重性能瓶颈,高并发响应极慢且出现数据截断报错,未做分页、缓存优化,线上高峰期易加载失败;
- 前端页面缺陷未修复:博客详情页高频弹出无关弹窗 "1" 干扰操作;
- 自动化脚本依赖 DOM 结构,无定时 CI 执行,维护与回归效率低;
- 后续补充极限并发、长时间稳定性压测
五、测试结果评估
- 基础功能正常,低并发下业务流程无阻断缺陷,可临时上线;
- 自动化脚本覆盖全核心页面,可用于迭代冒烟,但受弹窗、页面加载慢问题影响,脚本稳定性一般;
- 系统并发承载能力差,博客列表是致命短板,高流量会严重影响用户体验甚至报错;
- 上线前需优先优化列表分页、缓存、报文压缩,同步修复弹窗、页面渲染慢问题;后续补充全链路自动化与极限性能测试。