ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

博客系统~~测试报告

博客系统~~测试报告 一、项目背景本简易博客系统为面向个人用户的轻量化内容发布平台主要支持用户注册登录、个人信息管理、博文编辑、草稿保存、文章发布与浏览、评论互动等核心功能可满足个人日常博文记录、内容整理与分享的使用需求。为保障系统功能稳定、流程合规、交互正常我独立负责本次系统全流程测试工作覆盖功能、兼容性、接口、安全等多项测试维度全面验证系统各项业务逻辑与使用场景排查潜在缺陷确保系统整体运行满足上线使用标准。二、项目简介2.1 核心业务模块登录模块账号密码登录对空输入、错误账号密码、前后空格输入做校验博客首页展示全部已发布博文展示博文标题、内容摘要博文编辑模块跳转编辑页面填写博文标题、博文正文内容博文发布模块提交编辑内容完成发布发布成功后博文同步展示到首页2.2 测试环境项目详情被测系统简易博客 Web 端浏览器Chrome 128操作系统Windows11手工测试工具Chrome 浏览器自动化技术栈Python SeleniumBug 管理禅道本地文档记录测试类型功能测试、UI 自动化测试、回归测试三、测试计划模块之间存在数据耦合登录后才能编辑发布文章发布的文章数据回显首页采用整体提测全部功能开发完成后统一进入测试Bug 修复完成后执行全量回归测试。功能模块后端开发前端开发提测日期测试人员测试开始时间测试完成时间测试结果登录功能开发 A开发 B2026‑09‑12杨容2026‑09‑132026‑09‑13通过博客首页开发 A开发 B2026‑09‑12杨容2026‑09‑142026‑09‑14通过博文编辑功能开发 A开发 B2026‑09‑12杨容2026‑09‑152026‑09‑15通过博文发布功能开发 A开发 B2026‑09‑12杨容2026‑09‑162026‑09‑16通过全量回归测试开发 A开发 B2026‑09‑12杨容2026‑09‑172026‑09‑17通过四、测试内容手动对项目功能进行Web的基本功能测试1.1 如何设计测试用例设计设计测试用例一般从6个方面进行设计针对这套 Web 端简易博客系统设计测试用例时我主要从六大测试维度开展设计分别为功能测试、界面 UI 测试、性能测试、易用性测试、安全性测试以及兼容性测试。由于该项目属于个人 Web 博客站点测试过程中会重点聚焦业务核心功能开展验证。1.2设计个人博客系统测试用例思维导图如下基于个人博客系统的页面进行功能测试设计1.3登录模块正向正确账号密码登录成功跳转博客首页反向账号为空密码为空账号错误密码错误账号密码前后带空格输入1.4博客首页登录的博客首页正常展示标题、内容多条博客正常列表展示1.5博客编辑模块执行多组边界输入测试正常输入标题与正文、标题为空、正文为空、标题超长输入、特殊符号输入系统各项校验逻辑符合需求测试成功1.6博客发布模块对博客发布功能进行验证完整填写标题与正文博客可正常发布当标题为空、正文为空时系统触发校验禁止提交发布博客发布成功后首页页面实时刷新可展示刚新增的博文内容。1.7博客退出模块在博客列表页点击”退出“按钮之后会跳转到博客登录界面此时界面中的账号和密码输入框中的数据被清空可以正常登录。自动化对项目功能进行Web的基本功能测试1.1配置运行环境安装两个库在命令行输入即可pip install webdriver-managerpip install selenium创建项目解释器类型选择 Custom environment单选框切换为 Select existing可复用已装好的 selenium、webdriver-managerCreate a welcome script可以让项目干净一点创建好一个新的项目后鼠标点击左上角的File选中里面的Steeings如果Steeings里面没有两个库就点加号下载选择下载就行了添加好后再次查看就行我们一共要测试五个页面博客首页、登录页、列表页、详情页、编辑页。如果每个页面的测试脚本都重复写创建驱动、打开网址的代码会反复创建浏览器驱动浪费系统资源。 所以做了代码抽离把驱动创建、页面访问这类通用逻辑放到common公共包各个页面独立的测试用例代码统一放在test测试包。1.2创建驱动对象commonUtils.py 文件中封装了Driver 工具类该类中包含两个核心方法浏览器驱动初始化方法用于创建 Chrome 浏览器驱动对象、设置隐式等待统一完成浏览器启动配置自动截图方法可自动创建日期命名的截图文件夹、根据测试方法名和系统时间生成截图文件实现测试场景自动截图功能。#创建一个浏览器对象 import os import datetime import sys from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager class Driver: driver def init(self): options webdriver.ChromeOptions() self.driver webdriver.Chrome(serviceService(ChromeDriverManager().install()),optionsoptions) self.driver.implicitly_wait(2) # 创建截图函数 def getScreeShot(self): # 首先在上一级路径创建一个文件夹命名为mage当天的年月 # 创建之前判断文件夹是否存在 dirname datetime.datetime.now().strftime(%Y-%m-%d) # 首先要判断dirname是否存在 if not os.path.exists(../mage/ dirname): #os.mkdir(../mage/ dirname) os.makedirs(../mage/ dirname, exist_okTrue) # sys._getframe().f_back.f_code.co_name 获取调用函数的方法名字 # 图片名字Logintest-2025-3-23-123409 filename sys._getframe().f_back.f_code.co_name - datetime.datetime.now().strftime( %Y-%m-%d-%H-%M-%S) .png # 利用驱动对象调用截图函数 self.driver.save_screenshot(../mage/ dirname / filename) BlogDriver Driver()1.3博客登录自动化测试BlogLogin测试文件from selenium.webdriver.common.by import By import time from common.Utils import BlogDriver #测试登录页面 class BlogLogin: # url # driver def __init__(self): self.driver BlogDriver.driver self.url http://47.108.157.13:9090/blog_login.html self.driver.get(self.url) #成功登录的测试函数 def LoginSuess(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) #登录后截图 BlogDriver.getScreeShot() #登录后要核对用户基本信息看是否相同 #用户基本信息的昵称 name self.driver.find_element(By.CSS_SELECTOR,body div.container div.left div h3).text # 用户基本信息的文章 textq self.driver.find_element(By.CSS_SELECTOR, body div.container div.left div div:nth-child(4) span:nth-child(1)).text # 用户基本信息的分类 artilce self.driver.find_element(By.CSS_SELECTOR, body div.container div.left div div:nth-child(4) span:nth-child(2)).text time.sleep(3) assert name zhangsan assert artilce 分类 assert textq 文章 #登录完了回退登录页面 #self.driver.back() # 登录完了回退登录页面 self.driver.back() #登录失败函数 def LoginFail(self): # 输入框可能有账号密码清空输入框 self.driver.find_element(By.CSS_SELECTOR, #username).clear() self.driver.find_element(By.CSS_SELECTOR, #password).clear() time.sleep(1) # 输入错误账号密码 self.driver.find_element(By.CSS_SELECTOR, #username).send_keys(zhangsan1) self.driver.find_element(By.CSS_SELECTOR, #password).send_keys(1234561) self.driver.find_element(By.CSS_SELECTOR, #submit).click() time.sleep(2) # 检验登录失败弹窗核心代码 alert self.driver.switch_to.alert # 切换到弹窗 print(弹窗提示文本, alert.text) # 拿到弹窗文字打印出来 # 断言判断弹窗文字是不是预期的“用户不存在” assert alert.text 用户不存在 alert.accept() # 点击弹窗的【确定】关闭弹窗才能继续后续操作 # 登录失败后截图 BlogDriver.getScreeShot() time.sleep(3) if __name__ __main__: BlogDriver.init() login BlogLogin() login.LoginSuess() login.LoginFail()Runtest文件from common.Utils import BlogDriver from test import BlogLogin if __name__ __main__: BlogDriver.init() #先启动浏览器 loginBlogLogin.BlogLogin() login.LoginSuess()#登录成功 login.LoginFail()#登录失败运行顺序是BlogDriver.init()→ 启动 Chrome 浏览器给BlogDriver.driver赋值成浏览器对象loginBlogLogin.BlogLogin()→ 进入 BlogLogin 构造方法拿到已经启动好的 driver执行 LoginSuess 登录成功用例执行 LoginFail 登录失败用例可以图片文件夹有图片1.4博客页表自动化测试Bloglist测试文件import time from selenium.webdriver.common.by import By from common.Utils import BlogDriver class BlogList: def __init__(self): self.driver BlogDriver.driver self.url http://47.108.157.13:9090/blog_list.html self.driver.get(self.url) #登录状态博客列表页用例 def BlogLoginList(self): # 检查第一篇博客标题 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.container div.left div h3) # 用户文章数量 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.left div div:nth-child(4) span:nth-child(2)) # 截图 BlogDriver.getScreeShot() # 未登录状态访问列表页 def NotBlogLoginListTest(self): # 直接访问博客列表地址此时浏览器没有登录cookie self.driver.get(http://47.108.157.13:9090/blog_list.html) time.sleep(2) BlogDriver.getScreeShot() # 核心断言验证跳转登录页面 assert blog_login.html in self.driver.current_url # 登录状态测试注销退出功能 def QuitBlogLoginList(self): # 点击注销按钮 self.driver.find_element(By.CSS_SELECTOR, body div.nav a:nth-child(6)).click() BlogDriver.getScreeShot() # 获取页面标题、url Quittitle self.driver.title QuitUrl self.driver.current_url print(页面标题,Quittitle) print(页面地址,QuitUrl) # 断言跳转登录页 assert Quittitle 博客登陆页 assert QuitUrl http://47.108.157.13:9090/blog_login.html # input输入框取值重点要用get_attribute(value) Quitusername self.driver.find_element(By.CSS_SELECTOR, #username).get_attribute(value) Quitpassword self.driver.find_element(By.CSS_SELECTOR, #password).get_attribute(value) print(账号框内容 Quitusername) print(密码框内容 Quitpassword) assert Quitusername assert Quitpassword def QuitBlog(self): # 注销退出登录 # 假设页面上退出按钮id或者css选择器你换成你页面真实的 time.sleep(1) self.driver.find_element(By.CSS_SELECTOR, body div.nav a:nth-child(6)).click() time.sleep(1) # 断言退出成功跳转到登录页面 print(当前页面地址, self.driver.current_url) assert blog_login.html in self.driver.current_url BlogDriver.getScreeShot() # 截图 time.sleep(2)Runtest文件from common.Utils import BlogDriver from test import BlogLogin from test import BlogList if __name__ __main__: BlogDriver.init() #先启动浏览器 loginBlogLogin.BlogLogin() login.LoginSuess()#登录成功 # login.LoginFail()#登录失败 # 2.登录成功后校验博客列表页面元素 bloglist BlogList.BlogList() bloglist.BlogLoginList() # 3.测试注销退出 bloglist.QuitBlogLoginList() # 4.注销之后现在浏览器处于【未登录状态】执行权限测试 bloglist.NotBlogLoginListTest()BlogLoginList登录成功后查看列表页面元素展示是否正常NotBlogLoginListTest未登录直接访问列表页面测试权限拦截QuitBlogLoginList登录后执行退出校验注销功能函数前置状态测试目的BlogLoginList✅已登录停留在博客列表页校验博客列表页面 UI 元素正常渲染博客标题、发布时间、博文简介、查看全文按钮、用户昵称、文章 / 分类数量正常展示NotBlogLoginListTest❌无登录态直接访问列表 URL权限控制测试测试未登录的用户直接输入博客列表地址校验系统能不能拦截自动跳到登录页面。QuitBlogLoginList✅已登录停留在博客列表页注销功能测试点击注销按钮验证登录态清除、页面成功跳转登录页登录表单输入框清空1.4博客详情页面自动化测试Blogdtailimport time from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from common.Utils import BlogDriver class BlogDetail: # driver # url def __init__(self): self.driver BlogDriver.driver # 一篇博客的url self.url http://47.108.157.13:9090/blog_detail.html?blogId127 self.driver.get(self.url) def BlogLoginDetailTest(self): 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, #detail) # 检查一下用户基本信息的昵称是否存在 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.left div div:nth-child(4) span:nth-child(1)) # 检查一下用户基本信息的分类是否存在 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.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.getScreeShot() time.sleep(2)Runtest文件from common.Utils import BlogDriver from test import BlogLogin from test import BlogDtail #from test.BlogDtail import BlogDtail if __name__ __main__: BlogDriver.init() #先启动浏览器 loginBlogLogin.BlogLogin() login.LoginSuess()#登录成功 # login.LoginFail()#登录失败 blogdtailBlogDtail.BlogDetail() blogdtail.BlogLoginDetailTest()BlogLoginDetailTest已登录在博客列表页面点击博文进入详情页校验博客标题、发布时间、正文、编辑、删除按钮正常展示1.6博客编辑自动化Blogeditimport time from selenium.webdriver.common.by import By from common.Utils import BlogDriver class BlogEdit: driver url def __init__(self): self.driver BlogDriver.driver # 博客编辑/新增博文页面 self.url http://47.108.157.13:9090/blog_edit.html self.driver.get(self.url) def BlogLoginEditTest(self): # 登录状态新增一篇博客填写标题 self.driver.find_element(By.CSS_SELECTOR, #title).send_keys(自动化测试) # 富文本编辑器菜单栏为第三方组件暂时不做元素校验 time.sleep(1) BlogDriver.getScreeShot() # 点击发布文章按钮 self.driver.find_element(By.CSS_SELECTOR, #submit).click() # 等待页面跳转完成防止代码执行快于页面加载导致元素定位失败 time.sleep(1) # 获取跳转后的页面地址校验是否成功跳转到博客列表页 jumpurl self.driver.current_url print(jumpurl) assert jumpurl http://47.108.157.13:9090/blog_list.html # 获取列表第一条博文标题校验刚刚发布的文章成功展示 articl self.driver.find_element(By.CSS_SELECTOR, body div.container div.right div:nth-child(1) div.title).text print(articl) assert articl 自动化测试 def NotBlogLoginEditTest(self): #清空cookie模拟全新未登录用户 self.driver.delete_all_cookies() print(访问编辑页后实际url, self.driver.current_url) # 权限控制测试未登录用户直接访问博客编辑页面URL self.driver.get(http://47.108.157.13:9090/blog_edit.html) time.sleep(1) BlogDriver.getScreeShot() # 断言未登录访问编辑页系统拦截并自动跳转登录页面 assert blog_login.html in self.driver.current_url # 判断当前浏览器地址里面 ** 是否包含blog_login.html **。 # 如果包含 → 断言通过符合预期权限拦截生效 # 如果不包含 → 断言报错BUG没拦住未登录直接进到编辑页面了Runtestfrom common.Utils import BlogDriver from test import BlogLogin from test import Blogedit #from test.BlogDtail import BlogDtail if __name__ __main__: BlogDriver.init() #先启动浏览器 loginBlogLogin.BlogLogin() login.LoginSuess()#登录成功 # login.LoginFail()#登录失败 # 新增博客编辑发布 blogedit Blogedit.BlogEdit() blogedit.BlogLoginEditTest()函数前置状态测试目的BlogLoginEditTest✅已登录进入博文编辑页新增博客文章填写标题并发布校验发布成功后跳转列表页列表展示新发布文章NotBlogLoginEditTest❌无登录态直接访问编辑页 URL验证未登录用户访问博文编辑页面时系统是否强制拦截并自动跳转至登录页面1.7全量回归测试from common.Utils import BlogDriver from test import BlogLogin from test import BlogList from test import BlogDtail from test import Blogedit if __name__ __main__: # 初始化浏览器 BlogDriver.init() print(开始执行全量回归测试) #1.登录模块 loginBlogLogin.BlogLogin() login.LoginSuess() #2.博客列表模块 bloglist BlogList.BlogList() bloglist.BlogLoginList() #3.博客详情模块 blogdetail BlogDtail.BlogDetail() blogdetail.BlogLoginDetailTest() #4.博文编辑发布模块 blogedit Blogedit.BlogEdit() blogedit.BlogLoginEditTest() #5.注销退出 bloglist.QuitBlog() #6.权限控制测试2个页面未登录拦截 bloglist.NotBlogLoginListTest() blogedit.NotBlogLoginEditTest() print(全量回归测试执行完毕全部用例通过) BlogDriver.driver.quit()登录 → 列表 → 详情 → 发布文章 → 注销页面跳登录页 →【执行权限用例前delete_all_cookies 清空cookie】 → 未登录访问列表页 →【delete_all_cookies 清空cookie】 → 未登录访问编辑页全量回归测试将博客系统所有核心业务流程串联覆盖正向业务场景与权限逆向场景一次性执行整套自动化用例。执行顺序登录系统 → 进入博客列表 → 查看博文详情 → 编辑发布新博客→ 执行账号注销页面跳转至登录页面。关键要点仅页面跳转登录无法清除浏览器会话 Cookie会导致权限用例误判。因此执行逆向权限用例前调用delete_all_cookies()清空 Cookie模拟完全未登录的访客环境。 接着执行两条权限校验用例无登录态直接访问博客列表页验证系统强制拦截自动跳转登录页面无登录态直接访问博文编辑页验证系统强制拦截自动跳转登录页面所有用例执行完毕关闭浏览器自动化全量回归结束五、BUG 统计简述Bug 标题Bug 等级报告人是否修复文章标题输入超长字符无校验提示可直接提交P2一般测试人员已修复登录账号密码首尾空格未做过滤带空格可以登录成功P2一般测试人员已修复Bug 级别统计P0崩溃阻断0P1严重0P2一般2 个本次测试总共发现 2 个一般级别 bug无阻断上线 bug开发全部修复完成手工 自动化回归验证 bug 修复有效。六、遗留问题本次迭代版本无遗留问题 后续优化方向后续版本迭代可以扩展自动化脚本增加更多异常场景自动化用例。七、测试结论简易博客系统完成手工功能测试 UI 自动化测试 全量回归测试手工测试执行 32 条功能用例自动化脚本实现 5 条核心业务用例覆盖登录、编辑、发布博文完整链路发现 bug 共 2 个P2 级别全部修复完成并回归验证不存在 P0、P1 阻断类缺陷系统登录、浏览博文、编辑发布博文核心业务满足需求测试通过可以上线。自动化脚本可用于后续版本快速回归提升测试效率。
返回列表