一.项目背景
本项目实现了一个基于前后端分离架构的轻量型个人博客系统,系统主要向用户提供一个可以发表博客的网站。系统涵盖主要包括了基础登录页,博客首页,博客详情页,发表博客页,文章删除以及注销等完整业务链路。技术上采用前后端分离的方法实现,同时简单用了一下mysql存储用于记录博客系统的记录。该系统没有设计用户注册功能,只有提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面运行的时候已经将头像图片设为静态。用户信息中的文章树以及分类数也没有在后端中具体实现,直接在前端页面中写为静态。该系统的个人功能主要包括可以实现个人用户的登录,简单的博客记录,时间,标题,内容以及发布者进行详情查看。
二.项目功能
该博客系统主要实现了以下几个功能:登录,注销,写博客,删除博客,查看详情页等功能
1.登录功能:用户名以及密码写入后端数据库中,该系统无注册功能,用户名以及密码是已经存在的,登录成功之后就会跳转到博客的list首页,在右上角存在主页和写博客两个按钮,但是在未登录情况下均只会跳转到登录页面

2.list博客首页:可以在列表页查看有限数量博客简洁,其中包括博客标题,发布时间以及内容概要。在左侧可以看到登录的用户以及文章数,分类树等模块。在右上角有主页,写博客和注销三个功能:列表主页即列表页,写博客即博客编辑页,注销就是退出登录,回到登录页面

3.博客详情页:在列表页面点击查看全文按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页,写博客,注销三个功能,而博客详情页特有的2个功能主要包括博客的重新编辑与删除两个功能。删除就删除该篇博客,删除之后就会跳转到博客的list首页,该篇博客就被重新删除了。

4.博客编写页面

博客添加页面主要采用了经典的"左编辑,右预览"分栏布局,主要集成了Markdown编辑器与实时解析功能。
顶部操作区设有文章标题输入框与发布文章按钮,方便用户在编辑完成后一键提交数据。快捷工作栏提供丰富的文本操作按钮(如加粗,斜体,引用,标题层级,列表,插入代码块,图片及表格等),降低用户的排版门槛。
Markdown编辑于实时预览:左侧支持原生Markdown语法输入(如截图中##标题语法),右侧同步渲染出最终的网页展示效果,实现了所见即所得的编写体验。
UI设计:编辑器整体采用毛玻璃半透明效果覆于背景图之上,在保证功能性的同时,提升了页面视觉美观度与沉浸感。
三.测试计划
本次测试针对个人博客系统的核心业务链路层展开,测试范围主要覆盖登录界面,博客首页,博客详情页,博客编辑页等核心模块(注:删除与注销功能在系统中存在,但是本次自动化用例设计重点聚焦于图中的四大分支)。未实现的用户注册,自定义头像以及后端动态文章树/分类数不纳入本次功能测试范围。
测试策略以黑盒功能测试为主线,辅以UI自动化回归,梯度性能验证和弱网稳定性检查,测试用例具体见下图

在功能与UI自动化层面:
登录模块:采用等价类划分与边界值方法,设计正常的登录(正确账号密码)与三种异常登录(账号错密码错,账号错密码对,账号对密码错)的校验用例,验证系统的鉴权逻辑。
首页与详情页:重点验证了登录状态下个人信息(头像,分类,文章)与博客列表(标题,时间,内容)的正常渲染,同时设计了未登录状态下的异常场景,验证访问受限时是否会触发警告弹窗,个人信息展示及列表置空机制。
博客编辑模块:覆盖了正常发布链路(输入标题内容并点击发布),以及异常阻断场景(不写标题,不写内容等缺少参数时的发布失败处理),并对页面核心元素(输入框,发布按钮)进行检查。
基于上述设计,项目使用Selenium WebDriver提取思维导图中核心用例(登录------>发布------>详情查看)编写自动化脚本进行稳定链路回归。此外:
性能测试层面使用Jmeter工具,采用Stepping Thread Group(梯度线程组)策略。计划模拟并发用户数从0开始逐步递增(最高并发数预设在40左右),持续运行约4分钟。压测范围覆盖登录页,列表页,详情页,添加博客页以及用户信息接口,以观察系统在不同压力梯度下吞吐量(TPS)与响应时间(RT)的变化趋势,从而寻找系统的性能瓶颈拐点。
弱网层面:使用Fiddler的Simulate Modem Speeds功能模拟低带宽高延迟环境,检查博客发布与页面加载在受限网路下的表现。
四.测试工具
UI自动化测试:Selenium(Web自动化框架) 版本4.8
性能与接口压测:Apache JMeter 版本5.6.3
接口调试与验证:Postman 版本1.83.1
抓包与弱网测试:Fiddler 版本 5.0.20262.6151 (Fiddler Classic)
测试与脚本开发IDE:PyCharm 版本2026.2.3
自动化脚本编写语言:python 版本3.12.2
前端测试与驱动浏览器:Google Chrome 版本 134.0.6998.89
五.涉及到的测试动作/类型
功能测试,性能测试,自动化测试
1.功能测试:本次功能采用黑盒测试方法(等价类,边界值等),直接在浏览器环境下进行人工验证,覆盖一下模块:
登录模块:覆盖正常登录(正确账号密码),异常登录(账号密码均错,账号错密码对,账号对密码错)。
博客首页与详情模块:覆盖登录状态下个人信息及博客列表的展示,点击查看详情,以及未登录状态下的访问拦截(如触发警告弹窗,列表置空)
博客发表模块:覆盖正常发布(输入标题内容点击发布),异常发布(缺少标题,缺少内容导致の的发布失败)
文章删除与注销:覆盖删除确认及注销后的页面跳转
2.自动化测试(Selenium+python)
采用Python+Selenium WebDriver 编写UI自动化脚本,实现模块化设计(如BlogLoginTest,BlogDetailTest等)。通过RunTest.py统一调度入口,实现了登录------>首页列表校验------>详情页校验的核心机制正向链路自动化回归。脚本引入WebDriver显式等待与try...finally异常资源释放机制,提升了脚本的稳定性。
3.性能测试(Apache JMeter)
使用JMeter采用Stepping Thread Group策略,模拟0-40的并发用户逐步递增。压测覆盖了登录,博客首页,列表,详情,添加博客等6个核心接口。重点观察系统在不同压力梯度下的TPS与响应时间变化,成功定位了高并发下的性能瓶颈(超时及401鉴权异常)并给出了数据优化建议。
4.弱网与抓包测试(Fiddler)
使用Fiddler工具进行接口抓包分析,并利用Simulate Modem Speeds功能模拟低带宽,高延迟弱网环境。验证在弱网状态下,博客首页图片及列表数据的加载表现,确认前端具备一定的容错加载能力,未出现白屏。
执行结果与缺陷记录
共执行测试用例 条,通过 条 ,失败 条, 发现有效Bug共多少个
六.功能测试
1.登录界面
1.1正常登录与异常登录页面对比
(1)正常登录展示

(2)异常登录页面展示



1.2预期结果与实际结果的对比

2.博客首页
2.1 登录状态下和未登录状态下页面对比
(1)登录状态下博客首页及个人信息展示

(2)未登录状态下博客首页以及个人信息展示

2.2预期结果与实际结果
(1)登录状态下
测试点:验证个人信息(头像,昵称,分类,文章数)及博客列表(标题,时间,内容,查看详情按钮)是否正常展示
实际结果:页面渲染正常,各项数据与数据库记录一致,符合预期
(2)未登录状态下:
测试点:验证未登录直接访问首页时,系统是否进行拦截
实际结果:系统成功弹窗警告"用户未登录,即将跳转到登录页",且背后的博客列表清空,个人信息隐藏,拦截机制正常
3.博客详情页
3.1登录状态和未登录状态下的页面对比
(1)登录状态下

(2)未登录状态下

3.2预期结果与实际结果对比
(1)登录状态下的详情展示与操作
测试场景:已登陆用户点击博客列表中的"查看全文"进入详情页
预期结果:页面应完整展示博客的标题,发表时间,正文内容,左侧正常显示当前用户的个人信息,且页面下方应出现编辑和删除操作按钮
实际结果:进入详情页后,标题(1111),时间(2026-11-05 21:03)及内容均正确渲染,左下角成功显示编辑与删除按钮,与预期一致。
(2)未登录状态下的访问拦截
测试场景:在未登录状态下(或登录状态已过期),直接访问博客详情页或点击详情页链接
预期结果:系统应进行拦截,弹出提示框告知用户未登录,并组织用户查看详情内容。
实际结果:页面触发遮罩层,弹出警告框提示"用户未登录,即将跳转到登录页,拦截机制生效,与预期一致。
4.博客编辑页
4.1正常发布博客
(1)登录状态下正常发布博客------输入标题和内容,点击发布按钮

4.2异常发布博客
(1)不写标题,点击发布,缺少参数,发布失败

(2)不写内容,点击发布,缺少参数,发布失败

4.3页面元素检查
(1)点击发布按钮

(2)博客标题输入框

(3)博客内容输入区域

4.4预期结果与实际结果对比

七.自动化测试
本项目自动化测试基于Python+Selenium WebDriver原生编写。为了提高代码的维护性和执行效率,测试脚本采用模块化设计。
1.业务分离与封装:底层驱动初始化,通用方法装在common/Utils.py包中;按业务模块(登录,列表,详情,编辑)将测试逻辑封装在tests/目录下的独立类中。
2.测试套件(Test Suite)统一调度:通过RunTest.py作为统一入口,按业务流顺序(先登录------>再执行列表/详情/发布测试)依次实例化测试类并调用测试方法,实现主链路的连贯执行。
3.异常处理与资源释放:在脚本执行入口中引入try...finally异常处理结构,确保即使测试中途发生异常报错,也能在finally块中执行driver.quit()自动关闭浏览器,避免进程残留和内存泄露。
思维导图:

4.测试覆盖范围与执行链路
(1)登录模块:验证正常账号密码登录成功,以及三种异常场景(账号密码均错,账号错,密码错)的拦截





(2)首页模块(BloginListTest):验证登录状态下的个人信息与博客列表加载,以及未登录状态下的警告弹窗拦截。



(3)详情模块(BlogDetailTest):验证详情页标题,时间,内容的正确渲染
测试场景:在验证登录状态下,博客详情页的数据加载与元素渲染是否正常
操作步骤:由于详情页依赖特定的博客ID,脚本采用直接拼接携带blogId参数的URL的方式直达目标页面
预期结果:页面能正常加载,且博客的标题,发表时间,正文内容等核心数据准确无误地展示在页面上
核心脚本实现:
(1)显示等待增强稳定性:考虑到详情页可能存在背景图或接口请求延迟,脚本引入了WebDriverWait,设定了最长10秒的等待时间,直到时间戳元素(.date)出现后才开始断言,有效避免了因页面未加载完导致的定位失败。
(2)多元素定位校验:综合使用了CSS选择器和XPath定位方式,分别对标题,时间,正文详情区域进行了存在性校验。
(3)异常捕获与留证:采用try...except结构包裹测试逻辑,若出现元素找不到等异常,会打印错误信息,执行成功后会自动调用底层封装好的getScreenShot()方法保存当前页面截图,便于后续追溯。
3.执行结果与断言分析
执行结果:脚本运行通过,控制台成功打印"页面加载完成"与详情页元素检查通过
断言校验:成功定位到标题元素(XPath),发布时间(.date)详情内容(#detail),证明后端数据成功返回并渲染至前端,该模块自动化测试执行通过。




(4)编辑模块(BlogEditTest):验证正常发布(输入标题内容),异常发布(缺标题,缺内容)以及页面元素检查
1.针对博客编辑页,除了正向发布,系统对必填参数的校验至关重要。本脚本主要验证"缺少必填参数时的系统拦截机制"。
脚本执行逻辑:
前置条件:保持登录状态进入编辑页。
操作步骤:不输入任何标题和正文,直接定位并点击"发布文章"按钮
预期结果:系统应触发拦截,弹出参数校验失败相关提示,且页面不跳转。
测试结果与局限性说明
执行结果:脚本成功触发发布动作。截图显示系统成功拦截了空参数提交,验证了前端校验逻辑的有效性
局限性说明:由于本项目博客正文采用了Markdown文本编辑器(存在复杂的DOM嵌套或iframe),直接使用Selenium的send_key()无法有效性编辑区注入文本。因此,针对正常输入并成功发布的完整正向链路,目前依赖于前期的手工功能测试,自动化脚本暂只覆盖参数拦截与页面元素加载。



8.性能测试
(1)测试场景与执行说明
本次性能测试使用Apache Jmeter工具,采用Stepping Thread Group(梯度线程组)策略。测试于2026.11.5 20:58开始,持续约5分钟。模拟并发用户数从0逐步增至40,压测范围覆盖了登录页,博客首页,列表页,详情页,添加博客以及用户信息共6个核心接口,重点观察系统在不同压力梯度下的吞吐量与响应时间变化。
(2)核心性能指标分析
1.整体吞吐量与响应情况
根据Statistics聚合报告,系统总计发起1497次请求,整体平均吞吐量(Throughput)约为6.06Transactions/sec。系统整体平均响应时间为4159.07ms。但是在高并发阶段,响应时间出现明显恶化,90%的请求响应时间超过了10秒(90th pct=10091ms),说明系统处理能力存在严重瓶颈。
2.错误率与失败定界
整体请求错误率高达42.28%。结合错误统计表,主要暴露出两类问题
(1)Non HTTP response code: java.net.SocketTimeoutException/Non HTTP response message: Read timed out(占比65.72%):在并发增加时(如列表页错误率高达86%),后端服务或Mysql数据库处理发生阻塞,导致大量请求读取超时。

(2)401 Unauthorized(占比34.12%):集中在首页和详情页接口。推测是压测脚本在模拟并发时,由HTTP Cookie管理器或Token关联传递,导致部分虚拟用户丢失登录状态,或者服务端鉴权组件在并发处理异常。

3.系统性能拐点
通过响应时间变化折线图可以看出,在测试前2分钟(并发较低时),响应时间保持在较低水平,当并发线程数达到峰值(30-40区间)时,曲线呈指数级飙射,部分接口响应时间突破30秒。判定系统当前性能拐点约在20-30并发之间。

(3)性能调优建议:
1.数据库层面:排查慢SQL,对文章查询,用户查询相关的表字段(如userId,create_time)建立索引;适当调整Mysql的最大连接数,防止连接池耗尽
2.脚本层面:优化JMeter脚本,完善HTTP Cookie Manager 配置,确保多线程并发时每个用户的Session相互隔离且正确传递,以解决401报错问题
3.代码层面:对于首页文章列表等高频度读取接口,可引入Redis缓存,降低数据直接查询压力。
9.弱网测试(Fiddler抓包与模拟)
(1)测试目的
验证博客系统在网络带宽受限,延迟较高(如弱网环境)下的页面加载表现与核心业务交互稳定性
(2)测试操作步骤
1.开启Fiddler抓包工具,在Chrome浏览器中访问博客系统
2.在Fiddler菜单栏依次点击Rules------>Performance------>勾选Simulate Modem Speeds(模拟调制解调器)来限制网速。
3.在系统执行进入首页,发布博客等操作
4.观察并记录页面加载状态,接口请求响应时间

看左侧列表5,6,8,9 ,Host都是47.108.157.13:8090
第5行:/user/login(执行了登录操作)
第8/9行:/blog/getList(获取博客列表数据)
第37行:/blog/addBlog(执行发布博客操作)
前后端分离架构在正常运转,接口调用正确
8,9行的数据量高达189317字节,而普通登录接口只有215字节,说明博客列表接口一次性返回了非常多的数据(可能是没做分页,把全部文章联通Markdown源码一起返回了)。这也就是为什么之前用JMeter做压测的时候,列表页响应时间长,容易超时的原因之一。

注:为保证测试结果的准确性,建议在执行抓包时清理浏览器后台无关标签页,减少噪音数据干扰。
(3)测试结果分析
页面表现:开启弱网模拟后,登录博客首页,可以明显感受到页面背景图(猫咪图片)以及博客内容加载缓慢,博客列表内容呈现自上而下的逐行渲染效果。
接口表现:通过Fiddler观察接口耗时,blog/getList等接口的响应时间显著延长,但系统前端表现出较好的容错性,页面为出现直接崩溃或白屏,加载完成后数据能正常显示
交互表现:在弱网点击下发布博客,请求时间还算正常,但是当查看成功发表的内容的时候,页面会有短暂的等待,但是最终仍能成功提交并看到发表内容。
(4)总结及建议
在开启Simulate Modem Speeds后,模拟用户操作。Fiddler成功捕获到/user/login ,/blog/getList和/blog/addBlog接口。经观察,在弱网状态下,获取列表接口(数据量约185KB)耗时显著增加,导致页面加载明显卡顿,但最终请求均返回200,业务未崩溃。
通过Fiddler抓包分析系统接口,验证了前后端数据交互的正确性。同时发现:/blog/getList接口单次返回数据量高达189KB,存在一次性拉取全量数据的隐患,这也导致性能测试中列表出现SocketTimeoutException的主要原因,建议后续后端引入分页查询机制,降低单次网络传输体积。
10.项目测试bug简述
本次测试共执行功能测试用例28条,自动化测试链路4大模块,性能压测接口6个
功能与自动化测试:通过28条,失败0条。核心也不链路(登录-查看首页-发布-详情-删除)流转顺畅
发现有效问题(Bug/优化项)共3个:
1.前后端数据不同步(前端静态数据写死):在成功发布新博客后,首页左侧的文章数未随实际发布数量动态递增。经合查,由于该系统为实现后端动态统计,前端直接写死了分类与文章数,导致数据失真。(严重程度:一般)
2.高并发下接口超时与鉴权失效(性能缺陷):在JMeter梯度压测下,系统整体错误率高达42.28%。尤其是在并发达到20-30时,大量blog/getList列表查询请求SocketTimeoutExceptoin(占比65.72%),且伴随部分请求因Token丢失包401鉴权异常。(严重程度:严重)
3.列表接口数据未分页导致体积过大(性能隐患):通过Fiddler抓包发现,/blog/getList接口单次返回的数据量高达189KB,存在一次性拉取全量数据的隐患,直接导致了弱网环境和压测环境下的页面加载卡顿。
11.测试结论
本次针对博客系统的测试共作已全部完成,涵盖了功能测试,UI自动化测试,性能压测以及弱网抓包测试。综合各项测试数据与缺陷记录,得出:
1.功能与业务链路:符合预期
经人工黑盒测试与Selenium自动化回归验证,系统核心业务链路(登录------>发布博客------>首页列表展示------>详情查看------>文章删除/注销)均能正常流转。系统的权限拦截(如未登录状态下的弹窗与数据隐藏)表现良好。本次共执行功能用例28条均通过。未发现阻碍主流程的严重级别bug。
2.自动化与工程质量:具备可维护性
基于Python+Selenium编写自动化测试脚本运行稳定,能够替代人工完成高频的正向业务回归。脚本采用模块化分层设计,并引入显式等待(WebDriver)与异常资源释放(try...finally)机制,展现了较好的代码健壮性与工程化思维。
3.性能与系统稳定性:存在明显瓶颈,需后续优化
在JMeter梯度压测下,系统在低并发(<10)时运行平稳;但当并发数上升至20-30区间时,系统响应时间呈指数级飙升,整体错误率达到42.28%。暴露出的核心问题包括:Mysql数据库查询阻塞导致大面积超时(SocketTimeout),以及并发环境下的Session丢失(401报错)。结合Fiddler抓包分析,确认列表接口(/blog/getList)单次返回高达189KB的数据且未做分页,是导致弱网卡顿与压测超时的核心元凶之一。
4.整体评价
本项目作为一款轻量型博客系统,在功能完整度与界面交互(如Markdown实时预览,毛玻璃UI)上表现优秀,满足日常个人记录与展示的需求。虽然在前端静态数据刷新同步,高并发处理上存在一定的局限性,但考虑到其轻量级,轻存储的架构定,当前状态完全可以支撑个人级/低并发场景下的正常使用。
5.改良建议
后端与数据库:为数据库高频查询字段建立索引,引入分页查询机制,降低单次接口的传输体积,针对鉴权模块排查并发下的Token校验异常。
前端与交互:优化首页文章数等静态数据,建议通过接口动态获取,针对大体积背景图片启用懒加载,增加弱网环境下的Loading提示,提升用户体验。
综上本系统核心功能均已实现且运行稳定,测试通过,具备结项条件。