博客系统测试报告
接个广子:推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。
https://www.captainbed.cn/f1
一、报告基本信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | [我的博客系统] |
| 测试版本 | [网络资源,无版本号] |
| 测试周期 | |
| 测试人员 | [鲜于言悠] |
| 报告撰写人 | [鲜于言悠] |
| 报告日期 | [2026-3-5] |
| 报告版本 | [v1.0] |
二、引言
2.1 编写目的
本测试报告旨在总结博客系统测试阶段的测试工作,分析测试结果。作为一名CSDN博主,想借以此文给广大读者朋友们提供一个测试报告模板,若有不足之处,也希望大家指出。
2.2 项目背景
本项目为从公开网络渠道获取的博客管理系统学习项目,无正式版本号,聚焦博客管理核心场景的功能验证。
项目旨在实现个人博客的基础管理能力,解决博客创作、发布、编辑、删除的全流程管理需求,核心覆盖登录、撰写博客、发表博客、编辑博客、删除博客及退出系统六大核心功能。
为保障系统基础功能可用、流程无阻断,针对上述核心功能模块开展全流程功能测试,验证各操作的正确性与交互逻辑的合理性。
三、测试概述
3.1 测试范围
3.1.1 覆盖的功能模块
- 用户管理模块:用户登录
- 文章管理模块:文章发布、编辑、删除
- 内容展示模块:首页文章列表、文章详情页
3.1.2 未覆盖的功能
- 未实现用户注册功能,用户信息需提前写入数据库
- 用户头像为静态图片,无法自定义设置
- 用户文章数与分类数未在后端动态统计,前端为静态展示
- 文章分类
- 文章搜索
3.2 测试策略
- 功能测试:采用黑盒测试方法,基于需求规格说明书设计测试用例,覆盖核心业务流程和边界场景
- 性能测试:使用自动化测试工具对系统关键页面和接口进行性能测试,评估系统在不同负载下的表现
- 安全性测试:测试系统的用户认证、权限控制、数据传输安全性等
3.3 测试工具
| 工具名称 | 工具用途 | 版本号 |
|---|---|---|
| Postman | 接口测试 | v12.0.4 |
| Selenium | 自动化功能测试 | v4.36.0 |
| JMeter | 性能测试 | v5.6.3 |
四、测试环境
4.1 硬件环境
| 设备类型 | 配置信息 |
|---|---|
| CPU: | AMD Ryzen 5 5600H with Radeon Graphics |
| 内存: | 16.0GB |
| 存储: | 1TB SSD |
4.2 软件环境
| 环境类型 | 配置信息 |
|---|---|
| 操作系统 | Windows 11专业版 |
| 浏览器 | Firefox 148.0 |
| 编程语言 | Python3.9 |
4.3 网络环境
- 测试网络:局域网环境,带宽 100Mbps
- 外网测试:模拟真实用户网络环境,带宽 10Mbps-100Mbps
五、项目系统功能说明
5.1登录功能
- 用户需输入已存在于数据库中的用户名和密码进行登录
- 登录成功后跳转至博客列表页
- 未登录状态下点击"主页"或"写博客"按钮,将强制跳转至登录页
- 用户输入不存在的账号密码,弹出弹窗
5.2博客列表页
-
展示博客的简要信息,包括标题、发布时间、内容概要
-
左侧显示当前登录用户的基本信息(如用户名、文章数、分类数,头像,GitHub地址)
-
右上角提供三个功能按钮:
-
主页:返回博客列表页
-
写博客:跳转至博客编辑页
-
注销:退出当前用户,返回登录页
-
5.3博客详情页
-
左侧显示当前登录用户的基本信息(如用户名、文章数、分类数,头像,GitHub地址)
-
点击列表页中的"查看全文"按钮进入详情页
- 展示博客的完整内容,包括标题、发布时间、作者及正文
-
界面提供5个功能按钮:
- 主页:返回博客列表页
- 写博客:跳转至博客编辑页
- 删除:删除当前博客,删除后返回列表页
- 编辑:编辑当前的博文
- 注销:退出当前用户,返回登录页
5.4博客编辑页
-
登录状态下点击"写博客"按钮进入编辑页
-
用户可输入博客标题与正文内容,正文内容以md形式来写
-
提供一系列的常用操作md文章的操作按键
-
点击"发布文章"按钮后,博客将被保存并发布,随后跳转至博客列表页
-
界面提供三个功能按钮
- 主页
- 写博客
- 注销
5.5测试目标
测试该项目的90%的功能
5.6测试相关信息
5.6.1测试网站
http://47.108.157.13:8090/blog_login.html
5.6.2测试账户
username:zhangsan
password:123456
六、测试安排
| 模块 | 子模块 | 前端 | 开发 | 提测时间 | 测试 | 工时 | 排期 | 进度 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 登陆模块 | 登陆功能 | x | x | 2.5 | x | 0.5d | 2.5 | 测试完成 | |
| 博客列表模块 | 博主信息、博客列表页、导航栏 | x | x | 2.6 | x | 0.5d | 2.6 | 测试完成 | |
| 博客编辑模块 | 博客编辑与发布 | x | x | 2.7 | x | 1d | 2.7 | 测试完成 | |
| 博客详情模块 | 博客详情页 | x | x | 2.8 | x | 0.5d | 2.8 | 测试完成 |
七、测试分类
7.1功能测试






7.2自动化测试
7.2.1登录界面

7.2.2博客列表页

7.2.3博客详细页

7.2.4博客编辑页

7.2.5编写web测试用例
7.2.5.1common.py
python
import datetime
import os
import sys
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
class Driver:
driver=''
def __init__(self):
options = webdriver.FirefoxOptions ()
options.add_argument('--headless')
self.driver = webdriver.Firefox (options=options,service=Service(GeckoDriverManager().install()))# 创建驱动
# self.driver.maximize_window ()# 最大化窗口
# self.driver.implicitly_wait(10)
# self.getSrc()
def getSrc(self):
dirname=datetime.datetime.now().strftime("%Y%m%d")# 目录名
if not os.path.exists('./images/'+dirname):# 创建目录
os.mkdir('./images/'+dirname)
filename=sys._getframe().f_back.f_code.co_name+'-'+datetime.datetime.now().strftime("%Y%m%d%H%M%S")+'.png'# 文件名
# self.driver.save_screenshot(f'../images/{dirname}/'+ filename)# 保存图片
self.driver.save_screenshot(f'./images/{dirname}/'+ filename)
BlogDriver=Driver()# 创建博客驱动
7.2.5.2BlogLogin.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from common import BlogDriver
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)
def logtest(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.XPATH, "//*[@id='password']").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.XPATH, "//*[@id='password']").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
wait=WebDriverWait(self.driver, 10)
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, ".card > img:nth-child(1)")))
self.driver.find_element(By.CSS_SELECTOR, ".card > img:nth-child(1)")
BlogDriver.getSrc()
self.driver.back()
def logfailtest(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.XPATH, "//*[@id='password']").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhansan")
self.driver.find_element(By.XPATH, "//*[@id='password']").send_keys("1234567")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
wait=WebDriverWait(self.driver, 10)
alert=wait.until((expected_conditions.alert_is_present()))
# alert_text=actual.
# print(alert_text)
alert.accept()
BlogDriver.getSrc()
# BlogDriver.getSrc()
# 示例:通过类名定位模态框
# wait=WebDriverWait(self.driver, 10)
# modal = wait.until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, "login-dialog"))).text
# print(modal)
# test = BlogLogin().logfailtest()
7.2.5.3BlogList.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from common import BlogDriver
class BlogList:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_list.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
def listtest(self):
# self.driver.implicitly_wait(10)
wait=WebDriverWait(self.driver, 10)
time.sleep(5)
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "html body div.container div.left div.card img")))
self.driver.find_element(By.CSS_SELECTOR, "html body div.container div.left div.card img")
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "html body div.container div.right div.blog a.detail")))
self.driver.find_element(By.CSS_SELECTOR, "html body div.container div.right div.blog a.detail")
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "html body div.container div.right div.blog div.desc")))
articles=self.driver.find_elements(By.CSS_SELECTOR, "html body div.container div.right div.blog div.desc")
# print(len( articles))
# for article in articles:
# print(article.text)
# assert len(articles) ==10
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "div.blog:nth-child(1) > a:nth-child(4)")))
self.driver.find_element(By.CSS_SELECTOR, "div.blog:nth-child(1) > a:nth-child(4)").click()
title=self.driver.title
# print( title)
assert title == "博客详情页"
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#detail > p:nth-child(1)")))
BlogDriver.getSrc()
# self.driver.quit()
7.2.5.4BlogDetail.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from common import BlogDriver
class BlogDetail:
url = ""
driver = ""
def __init__(self):
self.url = "http://47.108.157.13:8090/blog_detail.html"
self.driver = BlogDriver.driver
title = self.driver.title
if not title=="博客列表页":
self.driver.get(self.url)
def Detailtest(self):
# time.sleep(5)
BlogDriver.getSrc()
self.driver.find_element(By.CSS_SELECTOR, "html body div.container div.right div.content div.title")
self.driver.find_element(By.CSS_SELECTOR, "html body div.container div.right div.content div.date")
# wait = WebDriverWait(self.driver, 10)
# alert=wait.until(expected_conditions.alert_is_present())
# alert.accept()
# first_p_element = wait.until(
# expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, ".operating > button:nth-child(1)")))
# first_p_element.click()
7.2.5.5main.py
python
from BlogLogin import BlogLogin
from BlogList import BlogList
from BlogDetail import BlogDetail
from common import BlogDriver
if __name__ == '__main__':
BlogLogin().logtest()
# BlogLogin().logfailtest()
BlogList().listtest()
BlogDetail().Detailtest()
BlogDriver.driver.quit()
print("测试结束")
7.3性能测试



我们可以看到响应时间和吞吐量成反比
- 响应时间长,吞吐量小或相对稳定,可能系统达到了性能瓶颈。
- 响应时间短,吞吐量大,性能越好

根据线程响应时间图,我们可以看到,存在一个异常,有一个线程一直没有退出
