个人博客系统测试报告
- 一、报告概述
- 二、测试用例
- 三、功能测试
- 四、自动化测试
- 五、兼容性测试
- 六、测试总结
一、报告概述
1.项目背景
本博客系统是一个基于Web的轻量级内容发布与管理平台。它旨在为用户提供一个简洁、易用的在线写作与分享环境。系统核心功能围绕文章的创建、发布、管理及用户互动展开,是个人记录、知识分享和思想表达的理想工具。
系统包含以下核心页面和功能:
| 模块 | 功能 |
|---|---|
| 登录页 | 未登录不可访问其他页面 |
| 博客列表页 | 显示每篇博客的标题、发表时间等,提供"查看全文"入口 |
| 博客详情页 | 查看博客详细内容 |
| 博客更新页 | 支持已发布的博客修改 |
| 发布博客页 | 提供富文本编辑器,可编辑博客,发布博客之后,会在列表显示该博客 |
2.测试目的
本次测试的核心方向为:一方面确认博客系统各功能模块的功能完整性与可用状态,另一方面保障用户登录、用户注销、博客列表页、博客详情页、博客更新页、发布博客页等核心页面的实际表现,符合预设的需求规范。
3.测试环境
- 操作系统 : Windows 11
- 浏览器:Chrome、Edge
- 测试工具:Selenium
二、测试用例

三、功能测试
1.用户管理功能
1.1登录功能
1.1.1测试场景一:页面打开正常
预期结果:页面打开正常,文字、logo等信息显示正常

1.1.2测试场景二:登录成功并跳转到系统首页(用户名:zhangsan,密码:123456)
预期结果:登录成功,跳转到博客系统首页


1.1.3测试场景三:登录失败(用户名:zhangsan,密码:空)
预期结果:弹出"账号或密码不能为空"弹窗

1.1.4测试场景四:登录失败(用户名:空,密码:123456)
预期结果:弹出"账号或密码不能为空"弹窗

1.1.5测试场景五:登录失败(用户名:空,密码:空)
预期结果:弹出"账号或密码不能为空"弹窗

1.1.6测试场景六:登录失败(输入不存在的用户名,密码:123456)
预期结果:弹出"用户名不存在"弹窗

1.1.7测试场景七:登录失败(用户名:zhangsan,输入错误的密码:123)
预期结果:弹出"密码错误"弹窗

1.2注销功能
1.2.1测试场景一:点击注销,注销成功
预期结果:返回用户登录


2.博客管理功能
2.1查看博客列表
2.1.1测试场景一:页面正常打开,用户登录状态下
预期结果:显示个人信息,博客列表(标题,发布时间,内容),"查看全文"按钮

2.2查看博客详情
2.2.1测试场景一:页面正常打开,用户登录状态下,点击"查看全文"按钮
预期结果:显示个人信息,博客详细内容(标题,发布时间,内容)

2.3编辑博客
2.3.1测试场景一:页面正常打开,用户登录状态下,点击"编辑"按钮
预期结果:显示标题、正文输入框,编辑器,"更新文章"按钮

2.3.2测试场景二:更新成功,输入标题,内容,点击"更新文章"按钮
预期结果:返回列表页,保留原始的发布时间,显示更新后的博客标题、内容


2.3.3测试场景三:更新失败,标题为空,点击"更新文章"按钮
预期结果:出现警告弹窗

2.3.4测试场景四:更新失败,内容为空,点击"更新文章"按钮
预期结果:出现警告弹窗

2.3.5测试场景五:更新失败,标题和内容都为空,点击"更新文章"按钮
预期结果:弹出警告弹窗

2.3.6测试场景六:更新失败,输入博客标题和内容,未点击"更新文章"按钮
预期结果:页面没有变化

2.4删除博客
2.4.1测试场景一:删除按钮正常点击
预期结果:弹出"确定删除?"弹窗

2.4.2测试场景二:删除失败,选择取消
预期结果:返回当前页面

2.4.3测试场景三:删除成功,选择确定
预期结果:博客删除成功,返回列表页,博客已被删除


2.5发布博客
2.5.1测试场景一:页面正常打开,用户登录状态下,点击"写博客"
预期结果:显示标题、正文输入框,编辑器,"发布文章"按钮

2.5.2测试场景二:发布成功,输入标题,内容,点击"发布文章"按钮
预期结果:返回列表页,置顶显示的博客标题、内容和发布时间


2.5.3测试场景三:发布失败,标题为空,点击"发布文章"按钮
预期结果:弹出警告弹窗

2.5.4测试场景四:发布失败,内容为空,点击"发布文章"按钮
预期结果:弹出警告弹窗

2.5.5测试场景五:发布失败,标题和内容都为空,点击"发布文章"按钮
预期结果:弹出警告弹窗

2.5.6测试场景六:发布失败,输入博客标题和内容,未点击"发布文章"按钮
预期结果:页面没有变化

3.功能测试结果总结
自动化测试无法涉及到的功能均已通过手动测试补充测试,用例全部通过,个人信息修改功能、注册功能不能实现,暂不影响用户核心使用流程,后续会添加。
四、自动化测试
1.驱动类
python
import sys
from selenium import webdriver
from selenium.webdriver.edge.service import Service
import datetime
import os
#创建一个浏览器对象
class Driver:
driver = ""
def __init__(self):
options=webdriver.EdgeOptions()
edge_driver_path=r"F:\Python\msedgedriver.exe" # 修改为实际路径
self.driver=webdriver.Edge(service=Service(edge_driver_path),options=options)
# self.driver.implicitly_wait(2)
self.driver.implicitly_wait(3) # 等待元素最多10秒
def getScreenShot(self):
#获取屏幕截图
#当前的文件夹,格式:./2026-01-12
driname = datetime.datetime.now().strftime("%Y-%m-%d")
#判断是否存在,不存在则重新创建该文件夹
if not os.path.exists("../images/"+driname):
os.mkdir("../images/"+driname)
#保存的图片路径:../images/2026-01-12/调用方法-2026-01-12-121708.png
filename =sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
self.driver.save_screenshot("../images/"+driname+"/"+filename)
BlogDriver =Driver()
2.登录界面
python
from common.Utils import BlogDriver
from selenium.webdriver.common.by import By
import time
#测试博客登录页面
class BlogLogin:
url=""
driver=""
def __init__(self):
self.url="http://47.108.157.13:8090/blog_login.html"
self.driver =BlogDriver.driver
self.driver.get(self.url)
time.sleep(2)
#成功登录的测试用例
def LoginSucTest(self):
# 需要先清除输入框里面的内容
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("zhangsan")
self.driver.find_element(By.CSS_SELECTOR,'#password').send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,'#submit').click()
#能够找到博客首页的昵称,说明登录成功,否则失败
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
# 添加屏幕截图
# BlogDriver.getScreenShot()
print(f"登录成功!")
# # 退出网站
# self.driver.quit()
#失败登录的测试用例
def LoginFailTest(self):
#(1)正确的账号,错误的密码
# # 需要先清除输入框里面的内容
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("zhangsan")
self.driver.find_element(By.CSS_SELECTOR,'#password').send_keys("123")
self.driver.find_element(By.CSS_SELECTOR,'#submit').click()
#因为弹窗出来的时间比较慢,所以需要加上强制等待时间
time.sleep(2)
# 关闭登录失败产生的弹窗
# 使用switch_to.alert
alert = self.driver.switch_to.alert
# 接受或关闭弹窗
alert.accept() # 点击确定按钮
# 添加屏幕截图
BlogDriver.getScreenShot()
print(f"登录失败!")
# 需要先清除输入框里面的内容
self.driver.find_element(By.CSS_SELECTOR, '#username').clear()
self.driver.find_element(By.CSS_SELECTOR, '#password').clear()
#(2)错误的账号,错误的密码
self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("zhang")
self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
time.sleep(2)
# 关闭登录失败产生的弹窗
# 使用switch_to.alert
alert = self.driver.switch_to.alert
# 接受或关闭弹窗
alert.accept() # 点击确定按钮
# 添加屏幕截图
BlogDriver.getScreenShot()
print(f"登录失败!")
time.sleep(2)
# 需要先清除输入框里面的内容
self.driver.find_element(By.CSS_SELECTOR, '#username').clear()
self.driver.find_element(By.CSS_SELECTOR, '#password').clear()
#(3)错误的账号,正确的密码
self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("zhang")
self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
time.sleep(2)
#关闭登录失败产生的弹窗
# 使用switch_to.alert
alert = self.driver.switch_to.alert
# 接受或关闭弹窗
alert.accept() # 点击确定按钮
# 或者使用 dismiss() 点击取消按钮
# alert.dismiss()
# 添加屏幕截图
# BlogDriver.getScreenShot()
print(f"登录失败!")
# 返回登录页面
# self.driver.back()
# 单个模块测试时可用下面两行代码
# login=BlogLogin()
# login.LoginFailTest()
# login.LoginSucTest()
3.博客首页
python
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客首页
class BlogList:
url=" "
driver=" "
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_login.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
time.sleep(2)
#测试页面(登录情况下)
def ListTestByLoginSuc(self):
#先用正确的账号和密码进行登录
self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
time.sleep(2)
#测试个人信息
#头像
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")
#昵称
#查找昵称时,代码报错
# self.driver.find_element(By.CSS_SELECTOR,"<h3>zhangsan</h3>")
#分类
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > div:nth-child(4) > span:nth-child(2)")
#文章
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)")
#测试博客列表
#博客标题
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")
#"查看全文"按钮
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")
#测试博客功能框
#主页
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)")
#写博客
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)")
#注销
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)")
#添加屏幕截图
# BlogDriver.getScreenShot()
print(f"博客首页(已登录)测试完成!")
# 返回登录页面
self.driver.back()
#测试页面(未登录状态)
def ListTestByLoginFail(self):
#不需要登录,只需要查看未登录页面的元素是否正确
#测试登录界面框
self.driver.find_element(By.CSS_SELECTOR,"body > div.container-login > div")
#测试顶部功能框
# 主页
self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(4)")
# 写博客
self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(5)")
# 添加屏幕截图
# BlogDriver.getScreenShot()
print(f"博客首页(未登录)测试完成!")
# 返回登录页面
self.driver.back()
time.sleep(2)
# # 退出浏览器
# BlogDriver.driver.quit()
# # 单个模块测试时可用下面代码
# login=BlogList()
# login.ListTestByLoginSuc()
# login.ListTestByLoginFail()
4.博客详情页
python
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客详情页面
class BlogDetail:
url=" "
driver=" "
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_login.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
time.sleep(2)
def DetailTestByLoginSuc(self):
# 先用正确的账号和密码进行登录
self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
time.sleep(2)
#点击一篇博客的"查看全文"按键
self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(1) > a').click()
time.sleep(2)
#测试登录状态下的界面元素
#博客标题
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, "#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2")
#编辑按键
self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.operating > button:nth-child(1)")
#删除按键
self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.operating > button:nth-child(2)")
# 添加屏幕截图
# BlogDriver.getScreenShot()
print(f"测试详情页完毕!")
# 返回登录页面
self.driver.back()
# #退出浏览器
# self.driver.quit()
#
# login=BlogDetail()
# login.DetailTestByLoginSuc()
5.博客编辑页
python
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客详情页面
class BlogEdit:
url=" "
driver=" "
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_login.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
time.sleep(2)
#测试博客编辑页(只有登录状态)
def EditTestByLoginSuc(self):
# # 先用正确的账号和密码进行登录
# self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("zhangsan")
# self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys("123456")
# self.driver.find_element(By.CSS_SELECTOR, '#submit').click()
# time.sleep(2)
# 点击一篇博客的"写博客"按键
self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(5)').click()
time.sleep(2)
# 博客页面元素测试
# 标题输入框
self.driver.find_element(By.CSS_SELECTOR,"#title")
# 内容输入框
self.driver.find_element(By.CSS_SELECTOR, "#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll")
# 点击发布按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit")
# 功能界面框
self.driver.find_element(By.CSS_SELECTOR, "#editor > div.editormd-toolbar > div > ul")
# 正常发布博客测试
# 在标题框内写入内容,在内容框内写入内容,点击发布按钮
# 标题输入框
self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("自动化测试")
# 内容输入框
self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll").send_keys("你好你好")
# 点击发布按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 如果正常发布博客成功,则会返回博客首页,此时会出现个人信息。
# 只需要查找是否存在个人头像即可,存在则说明正常发布博客成功
# 头像
self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")
# 异常发布博客测试
# 不写标题写内容
# 点击一篇博客的"写博客"按键
self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(5)').click()
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#title").clear()
self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll").send_keys("你好你好")
# 点击发布按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
#此时会出现弹窗,把弹窗关掉
# 只需查找"发布博客"按键是否存在即可,若存在,说明异常发布博客
time.sleep(2)
alert = self.driver.switch_to.alert
alert.accept()
self.driver.find_element(By.CSS_SELECTOR, "#submit")
#不写内容写标题
# #因为内容框采用的是一个插件,所以不能对其进行清空,故该情况不能算作异常发布博客
# self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(5)').click()
# time.sleep(2)
# self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("自动化测试")
# # self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll").clear()
# self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
# time.sleep(2)
# alert = self.driver.switch_to.alert
# alert.accept()
# self.driver.find_element(By.CSS_SELECTOR, "#submit")
#不点击发布按钮
self.driver.find_element(By.CSS_SELECTOR, 'body > div.nav > a:nth-child(5)').click()
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR, "#title").clear()
self.driver.find_element(By.CSS_SELECTOR,"#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll").send_keys("你好你好")
# 由于没有点击发布按钮,故此时仍然存在该按钮,且没有返回博客首页
self.driver.find_element(By.CSS_SELECTOR, "#submit")
# 添加屏幕截图
# BlogDriver.getScreenShot()
print(f"测试博客编辑页完毕!")
#退出浏览器
# self.driver.quit()
# login=BlogEdit()
# login.EditTestByLoginSuc()
6.启动文件
python
from common.Utils import BlogDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogEdit
#总测试模块
if __name__ == "__main__":
#测试异常登录
BlogLogin.BlogLogin().LoginFailTest()
#测试正常登录
BlogLogin.BlogLogin().LoginSucTest()
#测试博客首页(登录状态)
BlogList.BlogList().ListTestByLoginSuc()
# 测试博客首页(未登录状态)
BlogList.BlogList().ListTestByLoginFail()
#博客详情页测试(只有登录状态)
BlogDetail.BlogDetail().DetailTestByLoginSuc()
#博客编辑页测试(只有登录页面)
BlogEdit.BlogEdit().EditTestByLoginSuc()
#指定浏览器退出
BlogDriver.driver.quit()
7.自动化测试总结
本次基于Selenium框架的博客系统测试,覆盖登录、列表页、详情页、更新、编辑发布模块及未登录/登录两种状态,通过脚本执行功能验证、关键节点截图、断言与弹窗处理确保结果有效,测试全部通过。
五、兼容性测试
1.测试场景一:在Edge浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致




2.测试场景二:在Chrome浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致




3.测试场景三:在手机浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
实际结果:界面不美观,功能能正常使用



六、测试总结
1.Bug描述
使用手机自带的浏览器打开博客系统时,界面并不美观,界面较大,建议适应于手机页面大小。
2.总结
博客系统的测试涵盖功能测试、自动化测试:
-
功能测试验证了登录、博客列表查看、详情浏览、更新及编辑发布等核心功能,未登录权限控制与异常场景(空标题、错误账号)处理均符合预期。
-
自动化测试基于 Selenium 框架与 Edge 浏览器/Chrome浏览器实现全流程脚本执行,关键节点截图留存,测试效率与可追溯性良好。
该博客系统能为用户提供一个简洁、易用的在线写作与分享环境,能满足用户的基本需求。