博客系统测试报告

博客系统测试报告

接个广子:推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。
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性能测试

我们可以看到响应时间和吞吐量成反比

  • 响应时间长,吞吐量小或相对稳定,可能系统达到了性能瓶颈。
  • 响应时间短,吞吐量大,性能越好

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

相关推荐
全栈凯哥2 小时前
13.Python中while循环完全指南
python
所谓伊人,在水一方3332 小时前
【Python数据可视化精通】第9讲 | 实时数据流可视化
开发语言·python·信息可视化·数据分析·pandas
困死,根本不会2 小时前
Python 基础语法速通:从入门到上手
windows·笔记·python·学习
无风听海2 小时前
深入解析 Python dotenv
网络·python·rpc
埋头编程~2 小时前
【测试报告】网页端博客系统
功能测试·压力测试·性能测试·测试
在屏幕前出油2 小时前
02. FastAPI——路由
服务器·前端·后端·python·pycharm·fastapi
AC赳赳老秦2 小时前
2026多智能体协同趋势:DeepSeek搭建多智能体工作流,实现复杂任务自动化
人工智能·python·microsoft·云原生·virtualenv·量子计算·deepseek
阿_旭3 小时前
基于YOLO26深度学习的风力机缺陷检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·风力机缺陷检测
郝学胜-神的一滴3 小时前
深度解析:Python元类手撸ORM框架,解锁底层编程魔法
数据结构·数据库·python·算法·职场和发展