我的博文天地测试报告
我的博文天地测试报告
文章目录
- 我的博文天地测试报告
- 一.项目背景
- 二.项目功能
- 2.1 功能介绍
- 三.测试分类
- 3.1 功能测试
- 3.1.1 测试用例
- 3.1.2 实际执行测试的部分操作步骤/结果的截图
- 3.2 自动化测试
- 3.3 性能测试
- 3.1.2 用户登录
- jmeter性能测试结果
- 性能测试遇到的困难
- 3.4 性能测试报告
- 在index.html中查看性能报告
- 四.项目总结
一.项目背景
本项目旨在开发一个简单的个人博客系统,通过这个自己的系统来管理掌握的知识,使其能够有效的进行归纳。本项目采用前后端分离的方式实现,并借助数据库存储相关数据,最终将系统部署到云服务器上。前端主要由登录页、列表页、详情页、编辑页和注册页这五个页面构成,通过与后端结合,实现了以下主要功能。
二.项目功能
该个人博客系统主要实现了以下几个功能:登录、注册、写博客、博客详情、编辑博客、搜索博客以及删除博客等功能。
2.1 功能介绍
用户注册: 可以在这个页面通过输入用户名、电话号码、密码以及Github网址(可以选择不填写)注册一个新用户。在登录界面可以根据用户名以及密码进行登录。
用户登录: 可以在这个页面通过输入用户名、密码,输入正确的密码就可以登录进入博客列表页。其他情况会在下方显示对应的错误信息。在登录页面右上角存在主页、写博客和注册两个按钮,但是在未登录情况下点击"主页"和"写博客"均只会跳转到登录页面,只有点击"注册"时才会进入注册页面进行用户注册。
博客列表展示 : 可以在列表页查看所有的博客简介,其包括博客标题、发布时间以及内容概要。点击"查看全文"可以进入文章详情页查看文章详情。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销当前登录用户,回到登录页面。
博客详情展示: 在列表页面点击“查看全文"按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、注销三个功能。博客详情页左侧会显示当前文章这种的文章数以及分类数等模块。如果该博客还是当前登录用户发布的,则会在文章的最下面会有编辑和删除的两个按钮。点击"编辑"就会进入编辑页面进行博客内容的修改。 点击"删除"即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除并且不会在列表界面再次显示。
写博客: 在登录之后的任意界面均可以点击“写博客"之后就会进入写博客页面,此时就可以使用markdown用法进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。
编辑博客: 在博客详情页点击"编辑"按钮就会跳转到博客编辑页,此时就可以进行博客内容的修改。点击"更新文章"就可以进行博客的更新,此时就会跳转回博客列表页面。
搜索博客: 在博客列表页(主页)上方可以通过输入关键词,搜索出所有包含该关键词的博客简介,其包括博客标题、发布时间以及内容概要。
三.测试分类
3.1 功能测试
3.1.1 测试用例

3.1.2 实际执行测试的部分操作步骤/结果的截图
- 注册异常




2. 正常登录

-
写博客异常

-
写博客正常,发布成功并查看详情页


-
编辑博客
在上面的博客详情页中点击编辑,并修改博客标题

通过博客详情查看到刚才编辑的博客

-
删除博客

在博客详情页中点击删除


可看出刚才写的博客已经被删除了

- 注销
点击注销回到登录页面


3.2 自动化测试
自动化测试
3.3 性能测试
使用JMeter进行了简单的性能测试:对登录、编写博客、获取博客列表、获取用户信息、删除博客等功能进行了简单的性能测试。
- 创建Stepping Thread Group (需要添加插件 Custom Thread Groups) 并配置线程数等信息进行性能测试,配置如图。

- 添加事务控制器将这些接口统一视为一个事务进行性能测试。
- 添加HTTP信息头管理器将用户登录产生的jwtToken存入user_token中。实现提取登录接口返回值里的data数据,作为列表页接口的请求头信息。
- 添加HTTP请求默认值并配置测试接口的协议、IP、端口号和内容编码(UTF-8)。
- 添加监听器查看测试结果
- 添加聚合报告可以看到性能测试过程中整体的数据变化
- 添加Response Times Over Time来监听整个事务运行期间的响应时间
- 添加 Transactions per Second 来分析系统吞吐量。这个指标反映了系统同一时间内处理业务的最大能力。TPS值越高,说明系统的处理能力越强。
3.1.2 用户登录
- 设置HTTP请求为POST,路径为“/user/login”。
- 通过使用配置元件的CSV数据文件设置 ,从有多个用户名和密码的CSV文件中循环读取username和password。配置如下

- 添加JSON提取器将返回值信息中的data数据放进jwtToken中。
- 添加JSON断言,用来判断返回结果是否正确。
jmeter性能测试结果
测试进行中:

测试结果:
(1) 聚合报告:

(2)响应时间

分析:在图表中,不同操作的响应时间差异较大。例如,“博客列表页” 的响应时间波动较为明显,在某些时间点达到了较高的值,接近 540 毫秒。并且相对其他功能的响应时间要长很多,说明该接口还需要进行优化;而 “删除博客” 的响应时间相对较为平稳,但也有一定的波动。这说明系统在处理不同功能时的性能表现不一致,部分功能可能需要更多的优化以降低响应时间。
(3)吞吐量(每秒事务率)

分析:图表中可以看到,所有接口的吞吐量在测试过程中呈现出一定的波动,但整体保持在 20 - 45 个事务每秒之间。在还没开始结束线程的测试后期,吞吐量有所下降,可能是因为系统逐渐达到了其处理能力的极限,或者出现了资源瓶颈等问题。
性能测试遇到的困难
做压测时,并发一段时间后,会报java.net.BindException: Address already in use: connect
原因:
windows提供给TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收它们,就导致在短时间内跑大量的请求时将端口占满了,导致如上报错。
解决方法:
在jmeter所在机器下进行如下操作:
- cmd中输入regedit命令打开注册表
- 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters右键Parameters

- 添加一个新的DWORD,名字为MaxUserPort
- 然后双击MaxUserPort,输入数值数据为 65534 ,基数选择十进制
- 重启机器
3.4 性能测试报告
JMeter测试报告是一个全面而详细的文档,它提供了关于测试执行结果的详细信息,帮助用戶全面评 估系统的性能并进行性能优化。 生成性能测试报告的命令:
Jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录
-n : 无图形化运行
-t : 被运行的脚本
-l : 将运行信息写入日志文件,后缀为jtl的日志文件
-e : 生成测试报告
-o : 指定报告输出目录
注意:日志文件和目录可以不存在,若为已经存在的情况下需要保证内容为空,否则会出现错误!

(1)进入到存放上面测试(.jmx文件)的目录

(2 ) 输入如 Jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录 的指令进行性能测试并导出测试报告。

运行结束:

性能测试报告生成成功后,在PerformanceTestReport文件夹下将出现以下内容:

双击index.html即是性能测试报告
在index.html中查看性能报告
完整报告内容
响应时间:

响应时间分布:

四.项目总结
该项目的主功能均已通过测试,但是仍然存在下面缺陷:
- 博客列表页左侧用户模块中的“用户图片”和“分类”还没有实现。
- 博客列表页和搜索博客响应时间过长,需要优化其性能。
相关文章:
我的博文天地测试报告
我的博文天地测试报告 文章目录 我的博文天地测试报告 一.项目背景 二.项目功能 2.1 功能介绍 三.测试分类 3.1 功能测试 3.1.1 测试用例 3.1.2 实际执行测试的部分操作步骤/结果的截图 3.2 自动化测试 3.3 性能测试 3.1.2 用户登录 jmeter性能测试结果 性能测试遇到的困难 …...
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析 0 预览一 该文件功能`pdo_list.c` 文件功能函数预览二 函数功能介绍`pdo_list.c` 中主要函数的作用1. `ec_pdo_list_init`2. `ec_pdo_list_clear`3. `ec_pdo_list_clear_pdos`4. `ec_pdo_list_total_size`5. `ec_pdo_list_a…...
嵌入式开发神器:Buildroot的介绍和使用方法
目录 引言**Buildroot 能做什么?****1. 生成交叉编译工具链(Toolchain)****2. 生成嵌入式 Linux 根文件系统(RootFS)****3. 编译 Linux 内核和设备树文件****4. 编译 Bootloader(U-Boot)****5. …...
JavaScript系列(61)--边缘计算应用开发详解
JavaScript边缘计算应用开发详解 🌐 今天,让我们深入探讨JavaScript的边缘计算应用开发。边缘计算是一种将计算和数据存储分布到更靠近数据源的位置的架构模式,它能够提供更低的延迟和更好的实时性能。 边缘计算基础架构 🌟 &am…...
【LeetCode】day15 142.环形链表II
142. 环形链表 II - 力扣(LeetCode) 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…...
代理对象与目标对象
1. 定义:代理对象和目标对象 1.1 目标对象(Target Object) 目标对象是指 被增强的原始对象,即需要通过 AOP 切面(Aspect)增强功能的业务对象(原始类)。增强逻辑(Advice…...
【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
引言 我们之前了解了在不同场景下,Kubernetes中Pod之间的通信是如何路由的。 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信现在,我们来看看在集群中,Pod与服务之间的通信是如何…...
DNN(深度神经网络)近似 Lyapunov 函数
import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...
128陷阱
首先我们了解一下关于包装器类型 java是面向对象的语言,但基本类型并不是面向对象的,从而出现了包装器类型,并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非基本类型,它相当于将…...
PromptSource和LangChain哪个更好
目录 1. 设计目标与定位 PromptSource LangChain 2. 功能对比 3. 优缺点分析 PromptSource LangChain 4. 如何选择? 5. 总结 PromptSource 和 LangChain 是两个在自然语言处理(NLP)领域非常有用的工具,但它们的设计目标和…...
构成正方形的数量:算法深度剖析与实践
目录 引言算法核心概念 定义正方形的构成条件数据结构与输入形式算法数学原理 几何关系的数学表达坐标运算与判定逻辑Python 实现 代码展示代码解析Python 实现的优势与局限C 语言实现 代码展示代码解析C 语言实现的性能特点性能分析与优化 性能分析 时间复杂度空间复杂度优化思…...
Redis持久化-秒杀系统设计
在构建高性能、高可用的系统时,Redis 作为缓存和消息队列的角色越来越重要。在一些场景下,我们还需要将 Redis 的数据进行持久化,以确保数据的安全性和恢复能力。除此之外,秒杀系统也越来越成为电商、抢购等平台的核心功能之一。本…...
音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
一、引言 通过Wireshark可以抓取RTP数据包,该软件可以从Wireshark Go Deep 下载。 二、通过Wireshark抓取RTP数据包 首先通过FFmpeg将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -an -f rtp …...
OpenAI 实战进阶教程 - 第六节: OpenAI 与爬虫集成实现任务自动化
爬虫与 OpenAI 模型结合,不仅能高效地抓取并分析海量数据,还能通过 NLP 技术生成洞察、摘要,极大提高业务效率。以下是一些实际工作中具有较高价值的应用案例: 1. 电商价格监控与智能分析 应用场景: 电商企业需要监控…...
SpringUI Web高端动态交互元件库
Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合,旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍: 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…...
解密企业安全密码:密钥管理服务如何重塑数据保护?
在数字化时代,数据是企业最宝贵的资产之一。然而,随着网络威胁的不断升级和数据泄露事件的频繁发生,如何保护企业数据的安全已成为每个组织面临的紧迫问题。传统的安全措施往往无法应对复杂的威胁环境,密钥管理服务作为企业信息安…...
基于keepalived+GTID半同步主从复制的高可用MySQL集群
文章目录 项目架构图项目名称项目环境项目描述ip地址规划项目步骤一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。1、关闭firewalld2.关闭seLinux3.配置每台主机静态ip地址4…...
图片PDF区域信息批量提取至Excel,基于QT和阿里云api的实现方案
办公文档处理:在企业日常办公中,经常会遇到大量的扫描文档(如发票、合同、报表等)以图片或 PDF 格式存储。需要将这些文档中的特定区域信息(如发票金额、合同条款、报表数据等)提取出来,整理到 …...
Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…...
从零手写Spring IoC容器(二):bean的定义与注册
从零手写Spring IoC容器(二):bean的定义与注册 一. 回顾简单容器的不足之处 在第一章中,我们实现了一个最简单的 IoC 容器,但该版本存在诸多不足,例如: Bean 的管理方式过于简单,…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
