博客项目测试报告

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • 一、项目背景
  • 二、项目功能
  • 三、测试计划
    • 一)功能测试
    • 二)自动化测试
    • 三)性能测试
      • 编写性能测试脚本
      • 创建测试场景(Controller)
      • 生成测试报告(Analysis)

一、项目背景

个人博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有 8 个页面构成:注册页,登录页,个人信息页,写博客页,博客详情页,修改博客页,博客列表页,个人博客列表页。其结合后端实现了以下的主要功能:注册、登录、查看个人信息及修改、写博客、修改博客、注销、删除博客、密码加盐、验证码校验、查看所有人博客、查看个人博客、博客列表分页、redis存储session、拦截器验证是否登录、博客评论等功能。

二、项目功能

1.注册功能:用户在输入用户名,密码,确认密码后。参数合法情况下注册成功,跳转到登录页。

2.登录功能:注册的用户名密码已经在后端写入了数据库。用户名,密码,验证码三者都校验成功后会跳转到个人博客列表页。登录失败会提示错误。

3.博客列表页:已登录用户和未登录用户都能看到所有人写的博客。支持分页功能。

4.评论功能:只有已登录用户才有查看评论和写评论权限。博客归属人有权删除自己博客下的评论。

5.修改博客功能:修改成功后会跳转到个人博客列表页

6.删除博客功能:删除博客成功后会刷新当前页面(个人博客列表页)

7.新增博客功能:新增博客成功后会刷新当前页面(个人博客列表页)

8.个人信息页:已登录用户可以查看自己的头像,昵称。同时有权修改头像,昵称,密码。

9.注销功能:注销成功后跳转到博客列表页。

10.文章详情页:显示文章标题,正文,作者,阅读量,发布时间,评论列表。左侧显示当前登录用户的信息(头像,昵称,文章总数)

11.个人博客列表页:已登录用户可以查看文章,修改文章,删除文章,写博客,个人中心,注销,查看所有人文章。

三、测试计划

一)功能测试

1.测试用例:

image-20230804165220238

2.实际执行测试的部分操作步骤/截图

1)正常登录

image-20230804172120256

登录成功后跳转到个人文章列表页。

image-20230804172224920

2)正常注册

image-20230804172444899

3)博客列表页

image-20230804172621204

查看某一篇文章详情:

image-20230804172741742

验证分页功能:

image-20230804172838967

image-20230804172904734

4)博客详情页

评论功能:

image-20230804173128282

image-20230804173147164

5)博客编辑页

image-20230804173710097

image-20230804173727567

回到个人列表页可以看到新发布的博客:

image-20230804174018143

6)个人资料页

修改头像:

image-20230804174427148

image-20230804174533777

二)自动化测试

自动化测试参考:

自动化测试

三)性能测试

我们使用三个工具针对我们的项目进行性能测试。

a)Virtual User Generator(简称VUG): 用来生成性能测试脚本。

b)Controller: 创建测试场景,运行和监控场景。

c)Analysis: 生成测试报告,分析性能测试结果

性能测试步骤:

a)访问博客登录页;

b)执行登录;

c)进入个人博客列表页.

编写性能测试脚本

1.创建项目

image-20230806111957665

操作步骤为:1.打开网页,2.输入账号密码验证码并登录;

在此期间,为了更好的让我们进行性能测试的数据收集,我们可以使用

事务: 衡量性能的重要指标,通过观察每秒事务通过数来衡量性能;
集合点: 让所有的虚拟用户执行到集合点时断在集合,满足条件后一起执行下一个步骤(保证每一个虚拟用户同时执行下一步);
参数化: 通过提供的数据源可以实现多个参数逐个执行;

Action()
{//开启事务1lr_start_transaction("index_trans");//1.访问登录页面web_url("login.html", "URL=http://8.130.106.169:8080/login.html", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", EXTRARES, "Url=/image/47e9aa94-f21c-4a75-84a8-54b8f7ff7b63.png", ENDITEM, "Url=/login.html", ENDITEM, LAST);lr_think_time(28);web_custom_request("getcode", "URL=http://8.130.106.169:8080/user/getcode", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://8.130.106.169:8080/login.html", "Snapshot=t8.inf", "Mode=HTML", "EncType=", LAST);/* Added by Async CodeGen.
ID=Poll_0
ScanType = RecordingThe following URLs are considered part of this conversation:http://8.130.106.169:8080/user/loginTODO - The following callbacks have been added to AsyncCallbacks.c.
Add your code to the callback implementations as necessary.Poll_0_RequestCBPoll_0_ResponseCB*/web_reg_async_attributes("ID=Poll_0", "Pattern=Poll", "URL=http://8.130.106.169:8080/user/login", "PollIntervalMs=9100", "RequestCB=Poll_0_RequestCB", "ResponseCB=Poll_0_ResponseCB", LAST);//登录的集合点lr_rendezvous("login_rendezvous");//开始事务2lr_start_transaction("login_trans");web_submit_data("login", "Action=http://8.130.106.169:8080/user/login", "Method=POST", "RecContentType=application/json", "Referer=http://8.130.106.169:8080/login.html", "Snapshot=t10.inf", "Mode=HTML", ITEMDATA, "Name=username", "Value={username}", ENDITEM, "Name=password", "Value=123", ENDITEM, "Name=checkCode", "Value=taqa6", ENDITEM, LAST);//结束事务2lr_end_transaction("login_trans", LR_AUTO);//结束事务1lr_end_transaction("index_trans", LR_AUTO);return 0;
}

参数化

支持输入多个账号

image-20230806114743505

image-20230806114905529

image-20230806114845455

image-20230806120054224

脚本测试通过。

分析日志:

image-20230806120023424

创建测试场景(Controller)

针对我们已经编写好的脚本打开controller工具,创建测试脚本

image-20230806120445968

image-20230806121240519

image-20230806121416885

image-20230806121539375

image-20230806121637341

image-20230806122658522

生成测试报告(Analysis)

在 controller 创建的场景中直接生成测试报告,如下:

image-20230806123910040

1.虚拟用户运行图:

image-20230806124043832

作用:通过显示的虚拟用户数量可以判断出哪个时间段服务器负载最大(上图00:40 ~ 01:40负载最大)。

2.点击数图(每秒点击率)

image-20230806124150593

作用:通过点击率可以判断出某时间段内服务器的负载。

3.吞吐量图

image-20230806124238070

问题一:为什么吞吐量图和点击数图相似,但是吞吐量图要滞后一点?

因为吞吐量表示的是响应返回的资源数量,肯定是先有请求再有返回。

问题二:如果请求变多但是吞吐量没变化,原因是什么?

服务器响应太慢,来不及反应;
压力没有到服务器;
服务器设计一定的阈值(到达阈值以后,虽然也收到了请求,但是服务器不会做任何处理),保证了服务器不会因为并发量过大而出现宕机的情况;

4.事务图

image-20230806124349548

5.平均事务响应时间图

image-20230806124446444

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 第一节 Vue3简介以及创建Vue3工程

1.Vue3简介以及Vue3带来了什么 2.创建Vue3.0工程并分析Vue3工程结构 3.setup函数 4.ref函数 5.reactive函数 一.Vue3简介以及Vue3带来了什么 ① Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王&#xff0…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录,CHANGELOG.md文件 github:https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…

IntelliJ IDEA 如何优雅的添加文档注释(附详细图解)

IntelliJ IDEA 如何优雅的添加文档注释(附详细图解) 📌提要✍✍类注释✍✍方法注释 📌提要 在开发过程中,最常用的注释有两种:类注释和方法注释,分别是为类和方法添加作者、日期、版本号、描述等…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去,在app.json里面配置 在你需要的 页面的 json里面配置,按需引入 然后看文档,再在你的 wxml里面使用就好了

2023年8月初补题

看这个人的专栏 https://blog.csdn.net/qq_42555009/category_8770183.html 有一定思维难度,贪心,用multiset实现 翻译: 链接:https://ac.nowcoder.com/acm/contest/33187/H 来源:牛客网 在夜之城的中心有一座高大…

JavaScript Es6 _1 笔记

JavaScript Es6 _1 笔记 学习作用域、变量提升、闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法,降低代码的冗余度。 理解作用域对程序执行的影响能够分析程序执行的作用域范围理解闭包本质,利用闭包…

协议,序列化,反序列化,Json

文章目录 协议序列化和反序列化网络计算器protocol.hppServer.hppServer.ccClient.hppClient.cclog.txt通过结果再次理解通信过程 Json效果 协议 协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚&#x…

选择排序(指针法)

描述 用选择法对10个整数排序。 输入 输入包含10个整数,用空格分隔。 输出 输出排序后的结果,用空格分隔。 输入样例 1 3 1 4 1 5 9 2 6 5 3 输出样例 1 1 1 2 3 3 4 5 5 6 9 输入样例 2 2 4 6 8 10 12 14 16 18 20 输出样例 2 2 4 6 8 1…

迭代器模式(Iterator)

迭代器模式是一种行为设计模式,可以在不暴露底层实现(列表、栈或树等)的情况下,遍历一个聚合对象中所有的元素。 Iterator is a behavior design pattern that can traverse all elements of an aggregate object without exposing the internal imple…

【二分查找】74. 搜索二维矩阵

74. 搜索二维矩阵 解题思路 方法1 将二维数组转换为一维数组使用二分查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 使用二分查找// 将矩阵写入一个数组中 然后使用二分查找算法int[] a new int[matrix.length * matrix[0].length];i…

机器学习常用Python库安装

机器学习常用Python库安装 作者日期版本说明Dog Tao2022.06.16V1.0开始建立文档 文章目录 机器学习常用Python库安装Anaconda简介使用镜像源配置 Pip简介镜像源配置 CUDAPytorch安装旧版本 TensorFlowGPU支持说明 DGL简介安装DGLLife RDKitscikit-multilearn Anaconda 简介 …

Python 程序设计入门(004)—— 赋值运算符与常用函数

Python 程序设计入门(004)—— 赋值运算符与常用函数 目录 Python 程序设计入门(004)—— 赋值运算符与常用函数一、赋值运算符二、常用的数学函数1、round() 函数2、pow() 函数3、divmod() 函数 三、字符串与 str() 函数1、字符串…

UEditorPlus v3.3.0 图片上传压缩重构,UI优化,升级基础组件

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…

C++经典排序算法详解

目录 一、选择排序 二、冒泡排序 三、插入排序 一、选择排序 选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存…

解决vite+vue3项目npm装包失败

报错如下: Failed to remove some directories [ npm WARN cleanup [ npm WARN cleanup D:\\V3Work\\v3project\\node_modules\\vue, npm WARN cleanup [Error: EPERM: operation not permitted, rmdir D:\V3Work\v3project\node_modules\vue\reactivity\…

题解 | #B.Distance# 2023牛客暑期多校6

B.Distance 贪心(?) 题目大意 对于两个大小相同的多重集 A , B \mathbb{A},\mathbb{B} A,B ,可以选择其中任一元素 x x x 执行操作 x x 1 xx1 xx1 任意次数,最少的使得 A , B \mathbb{A},\mathbb{B} A,B 相同的操作次数记为 C ( A , B ) C(\m…

嵌入式开发学习(STC51-13-温度传感器)

内容 通过DS18B20温度传感器,在数码管显示检测到的温度值; DS18B20介绍 简介 DS18B20是由DALLAS半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器; 与传统的热敏电阻等测温元件相比,它是一…

虚函数表(vtable)

虚函数表(通常简称为 vtable)是 C 用于实现多态行为的一种机制。当一个类定义了虚函数或者继承了虚函数,编译器会为该类生成一个虚函数表。下面详细介绍虚函数表及其工作原理: 1. 什么是虚函数表? 虚函数表是一个存放…

关于Express 5

目录 1、概述 2、Express 5的变化 2.1 弃用或删除内容的列表: app.param(name,fn)名称中的前导冒号(:) app.del() app.param(fn) 复数方法名 res.json&#xff0…

Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

题目 t(t<100)组样例&#xff0c;长为n(n<2000)的序列 交互题&#xff0c;每次你可以询问一个区间[l,r]的逆序对数&#xff0c;代价是 要在的代价内问出最大元素的位置&#xff0c;输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructo…