博客系统--测试报告

devtools/2025/3/5 1:09:49/

博客系统--测试报告

本博文主要针对个人实现的项目《博客系统》去进行功能测试、自动化测试、性能测试,并记录总结

项目背景

博客系统采用前后端不分离的方法来实现,同时使用了数据库来存储相关的数据,且已将其部署到云服务器上。前端主要有五个页面构成:登录页,文章列表页,文章详情页,文章编辑(修改)页和文章发布页。以上模拟实现了最简单的博客系统。其实现了以下的主要功能:登录、新增文章、对自己文章的删改查、查看他人文章、注销登录并使用Jwt完成了令牌登录校验等功能。
但该项目没有注册账号,点赞文章,筛选文章等功能,且用户没法自行设置头像

项目功能

该博客系统主要实现了以下几个功能:登录、注销、回到主页(文章列表页)、写文章、修改/删除自己的文章、查看文章详情、且支持MD编辑器。

  • 登录功能:由于没有注册功能,用户名以及密码只能在数据库写死,直接输入给出的用户名和密码登录即可。但是在未登录(如:Token过期)情况下按下点击任意按钮或刷新页面均会跳转到登录页面。
  • 注销功能:用户在任意界面点击右上角“注销”按钮,回到登录页面。
  • 回到主页(文章列表页)功能:用户在任意界面点击右上角“主页”按钮,进入文章列表页。
  • 写博客功能:用户在任意界面点击右上角“写文章”按钮,进入写文章页面。
  • 修改/删除博客功能:用户在查看自己写的文章时会显示“编辑”和“删除”按钮,点击“编辑”按钮会进入编辑页面,点击“更新文章”按钮会提示“修改成功”,再点击“确认”按钮后会自动跳转至文章列表页并展示更新的内容;点击“删除”按钮会提示“删除成功”,再点击“确认”按钮后会自动跳转至文章列表页,且刚才查看的文章已不再展示。
  • 查看博客功能:用户在文章列表页可以看到每篇文章下面都有“查看全文>>”按钮,点击该按钮进入文章详情页,页面包括文章作者信息,文章第一次发布的时间等。

功能测试

①登录功能测试

由于没有实现注册功能,所以我们的用户名和密码都是在数据库里写死的,所以只能用系统原始的数据进行登录

执行步骤: 访问网站-> 输入用户名及密码 ->单击"提交"
在这里插入图片描述
测试过程部分截图:

输入用户名为空::
输入不存在的用户:
在这里插入图片描述

②发布博客功能测试

在这里插入图片描述

不填写标题,发布失败:
在这里插入图片描述

③删除文章功能测试

在这里插入图片描述
从前端看的话,如果我们登录的用户并不是该篇博客的作者,是不会显示 编辑删除 这两个按钮的,但是此处可以进行思维扩展:我们也是可以通过其他工具去向后端发送请求执行删除文章操作的,此处就发现了一处bug
在这里插入图片描述
可以看到此处我们登录的是 lisi 用户,在前端展示和我们预期的一样,隐藏了编辑和删除按钮,但是当我们用Postman进行后端接口测试的时候却发现了问题:
在这里插入图片描述
我们用 lisi 账户登录后所携带的令牌去删除作者是 zhangsan 的博客,后端居然请求成功了,再到数据库里查看数据,发现博客已经被逻辑删除了,这样的情况相当于我拿着自己家的钥匙开了别人家的门,所以此处肯定是不安全的,应该进行代码层面上的逻辑校验
在这里插入图片描述

④功能测试总结:

用户登录测试用例表

用例名称用户登录功能
测试目的测试用户能通过系统给定的的用户名和密码进行登录
测试前提用户处于博客系统登录页
测试流程1)进入登录页面 2)输入事先准备的测试数据(用户名和密码)
预期结果输入正确的用户名和密码时,成功跳转至博客列表页,反之则弹出相应的错误对用户进行提示
实际结果与预期结果基本一致

发布文章测试用例表

用例名称发布文章功能
测试目的测试用户能通过在登陆后进行博客的编写及发布
测试前提用户已登录
测试流程1)登录博客系统 2)进入博文编辑页 3)输入事先准备的测试数据 (博文内容) 4)单击发布博文
预期结果如果输入了标题内容,就能进行发布,反之则发布失败,对用户进行弹窗提示
实际结果与预期结果基本一致,提示信息需要补全

删除文章测试用例表

用例名称删除文章功能
测试目的测试用户在登录后能够删除自己的文章
测试前提用户已登录,并且已经发表该文章
测试流程1)登录博客系统 2)进入个人主页 3)单击查看全文4)单击删除博文 2. 使用postman工具调用删除博文接口
预期结果用户只能对自己的博客进行删除操作
实际结果与预期结果不一致,此处代码逻辑需进行更改

自动化测试

现采用Selenium搭配Junit一些Api对博客系统设计UI自动化测试用例,
主要针对核心功能: 用户登录、博文的查看及删除、用户注销登录 功能进行测试

自动化代码 码云:

由于该项目很早前就部署在服务器上了,并且服务器配置实在过低,会导致我们在进行自动化时有些资源很难加载完全,但经过很多遍测试发现在执行自动化测试的时候只要代码逻辑正确,代码还是能够跑的通的

本次自动化测试主要执行以下逻辑:用户错误登录->用户正确登录->用户发表博客->用户查看博客->用户删除博客用户注销

①前置准备

//工具类封装
public class Utils {public static WebDriver driver;public static WebDriver createDriver(){if (driver == null){//浏览器配置WebDriverManager.edgedriver().setup();EdgeOptions options = new EdgeOptions();//允许访问所有链接options.addArguments("--remote-allow-origins=*");options.setPageLoadStrategy(PageLoadStrategy.NORMAL);driver = new EdgeDriver(options);//设置隐式等待WebDriver.Timeouts wait = driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));}return driver;}public Utils(String url){driver = createDriver();driver.get(url);}}
package tests;import common.Utils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.UnhandledAlertException;import java.io.IOException;
//博客测试
public class BlogTest extends Utils {private static String blog_system = "http://120.26.87.94:8080/blog_list.html";public BlogTest() {super(blog_system);}/*** 失败登录* @throws IOException* @throws UnhandledAlertException* @throws InterruptedException*/public void LoginFail() throws IOException, UnhandledAlertException, InterruptedException {driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("1234");driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);String alertText = "";Alert alert = driver.switchTo().alert();alertText = alert.getText();Thread.sleep(2000);alert.accept();assert alertText.equals("密码错误");driver.navigate().refresh();}/*** 成功登录* @throws IOException*/public void LoginSuccess() throws IOException {//清空输入框driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();//输入正确的用户名和密码driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();//查看注销按钮driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));//查看urlString expect = driver.getTitle();assert expect.equals("博客列表页");}/*** 编辑博客* @throws InterruptedException*/public void EditSuc() throws InterruptedException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();String blogTitle = "Edit Test";driver.findElement(By.cssSelector("#title")).sendKeys(blogTitle);Thread.sleep(2000);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);String title = driver.getTitle();assert title.equals("博客列表页");}/*** 查看博客*/public void ViewBlog() throws InterruptedException {driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();Thread.sleep(2000);}/*** 注销用户*/public void Logout(){driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();driver.quit();}/*** 删除博客* @throws InterruptedException*/public void DeleteBlog() throws InterruptedException {driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)")).click();Thread.sleep(2000);Alert alert = driver.switchTo().alert();alert.accept();}}

执行我们编写的自动化代码

自动化脚本执行界面:

博客系统自动化测试

性能测试

我们此处使用Jmeter提供的梯度压测功能对博客系统进行压测,由于服务器实在过于脆弱,此处将只设置20个线程数,以及一分钟的持续压测时间,对我们系统的 登录、查询博客列表、查询用户信息、查询作者信息以及添加博客这几个接口进行压测
在这里插入图片描述
配置好线程组之后我们在使用命令提示符,启动我们保存好的 .jmx 格式文件,并将其输出的测试报告文件及日志保存到我们指定的目录
在这里插入图片描述
按回车键执行以后,我们过一会就能在指定目录下查看其生成的性能测试报告了

双击生成的html文件,查看jmeter生成的性能测试报告了
在这里插入图片描述
在这里插入图片描述
可以看到我们发送的很多请求都调用失败了

在这里插入图片描述
可以看到基本都是一种异常

后来翻阅网上资料找到了解决方法:https://javaziliao.com/post/5948.html


http://www.ppmy.cn/devtools/164610.html

相关文章

深入探究Python机器学习算法:无监督学习(聚类算法如 K-Means、DBSCAN,降维算法如 PCA、SVD)

文章目录 深入探究 Python 机器学习算法:无监督学习聚类算法K - Means聚类算法流程K值选择方法聚类结果的稳定性分析和评估方法 层次聚类算法原理和实现过程连接方法特点和适用场景可视化方法 DBSCAN密度聚类算法原理优势和局限性 降维算法主成分分析(PC…

鸿蒙5.0实战案例:基于Asset下的高安全级别数据存储

往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录) ✏️ 鸿蒙(HarmonyOS)北向开发知识点记录~ ✏️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…

STM32单片机芯片与内部111 STM32 DSP内核 介绍 功能 库与源码

目录 一、STM32F4 的 DSP 功能介绍 二、Cortex-M4 内核的 DSP 和专业 DSP 的区别 三、相关功能 1、BasicMathFunctions 2、FastMathFunctions 3、ComplexMathFunctions 4、FilteringFunctions 5、MatrixFunctions 6、TransformFunctions 7、ControllerFunctions 8、…

Python 如何实现烟花效果的完整代码

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…

mybatis相关的面试题及答案第一弹

1. MyBatis的核心组件有哪些?它们的作用是什么? 答案: MyBatis的核心组件包括: SqlSessionFactory:负责创建SqlSession对象,是MyBatis的核心工厂。SqlSession:用于执行SQL语句、获取映射器&am…

L-Lipschitz Gershgorin ResNet 网络

大家读完觉得有帮助记得关注和点赞!!! 抽象 深度残差网络 (ResNets) 在计算机视觉任务中取得了巨大的成功,这归因于它们能够保持通过深度架构的梯度流。同时,控制神经网络中的 Lipschitz 绑定已…

[密码学实战]Java生成SM2根证书及用户证书

前言 在国密算法体系中,SM2是基于椭圆曲线密码(ECC)的非对称加密算法,广泛应用于数字证书、签名验签等场景。本文将结合代码实现,详细讲解如何通过Java生成SM2根证书及用户证书,并深入分析其核心原理。 一、证书验证 1.代码运行结果 2.根证书验证 3.用户证书验证 二、…

算法系列之动态规划

动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复…