博客系统测试报告

一 项目简介

这款博客系统面向 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 回归 → 发送企业微信/飞书报告。

相关推荐
老白干10 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙16 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能17 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂18 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study18 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境19 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境19 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12319 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021620 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0020 小时前
一个项目带你入门AI应用开发01
python