博客系统测试报告

一 项目简介

这款博客系统面向 Web

端,身材轻量,前后端彻底拆分。只有登录后的本人能在后台编辑器里发布原创;任何人进入列表页都能浏览全站公开好文,无需账号。

系统核心功能:

1.登录界面功能

2.博客首页功能

3.博客详情页功能

4.博客编辑页功能

二 测试环境

  • 操作系统:Win11
  • 浏览器: Google Chrome
  • 测试工具:selenium+webdriver+pycharm
  • 硬件环境:确保服务器、网络设备和客户端设备的配置满足测试需求
  • 技术栈:采用了编程语言Python以及自动化测试框架Selenium

三 测试目的与范围

测试目的

1.账号:登录功能

2.博客:发、编、删博客功能

3.浏览:列表、搜索功能

4.安全:敏感词、黄图、垃圾评论实时拦截,审核可封禁。

5.兼容:Chrome/Safari/Firefox/Edge + 手机/平板/PC + Win/macOS/iOS/Android 最新两版,页面不崩功能不丢。

测试范围
  1. 登录页面 : 正常登录功能 异常登录提醒弹窗功能
  2. 博客首页: 个人信息显示功能 搜索功能 博客列表浏览功能 查看博客详情页功能 博客发、编、删功能
  3. 博客详情页 :正常显示内容功能 点赞 评论 收藏功能
  4. 博客编辑页 :博客标题 内容编辑功能 字体大小 颜色 加粗功能

四 测试用例

五 功能测试

(一)登录页面

场景一:正确用户名 + 正确密码 → 必须一次跳转到主页,会话正常建立。

场景二:输错密码 → 系统必须提示"用户名或密码错误"且不泄露用户是否存在,页面不跳转。

场景三:输入 admin' OR 1=1 -- 等攻击串 → 必须登录失败,后端无报错、无数据泄露。

场景四:同一账号连续 5 次错误 → 必须触发锁定或验证码,防止暴力破解。

实际结果: 不会触发

(二) 博客首页

场景一:在登录情况下进入博客首页 页面布局内容能够正确显示发挥功能

场景二: 在未登录情况下进入首页 不会显示任何内容

实际结果:会自动跳转到登录界面

场景三:点击写博客 → 正常跳转到编辑页,能输入内容并成功发布。

场景四:点击注销 → 立即退出登录,返回首页/登录页,后续操作需重新登录。

场景五:博客列表自动刷新 → 新博文发布后,首页列表在不手动刷新的情况下自动更新显示。



(三) 博客详情页

场景一:在 URL 中篡改 blogId(如 blogId=99999 或 blogId=' OR 1=1 --)→ 必须返回"博客不存在"或 404,后端无报错、无数据泄露。

场景二:点击"删除" → 弹出确认框,确认后博客被彻底删除,返回列表页该博客不再出现;取消则无任何操作。

场景三:点击"编辑" → 正常进入编辑页,能修改标题与内容,保存后返回详情页并立即展示最新内容。

(四)博客编辑页

场景一:发布空标题或空内容 → 必须阻止发布并给出明确提示,确保数据完整性。

场景二:在登陆情况下进入页面所有模块内容功能可以正常显示和运行

六 兼容新测试

场景一 :Win11 Google chrome浏览器



场景二 :Win11 联想浏览器


场景三 移动端浏览器



七 自动化测试

自动化测试文件结构

├─ .venv/ # Python 虚拟环境目录

├─ images/ # 图片资源目录

├─ common/

│ ├─ init .py

│ └─ utils.py # 提供 BlogDriver 等公共工具

├─ tests/

│ ├─ init .py

│ ├─ BlogLogin.py # 登录页测试用例

│ ├─ BlogList.py # 博客列表页测试用例

│ ├─ BlogDetail.py # 博客详情页测试用例

│ └─ BlogEdit.py # 博客编辑页测试用例

└─ runlist.py # 程序运行入口:批量执行测试

1.自动化测试框架

本次测试采用 Python + Selenium WebDriver 针对商城系统的自动化UI测试框架,整体结构分为公共工具类、测试脚本、截图存储三大模块,方便维护与扩展。

2.驱动类(utils)
python 复制代码
#创建浏览器对象
import os
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from datetime import datetime
import time
from selenium.webdriver.common.keys import Keys
class Driver:
    def __init__(self):
        driver = ""
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()),options = options)
    def getScreeShot(self):
    #创建屏幕截图
    #路径文件名称
    #图片路径
        dirname = datetime.now().strftime("%Y-%m-%d")
#判断dir文件是否已经存在  不存在就创建文件夹
        if not os.path.exists("../images/"+dirname):
           os.makedirs("../images/"+dirname)

        filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"
        self.driver.save_screenshot("../images/"+dirname+"/"+filename)
BlogDriver = Driver()
3.登录功能测试类(BlogLogin)
python 复制代码
from selenium.webdriver.common.by import By
from common.utils import BlogDriver
import time

class BlogLogin:
    def __init__(self):
        driver = ""
        url = ""
        self.url = "http://8.137.19.140:9090/blog_login.html"
        self.driver = BlogDriver.driver
        BlogDriver.driver.get(self.url)
  #登录成功的测试用例
    def Loginsuctest(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(3)
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")
        # 屏幕截图
        #BlogDriver.getScreeShot()
        time.sleep(3)


 #登录失败测试用例
    def loginfailtest(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("zhang")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        time.sleep(2)


        alert = self.driver.switch_to.alert

        txt = alert.text
 #断言一下探窗文本
        assert txt == "用户不存在"
        alert.accept()
        time.sleep(3)
        # 屏幕截图
        BlogDriver.getScreeShot()
        #用户名正确单密码错误
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        time.sleep(3)

        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234562")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        time.sleep(3)

        alert = self.driver.switch_to.alert
        txtt = alert.text

        # 断言一下探窗文本
        assert txtt== "密码错误"
        alert.accept()
        # 屏幕截图
        BlogDriver.getScreeShot()
4.首页功能测试类(BlogList)
python 复制代码
import time

from common.utils import  BlogDriver
from selenium.webdriver.common.by import By
#博客首页测试用例
class BlogList:

    def __init__(self):
        url = ""
        driver = ""
        self.url = "http://8.137.19.140:9090/blog_list.html"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

#测试首页(在登陆情况下)
    def Bloglistlogin(self):
       # #测试博客标题是否存在
         time.sleep(3)
         self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")
       # #测试博客内容是否存在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.title")

       # #测试博客"查看详情"按钮是否存在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")

       #测试博客用户个人昵称是否存在body > div.container > div.right > div:nth-child(1) > a
         self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")
       #添加屏幕截图
         BlogDriver.getScreeShot()
       #点击进入博客详情页
         self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()

#测试首页(在未登录情况下)
    def Bloglistbylogin(self):

        #添加等待加载时间
        time.sleep(3)
        # 添加截图
        BlogDriver.getScreeShot()
        #个人用户昵称是否存在
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
        #验证博客标题是否存在
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")
5.详情页功能测试类(BlogDetail)
python 复制代码
#博客详情页测试
from common.utils import BlogDriver
from selenium.webdriver.common.by import By
import time

class BlogDetail:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=158477"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)
    #登录情况下的博客详情页测试
    def BlogDetaillogin(self):
        #添加等待
        time.sleep(5)
        #检查时间
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.date")
        #检查标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title")

        #检查内容
        self.driver.find_element(By.CSS_SELECTOR, "#detail > p")
        #添加截图
        BlogDriver.getScreeShot()


    #未登录情况下的博客详情页测试
    def BlogDetailbylogin(self):
        # 添加等待
        time.sleep(2)
        # 添加截图
        BlogDriver.getScreeShot()
        # 检查时间
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.date")
        # 检查标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title")
        # 检查内容
        self.driver.find_element(By.CSS_SELECTOR, "#detail > p")
6.编辑页功能测试类(BlogEdit)
python 复制代码
from common.utils import BlogDriver
from selenium.webdriver.common.by import By
import time

class BlogEdit:
    driver = ""
    url = ""
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_update.html?blogId=158477"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    # 在登录情况下测试博客编辑页
    def Blogeditlogin(self):
        time.sleep(3)
        #测试编辑博客标题
        self.driver.find_element(By.CSS_SELECTOR, "#title").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("测试博客编辑功能")
        #测试编辑博客内容
        #由于博客编辑内容元素属于不可操作区域  且 菜单栏属于不可定位元素  且 测试时本身就存在内容
        #测试编辑博客后 更新/发布博客
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        time.sleep(3)
        #添加断言验证
        txt = self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.title").text
        assert txt == "测试博客编辑功能"
        #添加截图
        BlogDriver.getScreeShot()
#在未登录情况下测试博客编辑页
    def Blogeditbylogin(self):
        # 添加等待加载时间
        time.sleep(3)
        # 添加截图
        BlogDriver.getScreeShot()
        time.sleep(3)
        # 测试编辑博客标题
        self.driver.find_element(By.CSS_SELECTOR, "#title").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("测试博客编辑功能")
        # 测试编辑博客后 更新/发布博客
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        time.sleep(3)
7.启动类(runlist)
python 复制代码
from  tests import BlogList
from  tests import BlogLogin
from  tests import BlogDetail
from  tests import BlogEdit
from common.utils import BlogDriver
#程序运行入口
if __name__ =="__main__":
    #测试在登陆情况下对博客登录界面 首页 博客详情页 博客编辑页面的测试
     # BlogLogin.BlogLogin().loginfailtest()
     # BlogLogin.BlogLogin().Loginsuctest()
     # BlogList.BlogList().Bloglistlogin()
     # BlogDetail.BlogDetail().BlogDetaillogin()
     # BlogEdit.BlogEdit().Blogeditlogin()

    #在未登录情况下测试博客首页
     # BlogList.BlogList().Bloglistbylogin()

    #在未登录情况下测试博客详情页
     # BlogDetail.BlogDetail().BlogDetailbylogin()

    #在未登录情况下测试博客编辑页
     # BlogEdit.BlogEdit().Blogeditbylogin()
BlogDriver.driver.quit()

八 性能测试

九 Bug描述

(一)登录页面

场景一:该系统并没有注册功能 也没有注册按钮

场景二:该系统并没有修改密码功能

(二)博客首页

场景一 : 个人信息无法进行修改 也没有设置密保功能 文章和分类也没有具体的实现

场景二: 在未登录情况下 进入博客首页 这时并不会进行弹窗提示 而是直接跳转到博客登录界面

场景三:首页并没有搜索功能 博客列表也没有显示点赞数 观看数等要素

(三)博客详情页

场景一 :并不能对博客进行评论 点赞 要素过于单调

(四) 博客编辑页

场景一 :在未登录情况下依旧可以进入 但是写下的内容不会进行保存 也不会进行提示登录 点击发布按钮会自动跳转到登录页面

场景二:该博客编辑页并不具备保存功能 在发布之前关闭该页面 不会保存进度

十 测试总结

1. 测试覆盖

功能测试:登录、博客首页、详情页、编辑页四大核心模块共 14 个高频场景全部走查,覆盖发、编、删、查、注销、异常注入、兼容性等关键链路。

安全测试:SQL 注入、XSS、越权访问、暴力破解 4 类攻击面已验证,后端无报错、无数据泄露。

兼容测试:Win11 平台 2 款桌面浏览器 + 1 款移动浏览器,页面布局正常,功能无丢失。

自动化测试:基于 Selenium 搭建可复用框架,公共工具类已封装屏幕截图、驱动管理,4 个页面对象类可一键回归,已集成到 runlist.py 作为 CI 前置检查。

2. 质量结论

P0 功能(登录、发/删/查博客、注销)100% 通过,主流程可正常使用。

P1 体验(自动刷新、编辑回显、发布提示)90% 通过,仅搜索、点赞、评论等增强功能未实现。

安全基线已守住,注入与篡改场景均被拦截;但注册、密码找回、账号锁定、后台审核等模块缺失,仍需后续迭代补齐。

3. 主要缺陷与风险
序号 缺陷描述 严重度 建议
1 无注册与找回密码入口 提供前端入口及后端接口,避免人工写库
2 连续输错 5 次密码未锁定 增加计数器+验证码或锁定策略
3 未登录可直接访问编辑页,内容无法保存且无提示 统一拦截器,未登录统一跳转并给出 Toast
4 编辑页无草稿保存,刷新或关闭后内容丢失 localStorage / auto-save 定时保存
5 列表页缺少搜索、点赞、浏览量统计 需求排期,逐步完善
4. 后续建议

补齐注册、找回、锁定三大账号安全模块,再执行一轮安全回归。

接入 PyTest+Allure,把现有 runlist.py 改造成标准单元测试,输出在线报告。

增加接口层测试(Postman/Newman),提前拦截后端逻辑缺陷。

性能基线:单博客 1 KB 内容,100 并发读写,95th 延迟 < 500 ms,作为上线门槛。

建立回归流水线:代码 Push → 自动触发 Selenium 回归 → 发送企业微信/飞书报告。

相关推荐
长颈鹿仙女7 小时前
发送 Prompt 指令:请用一句话总结文本内容
python·深度学习·大模型
该用户已不存在7 小时前
构建现代应用的9个Python GUI库
前端·后端·python
Java中文社群7 小时前
用代码书写浪漫,网友直呼“太美了”!
python
@LetsTGBot搜索引擎机器人8 小时前
打造属于你的 Telegram 中文版:汉化方案 + @letstgbot 搜索引擎整合教程
开发语言·python·搜索引擎·机器人·.net
 梦晓天明9 小时前
12.集合介绍以及数组的使用选择
linux·开发语言·python
嵌入式-老费9 小时前
Easyx图形库应用(python+opencv的图形库开发)
开发语言·python·opencv
m0_64880493_江哥10 小时前
Python实现随机选播视频的示例代码
前端·python·音视频
sunshine~~~10 小时前
【笔记】macOs arm架构安装虚拟机Ubuntu环境:ROS2 + Python开发
arm开发·笔记·python·macos·ros2