有关博客博客系统的测试报告 --- 初次进行项目测试篇

文章目录

  • 前言
  • 一、博客系统的项目背景
  • 二、博客系统的项目简介
    • 1.后端功能
      • 1.1 用户管理
      • 1.2 博客管理
      • 1.3 权限管理
    • 2.前端功能
      • 2.1 用户界面
  • 测试计划
  • 测试工具、环境
  • 设计的测试动作
  • 功能测试
    • 访问博客登录页面
    • 博客首页测试
    • 博客详情页
    • 博客编辑页
  • 自动化测试
    • 自动化测试用例
    • 自动化测试脚本
      • 生成配置程序的文件
      • 登录界面测试脚本
      • 博客首页测试脚本
      • 博客编辑页测试脚本
      • 整体控制的测试脚本
  • 项目测试bug简述
    • 通过功能测试发现的bug
    • 通过自动化测试发现的bug
  • 测试总结


前言

这是一份有关博客系统项目的测试报告,里面主要是讲解了测试方式以及使用了何测试软件程序。
总之就是一份自己编写的测试报告进行练习。


一、博客系统的项目背景

本项目是基于SSM框架开发的个人博客系统测试。该系统采用前后端分离架构,前端页面通过Vue或React等技术实现,后端则使用Spring、Spring MVC和MyBatis(SSM)组合来处理业务逻辑。系统的主要功能包括用户登录、博客编辑、注销、删除博客等。数据库用于存储博客内容、用户信息等数据。前端主要由四个页面组成:登录页面、博客列表页、博客详情页和博客编辑页。在前后端的协作下,成功实现了个人博客的列表展示与管理。

二、博客系统的项目简介

1.后端功能

1.1 用户管理

用户注册与登录:允许新用户注册账号,并使用注册的账号登录系统。
用户信息维护:用户可以查看和编辑自己的个人信息(如用户名、密码、邮箱等,但密码通常不会明文显示,而是提供修改密码的功能)。
用户注销:提供用户注销登录的功能。

1.2 博客管理

博客创建与编辑:允许用户创建新的博客文章,并对已发布的文章进行编辑。
博客删除:用户可以删除自己发布的博客文章。
博客列表获取:后端需要提供API接口,以便前端获取用户发布的所有博客文章列表。

1.3 权限管理

用户角色划分:虽然这是一个个人博客系统,但也可以考虑设置不同的用户角色(如管理员和普通用户),以便未来扩展功能。
权限控制:根据用户角色,控制其对不同功能的访问权限。

2.前端功能

2.1 用户界面

登录页面:提供用户登录的表单界面,包括用户名和密码输入框,以及登录按钮。
博客列表页:展示用户发布的所有博客文章列表,包括文章标题、摘要、发布时间等信息。
博客详情页:展示博客文章的详细内容,包括标题、正文、发布时间、作者信息等。
博客编辑页:提供博客文章编辑的表单界面,包括标题、正文等输入框,以及保存按钮。

测试计划

功能后端开发前端开发提测日期测试测试日期测试结果
登录界面汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客首页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客详情页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客编辑页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
回归测试Edd2024.11.21测试通过

在1、2、3、4行一般在工作中可能会要求测试报告的格式,但我们学习阶段中尽可能不要将测试报告写的如此简单。

什么是提测日期?提测日期是项目开发完成后,提交给测试的日期
那一般来说项目是分开提测还是整体提测之后测试再介入呢?

这要取决于不同的页面之间是否存在测试耦合的地方,如果存在大量的耦合则需要整体进行提测,反之低耦合的话我们是可以分开进行提测的,但目前我们是假设需要整体进行提测

什么是回归测试
首先系统每个页面都是独立来测试的,我们可以看见1、2、3、4相当于是一个独立的页面进行单独测试,但最后我们还是要加上回归测试,将整个页面再回归一次整体进行测试,判断系统是否可以正常的去使用。

针对博客系统的测试我们主要是使用selenium进行自动化测试,就使用Xmind绘制脑图,会在脑图是为了先进行一遍测试规划,为了后期测试以及自动化测试流程进行梳理,由于只是针对web界面的测试,所以我们只要针对界面测试即可。
博客系统自动化测试用例脑图

测试工具、环境

浏览器:Edge、Chrome
工具:Python、PyCharm 2024.2.4、selenium

设计的测试动作

功能测试、自动化测试
功能测试:覆盖到登录页面、博客首页、博客详情页、博客编辑页面等,发现1个问题
自动化测试:覆盖到登录界面、博客首页、博客详情页、博客编辑页面等,发现1个问题

功能测试

访问博客登录页面

手动输入正确的账号和密码 —> 成功进入博客首页
博客系统页面

博客首页
输入错误的账号和密码 —> 提示错误信息

在这里插入图片描述
输入错误的账号和正确的密码 —> 提示错误信息

在这里插入图片描述
输入正确的账号和错误的密码
在这里插入图片描述

博客首页测试

博客首页存在图片、用户名、文章列表
在这里插入图片描述
可点击博客详情页的查看全文按钮 —> 成功跳转
在这里插入图片描述

博客详情页

博客详情页存在标题、时间、博客内容
在这里插入图片描述
未登录的状态下进入博客的URL链接会跳转到登录页面
在这里插入图片描述

博客编辑页

在登录的情况下点击写博客按钮,就可以跳转到博客编辑页
在这里插入图片描述
输入标题以及内容再点击发布文章按钮
在这里插入图片描述

查看博客列表查看是否发布成功
在这里插入图片描述
未登录的情况下进入博客编辑页面
在这里插入图片描述

自动化测试

自动化测试用例

自动化测试用例大致还是使用脑图中的思路去编写用例的。
博客系统自动化测试用例脑图

自动化测试脚本

创建好项目时要查看一下项目是否以及导入了selenium和webdriver_manager库
接下来我们就参考测试用例,去创建自动化测试项目,编写自动化测试脚本
我们分别插件几个目录与文件
在这里插入图片描述

common
Utils.py   作用于生成测试文件中需要用到的配置内容
tests
BlogLogin.py   博客登录页面相关的测试用例
BlogList.py    博客首页相关测试用例
BlogDetail.py   博客编辑页相关测试用例
RunCases.py  用于可控制整体运行的测试用例
images
2024-11-21   根据每天的日期进行分类,当天运行的自动化图片文件放到当天的文件夹下
2024-11-21-123456.png

生成配置程序的文件

common/Utils.py

### 用于创建浏览器对象
import os
import sys
from datetime import datetimefrom selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager# 创建一个浏览器对象Chrom
class ChromDriver:driver = ""def __init__(self):options = webdriver.ChromeOptions()options.add_argument('--start-maximized')options.add_argument('--disable-gpu')options.add_argument('--no-sandbox')# options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"service = Service(ChromeDriverManager().install())self.driver = webdriver.Chrome(service=service, options=options)self.driver.implicitly_wait(10)def GetScreenShot(self, filename=""):dirname = datetime.now().strftime('%Y-%m-%d')if not os.path.exists("../images/" + dirname):os.mkdir("../images/" + dirname)filname = sys._getframe().f_back.f_code.co_name + "-" + filename + "-" + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + ".png"self.driver.save_screenshot("../images/" + dirname + "/" + filname)# 创建一个浏览器对象Edge
class EdgeDriver:driver = ""def __init__(self):options = webdriver.EdgeOptions()options.add_argument('--start-maximized')options.add_argument('--disable-gpu')options.add_argument('--no-sandbox')service = Service(EdgeChromiumDriverManager().install())self.driver = webdriver.Edge(service=service, options=options)def GetScreenShot(self, filename=""):dirname = datetime.now().strftime('%Y-%m-%d')if not os.path.exists("../images/" + dirname):os.mkdir("../images/" + dirname)filname = sys._getframe().f_back.f_code.co_name + "-" + filename + "-" + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + ".png"self.driver.save_screenshot("../images/" + dirname + "/" + filname)# 使用单例模式
BlogDriver = ChromDriver()
# BlogDriver = EdgeDriver()

以上是有Edge、Chrome浏览器的驱动代码,供自己选择

登录界面测试脚本

tests/BlogLogin.py

### 这是博客登录相关的测试
from time import sleepfrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogLogin:url = ""driver = ""def __init__(self):# 配置登录urlself.url = "http://8.137.19.140:9090/blog_list.html"# 配置deriverself.driver = BlogDriver.driver# 打开登录页面self.driver.get(self.url)# 等待页面加载完成sleep(3)# 刷新登录页面self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(4)").click()# 成功登录的测试用例def LoginSucTest(self):try:# 清空用户名和密码输入框内容self.driver.find_element(By.CSS_SELECTOR,"#username").clear()self.driver.find_element(By.CSS_SELECTOR,"#password").clear()# 输入用户名self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("lisi")# 输入密码self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")# 点击登录按钮self.driver.find_element(By.CSS_SELECTOR,"#submit").click()# 断言登录成功# 能够找到博客系统的首页用户名称,说明登录成功,否则登录失败sleep(4)text = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").textassert text == "lisi"print("登录测试成功!")# 可选:保存截图BlogDriver.GetScreenShot()except Exception as e:print(f"登录测试失败,错误信息:{str(e)}")raise e  # 重新抛出异常,确保测试用例仍然标记为失败finally:self.driver.back()# 失败登录的测试用例def LoginFailTest(self,username,password,manner,failname=""):try:# 清空用户名 和密码输入框内容self.driver.find_element(By.CSS_SELECTOR,"#username").clear()self.driver.find_element(By.CSS_SELECTOR,"#password").clear()# 输入用户名self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys(username)# 输入密码self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys(password)# 点击登录按钮self.driver.find_element(By.CSS_SELECTOR,"#submit").click()sleep(2)# 获取弹窗的信息alert = self.driver.switch_to.alert# 获取弹窗的文本信息alert_text = alert.text# 断言登录失败assert alert_text == mannerprint("测试登录失败!" + manner)alert.accept()# 可选:保存截图BlogDriver.GetScreenShot(failname)except Exception as e:print(f"登录测试失败,错误信息:{str(e)}")raise e  # 重新抛出异常,确保测试用例仍然标记为失败finally:passdef quit(self):self.driver.quit()# login = BlogLogin()
# login.LoginSucTest()
# login.LoginFailTest("ili","1234578","用户不存在","user_fail")
# login.LoginFailTest("ili","123456","用户不存在","user_fail")
# login.LoginFailTest("lisi","1234567","密码错误","password_fail")
# BlogDriver.driver.quit()

博客首页测试脚本

# 这是测试博客列表页的测试案例
from time import sleepfrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogList:url = ""driver = ""def __init__(self):self.driver = BlogDriver.driverself.url = "http://8.137.19.140:9090/blog_list.html"self.driver.get(self.url)# 测试已登录的主页页面def ListTest(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.date")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")# 测试已经发布文章的数量是否达到# articles = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right")# assert len(articles) > 5# 点击进入文章self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()# 判断是否进入文章详情页sleep(2)title = self.driver.titleassert title == "博客详情页"print("点击文章测试通过")# 未登录的状态下进入博客首页def ListTestNoLogOn(self):# 在已登录的情况下进行注销self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()# 再进入首页URLself.driver.get("http://8.137.19.140:9090/blog_list.html")# 通过title判断是否为登录页面,判断是否进入了登录的首页sleep(1)title = self.driver.titleassert title == "博客登陆页"print("未登录进入博客首页测试通过")

博客编辑页测试脚本

# 这是文章发布测试案例
# 使用前提是已经登录了页面
from selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogDetail():driver = ""url = ""def __init__(self):self.driver = BlogDriver.driverself.url = "http://8.137.19.140:9090/blog_list.html"self.driver.get(self.url)# 正常登录的情况下进行博客编写与发布def blogPublish(self):# 点击发布博客按钮self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()# 输入博客标题self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("123测试博客标题")# 可选:保存截图BlogDriver.GetScreenShot()# 发布博客self.driver.find_element(By.CSS_SELECTOR,"#submit").click()# 判断是否发布成功self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1549) > div.title")# 登录状态下博客详情页的测试def DetailTestByLogin(self):# 点击博客详情self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()# 检查博客标题self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")# 检查博客时间self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")# 检查博客内容self.driver.find_element(By.CSS_SELECTOR,"#detail > p")print("博客详情页测试通过")

整体控制的测试脚本

from common.Utils import BlogDriver
from tests.BlogLogin import BlogLogin
from tests.BlogList import BlogList
from tests.BlogDetail import BlogDetailif __name__ == "__main__":BlogLogin().LoginFailTest("ili","1234578","用户不存在","user_fail")BlogLogin().LoginSucTest()BlogList().ListTest()BlogList().ListTestNoLogOn()BlogLogin().LoginSucTest()BlogDetail().DetailTestByLogin()BlogDetail().blogPublish()BlogDriver.driver.quit()

项目测试bug简述

本次项目测试发现了2个bug,有1个一般级别的bug,1个次要级别的bug。

通过功能测试发现的bug

这边发现一个次要Bug警告吧
主要是我认为未登录的情况下,在登录界面中可以点击写博客按钮(此处还可理解),但是再未登录的情况下进入博客编辑页面,存在注销按钮有些不符常理,我认为可以写个普通Bug吧
在这里插入图片描述
对bug的描述:
次要bug [1.]:
问题出现的环境:谷歌浏览器 版本 131.0.6778.86(正式版本) (64 位)
问题出现的步骤:
&semp;1、打开谷歌浏览器,输入网址 http://8.137.19.140:9090/blog_login.html
&semp;2、不登录的情况下,点击右上角的写博客按钮
&semp;3、存在注销按钮
预期结果:进入博客编辑页面,不应存在注销按钮
实际结果:进入博客编辑页面,存在注销按钮

通过自动化测试发现的bug

这里是通过Edge浏览器使用自动化测试工具测试出来的背景图不显示的问题,此bug不知道为啥,反正以我对bug的判定,应该为一般bug了
在这里插入图片描述
对bug的描述:
次要bug
问题出现的环境:Microsoft Edge浏览器 版本 版本 131.0.2903.51 (正式版本) (64 位)
问题出现的步骤:
&semp;1、打开谷歌浏览器,输入网址 http://8.137.19.140:9090/blog_login.html
&semp;2、默认就会不显示背景图
预期结果:进入博客登录页面,存在背景图
实际结果:进入博客登录页面,不存在背景图

bug标题报告人是否修复
http://8.137.19.140:9090/blog_edit.htmlEdd未修复
http://8.137.19.140:9090/blog_login.htmlEdd未修复

测试总结

本次项目测试通过,项目开发了一个月,项目测试耗时2天时间。

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

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

相关文章

Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持

作者:来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布,通过集成 IBM watsonx™ Slate 嵌入模型,我们的开放推理 API 功能得以扩展,这…

flume-将日志采集到hdfs

看到hdfs大家应该做什么? 是的你应该去把集群打开, cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案,‘ cd /export/servers/flume/conf 切换完成之后&#…

已解决wordpress提示正在执行例行维护,请一分钟后回来

今天打开网站时提示“正在执行例行维护,请一分钟后回来”,一分钟后还这样,刷新也没用,这究竟是怎么回事了? 问题原因 这是WordPress在更新,wordpress在升级程序、主题、插件时,都会先切换到维护模式&…

[C++]:IO流

1. IO 流 1.1 流的概念 在C中,存在一种被称为“流”的概念,它描述的是信息流动的过程,具体来说就是信息从外部输入设备(比如常见的键盘)传输到计算机内部(像内存区域),以及信息从内…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…

多摩川编码器协议及单片机使用

参考: https://blog.csdn.net/qq_28149763/article/details/132718177 https://mp.weixin.qq.com/s/H4XoR1LZSMH6AxsjZuOw6g 1、多摩川编码器协议 多摩川数据通讯是基于485 硬件接口标准NRZ 协议,通讯波特率为2.5Mbps 的串行通讯,采用差分两…

力扣刷题--21.合并两个有序链表

I am the best !!! 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2…

Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制

基于Altium Designer 23学习版,四层板智能小车PCB 更多AD学习笔记:Altium Designer学习笔记 1-5 工程创建_元件库创建 目录 6、光耦及二极管元件库模型创建 7、元件库模型的调用 二、原理图绘制及编译检查 8、元件的放置 9、器件的复制及对齐 10、…

视频流媒体播放器EasyPlayer.js H.265流媒体播放器当container窗口发生变化的时候,播放器如何自适应

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。现今流媒体播放器将继续引领数字娱乐的新潮流,为用户提供更加丰富多样的内容体验。 流媒体播放器负责解码和呈现内容,常见的播放器包括VLC和HTML5播放器等。流媒体技术的应用场景广…

Windows系统使用全功能的跨平台开源音乐服务器Navidrome搭建在线音乐库

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动Navidrome容器4. 公网远程访问本地Navidrome4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定公网地址远程访问 前言 在数字时代,拥有一个个性化、便捷的音乐库成为了许多人的需求。本文…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表,录入的日期格式很混乱,有些看着差不多,但实际多一个空格少一个字符很难发现,希望的理想格式是 1980-01-01,10位,即:“YYYY-mm-dd”,实际上数据表中这样的格式都有 19…

二进制 分析工具:Radare2、r2frida、Binutils、file、string、as、nm、ldd、objdump、readelf、strip

1、二进制 分析工具 工欲善其事,必先利其器,在二进制安全的学习中,​使用工具尤为重要。遇到一个不熟悉的文件时, 首先要确定 "这是什么类型的文件",回答这个问题的首要原则是,绝不要根据文件的扩…

大数运算(加减乘除和输入、输出模块)

为什么会有大数呢?因为long long通常为64位范围约为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,最多也就19位,那么超过19位的如何计算呢?这就引申出来大数了。 本博客适合思考过这道题,但是没做出来或…

Kafka-副本分配策略

一、上下文 《Kafka-创建topic源码》我们大致分析了topic创建的流程,为了保持它的完整性和清晰度。细节并没有展开分析。下面我们就来分析下副本的分配策略以及副本中的leader角色的确定逻辑。当有了副本分配策略,才会得到分区对应的broker,…

Move语言中的代币合约:设计和实现指南

系列文章目录 Task1:hello move🚪 Task2:move coin🚪 Task3:move nft🚪 更多精彩内容,敬请期待!✌️ 文章目录 系列文章目录前言什么是 Sui 链?什么是 Move 编程语言&a…

精酿啤酒厂建设攻略——关键步骤与注意点

建设一家精酿啤酒厂,每一步都至关重要。在这里,小编将为您精心梳理建设精酿啤酒厂的详细步骤和关键注意点,助您在啤酒市场的蓝海中乘风破浪。从投资预算的精确规划,到市场渠道的精心布局,从产品特色的精准定位&#xf…

什么是UGFC?模块电脑(核心板)规范标准简介四

1. 概念 UGFC是Unified Gold Finger Core Board的缩写(意指:统一接口定义金手指核心板),为武汉万象奥科电子有限公司基于企业标准定义的一种针对嵌入式、低功耗、通用型的小型计算机模块标准,采用204Pin金手指连接器…

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言,一个记录对应的指标值的绝对值,肯定落在所有指标值的绝对值的最小值和最大值构成的区间内,根据一定的算法&#x…

量子感知机

神经网络类似于人类大脑,是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题,是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…

大语言模型---ReLU函数的计算过程及其函数介绍

文章目录 1. 概要2. ReLU定义 1. 概要 **ReLU 作用:**主要用于为神经网络引入非线性能力,作用是将输入中的整数保留原值,负数置为 0。 从而在层与层之间引入非线性,使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xf…