大众博客系统测试报告【改】

 一、项目背景


大众博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的大众博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客、以及强制登录等功能。
但是该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;而用户信息中的文章数以及分类数也没有在后端中具体实现,直接在前端页面中写为了静态的。
该个人博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。


二、项目功能

一功能介绍


该大众博客系统主要实现了以下几个功能:登录,写博客以及用户管理等功能。

登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。
列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能:删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

二相关源码

 @Order(3)@Testvoid EditBlog() throws InterruptedException {EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");EdgeDriver driver = new EdgeDriver(options);driver.get("http://62.234.43.231:7551/blog_add.html");driver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);driver.findElement(By.xpath(" body > div.nav > a:nth-child(5)")).click();//输入框输入标题((JavascriptExecutor)driver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");sleep(3000);driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();sleep(3000);//获取urlString cur_url = driver.getCurrentUrl();Assertions.assertEquals("http://62.234.43.231:7551/blog_list.html",cur_url);


三、测试计划操作


一功能测试


1测试用例:

实际执行测试的部分操作步骤/截图
1正常登录:

2写博客测试

3发布成功并查看详情页

4博客用户管理进行查询

5博客用户管理进行添加

6博客用户管理进行删除

6博客用户管理进行修改

二 自动化测试

代码编写
根据脑图进行测试用例的编写:每个页面一个测试类,然后再各个测试类中进行测试用例的编写。
注意公共属性需要单独放一个类,方便进行代码复用。
使用测试套件便于运行以及修改。
创建启动以及现场截图就是会频繁进行复用,所以单独创建一个类进行存储。
注意添加隐式等待,为了确保页面正确加载显示。
1. 添加相关依赖pom.xml

<dependencies>
<!--        添加selenium依赖--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!--        保存屏幕截图需要用到的包--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!--        添加junit5依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency></dependencies>29


2. 新建包并在包下创建测试类以及公共类
以下是所建立的是common公共包和Tests测试包:


1)公共类AutoTestUtils
创建驱动、保存现场截图
注意:在保存现场截图的时候命名是按时间来进行文件夹的划分,然后图片的名称要体现出测试类的类名,方便进行问题的追溯。
注意文件名的动态获取,注意时间格式的设置。
注意:可以在创建驱动的时候修改默认的有头模式or无头模式
2)登录页面测试BlogLoginTest
① 创建驱动,并打开页面
② 测试页面是否正常打开
③ 测试正常登录:多参数测试
④ 测试异常登录:用户名/密码错误的情况(此处不测null)
⑤ 注意测试的顺序,使用Order注解指定,否则可能会因为执行顺序不对导致测试失败
⑥ 注意清空内容后才能再次输入用户名以及密码

3)列表页测试BlogListTest
① 测试博客列表页是否可以正常打开
② 测试列表页的“查看全文”按钮是否可以正常跳转
③ 测试未登录的直接链接是否会跳转到登录页面,顺便测试了“注销”按钮
④ 同样注意执行顺序

4)编辑页测试BlogEditTest
① 测试编辑页是否可以正确打开
② 测试博客是否可以正常发布:元素齐全 or 部分元素
③ 测试“写博客”按钮是否可以正常使用
④ 执行顺序

5)详情页测试BlogDetailTest
① 测试详情页的正确打开:有blogId和没有blogId两种情况
② 测试“删除”按钮是否可用,注意比较的是时间,因为标题可能会存在为空的情况
③ 执行顺序
④ 一定要注意导航回到列表页的操作

6)驱动释放DriverQuiteTest
因为驱动的测试是要在最后一个测试类完成之后进行释放的,如果是使用@AfterAll注解,那么每次修改测试类的时候都会需要挪动驱动释放的位置,所以直接新建一个类作为驱动释放,此时只需要在测试套件中放到最后就行。

7)测试套件runSuite
测试套件的运行,使用的是以测试类作为执行顺序的方式

三 性能测试

使用loadrunner进行简单性能测试:针对登录、编写并发布博客以及删除博客、注销等功能进行简单的性能测试。
然后在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。

录制脚本

登录测试

通过开发者工具查看请求发送的格式,以此来进行性能测试脚本的编写。发现:用户名以及密码是使用form表单的形式来进行发送的。因为用户名以及密码可以有多个,所以可以进行参数化。

添加事务以及集合点、检查点:注意检查点一般放在请求之前。

设置迭代次数:为了能够更好地遍历到所有的参数,一定要进行保存。

参数化

检查点:一定注意函数只放在要检查的URL前面,不要随便再往前面放置。(即:只放在需求之前)相关源码

Action()
{web_custom_request("crx_game_2.html", "URL=http://browser.360.cn/se/config/crx_game_2.html", "Method=GET", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t4.inf", "Mode=HTML", EXTRARES, "Url=http://62.234.43.231:7551/css/conmmon.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/css/login.css", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/js/jquery.min.js", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/img/logo2.jpg", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://62.234.43.231:7551/img/cat.jpg", "Referer=http://62.234.43.231:7551/css/conmmon.css", ENDITEM, "Url=http://62.234.43.231:7551/login.html", "Referer=http://62.234.43.231:7551/login.html", ENDITEM, "Url=http://cseupdate.360safe.com/safe/safe.cab", "Referer=", ENDITEM, "Url=http://cseupdate.360safe.com/formal/360chrome.cab?ver=13.5.2044.0&mid=4f3c60c60fbd8d385ef600e811f8f6f5&guid=4f3c60c60fbd8d385ef600e811f8f6f5&pid=360CE&db=1&sbox=0&ceip=1&usei=0&usei9=0&usew=0&skin=&safe=0&setc=&to=4", "Referer=", ENDITEM, LAST);//集合点lr_rendezvous("Rendezvous");//事务lr_start_transaction("login_transaction");lr_think_time(9);web_submit_data("info", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t5.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=814537", ENDITEM, "Name=sitedata", "Value=631302071d050b051a0100190a02050f0b020b081b176e", ENDITEM, LAST);//检查点
web_reg_find("Text=admin",LAST);web_submit_data("login", "Action=http://62.234.43.231:7551/user/login", "Method=POST", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/login.html", "Snapshot=t6.inf", "Mode=HTML", ITEMDATA, "Name=username", "Value={username}", ENDITEM, "Name=password", "Value={password}", ENDITEM, LAST);web_submit_data("info_2", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t7.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=680672", ENDITEM, "Name=sitedata", "Value=6d1a0104001c061600180608070808061865535a645942404517126b", ENDITEM, LAST);web_url("myblog_list.html", "URL=http://62.234.43.231:7551/myblog_list.html", "Resource=0", "RecContentType=text/html", "Referer=http://62.234.43.231:7551/login.html", "Snapshot=t8.inf", "Mode=HTML", LAST);web_submit_data("info_3", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t9.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=501298", ENDITEM, "Name=sitedata", "Value=6e12000b0b160406091c0c0e1b010b030900051f46575b4c5a4543411b65", ENDITEM, LAST);web_submit_data("info_4", "Action=http://cloud.browser.360.cn/site/info", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/plain", "Referer=", "Snapshot=t10.inf", "Mode=HTML", ITEMDATA, "Name=rn", "Value=859621", ENDITEM, "Name=sitedata", "Value=6317080f001f090301180707160403070209081a5a515b1c5a5c571945545456565b571f48591b6b", ENDITEM, LAST);web_custom_request("mylist", "URL=http://62.234.43.231:7551/art/mylist", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/myblog_list.html", "Snapshot=t11.inf", "Mode=HTML", "EncType=", LAST);web_custom_request("showinfo", "URL=http://62.234.43.231:7551/user/showinfo", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://62.234.43.231:7551/myblog_list.html", "Snapshot=t12.inf", "Mode=HTML", "EncType=", LAST);lr_end_transaction("login_transaction",LR_AUTO);return 0;
}

脚本测试通过

同时测试2个用户并显示日志

设置并发数量进行性能测试,并导出测试报告以及图表
1)设置2个虚拟用户,防止电脑崩溃

2)在Controller中设置场景

3)开始进行运行,性能测试开始(运行中+结束截图)

4)在Analysis中查看性能报告以及报表
① 报告

② 点击率和吞吐量分析图

③ 事务响应量

5)分析系统资源
① 剩余的物理内存近80%,即使用了近40%的内存,对于简单的登录功能来说还是较高的内存使用,还有内存优化的空间。
② 当点击率较大时CPU使用也是达到了一个较高的点,CPU利用率较高。
③ 总之,该性能还有优化的空间。

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

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

相关文章

Tars-GO 开发

默认环境是安装好的 创建服务: tarsgo make App Server Servant GoModuleName Tars 实例的名称&#xff0c;有三个层级&#xff0c;分别是 App&#xff08;应用&#xff09;、Server&#xff08;服务&#xff09;、Servant&#xff08;服务者&#xff0c;有时也称 Object&am…

LeetCode Hot100 74.搜索二维矩阵

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#x…

数据结构——堆的实现

堆的实现-----C语言版 目录&#xff1a;一、堆的实现1.1堆的定义1.2堆的实现1.2.1堆的各个接口1.2.2堆的向上调整1.2.3堆的向下调整1.2.4堆的定义声明和初始化1.2.5堆的数据处理1.2.6堆的判空和堆的数据个数以及堆销毁1.2.7堆的代码实现 二、TOP—K问题 目录&#xff1a; 一、…

C++ 文件和流、异常处理、动态内存、预处理器

一、C文件和流&#xff1a; 在C中进行文件处理&#xff0c;需要包含头文件<iostream>和<fstream>。fstream标准库定义的三个新的数据类型&#xff1a; 数据类型 描述 ofstream 该数据类型表示输出文件流&#xff0c;用于创建文件并向文件写入信息。 ifstream …

vscode项目推送到git

1、打开项目文件 打开文件后点击vs code左侧工具栏中第三个源代码管理图标&#xff0c;点击初始化仓库&#xff0c;此时会创建一个本地仓库会检查该项目中的文件变更 2、创建远程仓库 点击克隆/下载&#xff0c;复制HTTPS地址 3、添加远程地址 1&#xff09;图形化操作 2…

Leetcode刷题之用队列实现栈(C语言版)

Leetcode刷题之用队列实现栈&#xff08;C语言版&#xff09; 一、题目描述二、题目要求三、题目示例四、题目解析Ⅰ、MyStack* myStackCreateⅡ、void myStackPush(MyStack* obj, int x)Ⅲ、int myStackPop(MyStack* obj)Ⅳ、int myStackTop(MyStack* obj)Ⅴ、bool myStackEmp…

文件夹重命名:彻底摆脱数字困扰,批量修改文件夹名去除数字

在日常生活和工作中&#xff0c;经常会遇到需要修改文件夹名称的情况。有时候是因为文件夹名称中包含了数字&#xff0c;有时候是因为文件夹名称不符合规范。无论出于什么原因&#xff0c;修改文件夹名称都是一件非常繁琐的事情。尤其是需要修改大量文件夹名称时&#xff0c;手…

Jenkins 整合 Docker 自动化部署

Docker 安装 Jenkins 配置自动化部署 1. Docker 安装 Jenkins 1.1 拉取镜像文件 docker pull jenkins/jenkins1.2 创建挂载文件目录 mkdir -p $HOME/jenkins_home1.3 启动容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…

CentOS rpm安装Nginx和配置

CentOS rpm安装Nginx和配置 官方下载地址: http://nginx.org/en/download.html 介绍 Nginx(“engine x”)是一款由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 rpm包安装 #安装nginx&#xff0c…

k8s部署的java服务查看连接nacos缓存的配置文件

一、问题描述 k8s部署的java服务&#xff0c;使用nacos中的配置文件&#xff0c;需要在缓存中查看该服务具体是使用到了哪些配置文件 二、解决 参考文档: https://nacos.io/zh-cn/docs/system-configurations.html 文档描述如下: 进入java服务容器进入用户目录下的nacos&a…

4-Docker命令之docker version

1.docker version介绍 docker version命令是用于查看docker容器的版本信息 2.docker version用法 docker version [参数] [root@centos79 ~]# docker version --helpUsage: docker version [OPTIONS]Show the Docker version informationOptions:-f, --format string Fo…

Android 12.0 mt6771新增分区功能实现四

1.前言 在12.0的系统rom开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存, 所以就需要在系统分区新增分区,接下来就来实现这个功能,看第四部分的新增分区的实现过程 2.mt6771新增分区功能实现四的核心类 device/mediatek/mt6771/ueventd.mt6771.rcdevice…

Java枚举详解

一、什么是枚举类型 枚举类型是一种特殊的数据类型&#xff0c;用于定义一组固定的命名常量。枚举类型提供了一种更强大、更安全和更易读的方式来表示一组相关的常量。 在Java中&#xff0c;枚举类型是通过使用enum关键字来定义的。枚举类型可以包含一个或多个枚举常量&#xf…

常见状态码总结

常见状态码总结 2xx 200 OK&#xff1a;表示服务器成功处理了客户端的请求&#xff0c;并返回所请求的数据。这是最常见的状态码&#xff0c;表示一切正常。201 Created&#xff1a;表示服务器成功处理了客户端的 POST 请求&#xff0c;并在服务器上创建了新的资源。204 No C…

vue005——vue组件入门(非单文件组件和单文件组件)

一、非单文件组件 1.1、单文件组件的使用 1.1.1、局部注册 1、第一步&#xff1a;创建school组件 2、第二步&#xff1a;注册组件&#xff08;局部注册&#xff09; 3、第三步&#xff1a;使用组件&#xff08;编写组件标签&#xff09; <!DOCTYPE html> <html>…

设计模式—里氏替换原则

1.概念 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说&#xff0c;任何基类可以出现的地方&#xff0c;子类一定可以出现。 LSP是继承复用的基石&#xff0c;只有当衍生类可以替换掉基类&#xff0c;软件单位的功能不受到影…

Spring注解方式整合第三方框架

目录 Spring整合MyBatis 原有xml方式整合配置如下 注解方式&#xff1a; Import可以导入如下三种类 第三方框架是指由其他开发者或团队开发的软件模块或库&#xff0c;供开发者在自己的应用程序中使用。这些框架通常提供了一系列已经封装好的功能或工具&#xff0c;可节省开…

使用flask返回json格式的数据

Flask Flask是一个使用Python编写的轻量级Web框架&#xff0c;它的设计理念是保持简单、灵活和易扩展。它的核心是Werkzeug和Jinja2&#xff0c;并且它本身只提供了非常基础的Web框架功能&#xff0c;例如路由和请求处理等。 使用Flask可以快速创建一个Web应用程序&#xff0c;…

跳跃游戏Ⅱ[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说&#xff0c;如果你在nums[i]处&#xff0c;你可以跳转到任意nums[i j]处: 0 < j < nums[i] i j < n …

【Python 训练营】N_8 打印阿姆斯特朗数

题目 输入一个数&#xff0c;判断是否为阿姆斯特朗数&#xff0c;阿姆斯特朗数指一个n位正整数等于其各位数字的n次方之和。其中n为3时是水仙花数。 分析 利用循环&#xff0c;获取数的长度&#xff0c;根据长度和定义&#xff0c;拆分出来运算 答案 while True:n int(in…