文章目录
- 前言
- 一、博客系统的项目背景
- 二、博客系统的项目简介
- 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.10 | Edd | 2024.11.21 | 测试通过 |
博客首页 | 汤大帅哥 | 甜甜绵姐姐 | 2024.11.10 | Edd | 2024.11.21 | 测试通过 |
博客详情页 | 汤大帅哥 | 甜甜绵姐姐 | 2024.11.10 | Edd | 2024.11.21 | 测试通过 |
博客编辑页 | 汤大帅哥 | 甜甜绵姐姐 | 2024.11.10 | Edd | 2024.11.21 | 测试通过 |
回归测试 | Edd | 2024.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 datetime
from 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 sleep
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogLogin:
url = ""
driver = ""
def __init__(self):
# 配置登录url
self.url = "http://8.137.19.140:9090/blog_list.html"
# 配置deriver
self.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").text
assert 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 == manner
print("测试登录失败!" + manner)
alert.accept()
# 可选:保存截图
BlogDriver.GetScreenShot(failname)
except Exception as e:
print(f"登录测试失败,错误信息:{str(e)}")
raise e # 重新抛出异常,确保测试用例仍然标记为失败
finally:
pass
def 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 sleep
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogList:
url = ""
driver = ""
def __init__(self):
self.driver = BlogDriver.driver
self.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.title
assert title == "博客详情页"
print("点击文章测试通过")
# 未登录的状态下进入博客首页
def ListTestNoLogOn(self):
# 在已登录的情况下进行注销
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()
# 再进入首页URL
self.driver.get("http://8.137.19.140:9090/blog_list.html")
# 通过title判断是否为登录页面,判断是否进入了登录的首页
sleep(1)
title = self.driver.title
assert title == "博客登陆页"
print("未登录进入博客首页测试通过")
博客编辑页测试脚本
# 这是文章发布测试案例
# 使用前提是已经登录了页面
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
class BlogDetail():
driver = ""
url = ""
def __init__(self):
self.driver = BlogDriver.driver
self.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 BlogDetail
if __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.html | Edd | 未修复 |
http://8.137.19.140:9090/blog_login.html | Edd | 未修复 |
测试总结
本次项目测试通过,项目开发了一个月,项目测试耗时2天时间。