个人博客系统测试 一、项目测试背景本次测试对象为基于SSM 框架开发的个人博客系统系统包含五大核心页面用户登录页面博客列表页面博客详情页面博客编辑 / 发布页面注销退出相关页面测试目标全面验证系统功能正确性、流程完整性、权限控制、页面交互并在此基础上开展Selenium Web 自动化测试与JMeter 接口性能测试确保系统可稳定支撑用户登录、写博客、删博客、查看博客、退出登录等核心操作。系统可实现用户登录验证、博客发布与删除、博客列表展示、详情查看、发布等功能二、手动 Web 功能测试2.1 测试用例设计方法测试用例从六大维度设计功能测试界面测试性能测试易用性测试安全测试兼容性测试2.2 测试用例思维导图围绕五大页面梳理测试点登录、列表、详情、编辑发布、删除、退出等模块形成完整覆盖。2.3 登录页面测试测试账号zhangsan / 123456覆盖场景与预期结果正确账号 正确密码 → 成功跳转到博客列表页正确账号 错误密码 → 提示 “账号或密码错误”错误账号 正确密码 → 提示 “账号不存在”错误账号 错误密码 → 提示 “账号不存在”账号 / 密码为空 → 提示 “账号或密码不能为空”所有场景实际结果与预期一致登录逻辑正常。2.4 博客列表页面测试简介在登录页面在对应的输入框输入正确的账号和密码后会跳转到博客列表页面可以看到当前登录的用户昵称和发布文章数量还有分类列表区可以看到已发布博客文章信息包括标题、时间、博客内容等信息登录成功后进入列表页可正常展示页面元素完整、布局正常、数据读取正确。2.5 博客详情页面测试简介博客详情页里面有当前登录用户的昵称和发布文章的数量和分类的数量可以看到可以发布的博客文章的标题发布博客的时间和博客的内容权限如果查看的文章是当前用户自己发布的那么当前用户对这篇文章的权限是读写修改删除等如果查看的文章是其他用户发布的那么当前用户对文章的权限只能是只读。2.6 博客编辑页面测试简介在博客列表页右上角点击”写博客“即可进入博客编辑页面此时可以进行新博客的写入操作。2.6.1 发布博客测试值得注意的是博客的标题或内容不能为空否则会发布失败弹出窗口提示2.6.2 删除博客测试简介在博客列表页点击任意一篇发布的文章查看全文按钮就可以进去到该篇博客的详情页然后点击博客详情页里面的删除按钮页面就会跳转到博客列表页并且该片博客会被删除博客数量-1。在博客列表页点击查看全文跳转到博客详情页跳转到博客详情页点击删除按钮2.7 退出登录测试简介在博客列表页点击”退出“按钮之后会跳转到博客登录界面此时界面中的账号和密码输入框中的数据被清空可以正常登录。点击右上角 “退出” 按钮三、Selenium Web 自动化测试Python3.1 自动化测试简介Selenium 是主流 Web 自动化工具配合webdriver-manager可自动管理浏览器驱动避免手动更新驱动的麻烦。需要安装Python PyCharmselenium4.0.0webdriver-manager4.0.13.2 项目结构设计为提高复用性与维护性采用模块化结构common/Utils.py驱动初始化、自动截图公共方法tests/存放各页面测试脚本RunTest.py统一执行入口3.3 公共驱动与截图封装python运行import os import sys import datetime from selenium import webdriver from webdriver_manager.microsoft import EdgeChromiumDriverManager from selenium.webdriver.edge.service import Service class Driver: driver def __init__(self): options webdriver.EdgeOptions() self.driver webdriver.Edge(serviceService(EdgeChromiumDriverManager().install()), optionsoptions) self.driver.implicitly_wait(2) # 自动截图按函数名时间命名 def GetScreeShot(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(../images/ dirname / filename) BlogDriver Driver()3.4 登录自动化测试python运行import 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 BlogLogin: def __init__(self): self.driver BlogDriver.driver self.url http://8.137.19.140:9090/blog_login.html self.driver.get(self.url) # 成功登录 def BlogSucText(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() BlogDriver.GetScreeShot() # 失败登录异常场景 def BlogFailText(self): self.driver.back() time.sleep(1) 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(lisi) self.driver.find_element(By.CSS_SELECTOR, #password).send_keys(123) self.driver.find_element(By.CSS_SELECTOR, #submit).click() wait WebDriverWait(self.driver, 2) wait.until(EC.alert_is_present()) alert self.driver.switch_to.alert assert alert.text 密码错误 alert.accept() BlogDriver.GetScreeShot()3.5 列表页自动化测试验证登录 / 未登录状态下列表页元素是否正常标题、时间、摘要、查看全文按钮用户信息、文章数量、分类数量退出登录后页面跳转与清空效果python运行from selenium.webdriver.common.by import By from common.Utils import BlogDriver import time class BlogList: def __init__(self): self.driver BlogDriver.driver self.driver.get(http://8.137.19.140:9090/blog_list.html) def BlogLoginListTest(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) BlogDriver.GetScreeShot() def QuitBlogLoginListText(self): self.driver.find_element(By.CSS_SELECTOR, body div.nav a:nth-child(6)).click() BlogDriver.GetScreeShot() assert self.driver.title 博客登陆页3.6 详情页与删除功能自动化检查标题、内容、编辑 / 删除按钮点击删除→弹窗确认→验证返回列表页3.7 编辑发布自动化输入标题→发布→验证跳转与标题正确性3.8 运行入口 RunTest.pypython运行from tests import BlogLoginTest, BlogListTest, BlogDetailTest, BlogEditTest from common.Utils import BlogDriver if __name__ __main__: login BlogLoginTest.BlogLogin() login.BlogSucText() login.BlogFailText() list_page BlogListTest.BlogList() list_page.BlogLoginListTest() list_page.QuitBlogLoginListText() BlogDriver.driver.quit()3.9 自动化测试优势模块化结构易维护、易定位问题统一驱动管理减少性能消耗隐式 / 显式等待提升稳定性自动截图便于报错回溯可重复执行节省人力四、JMeter 性能测试4.1 测试前准备先用 Postman 调试接口再在 JMeter 中配置登录接口博客列表接口用户信息接口博客详情接口添加博客接口4.2 关键配置HTTP 请求默认值统一 IP、端口、协议JSON 提取器提取登录 token、blogIdHTTP 信息头管理器添加Content-Type: application/json、tokenJSON 断言自动校验返回结果CSV 数据文件设置多账号参数化登录HTTP Cookie 管理器自动维护会话4.3 压测执行使用梯度压测线程组逐步加压观察活跃线程数响应时间特别注意一下圈起来那里都快结束了响应时间还这么长说明退出的时候没有得到响应一直退出不了我这个进程发送了请求但是服务器一直没有给到反馈吞吐量erm其实响应时间和吞吐量是有一定关系的响应时间增加了服务器就有了压力这个时间服务器处理的并发数量是有限的所以吞吐量就降低了我们从图片直接结果的图片上面也可以看到响应时间和吞吐量的关系响应时间高吞吐量就低4.4 生成 HTML 报告命令plaintextjmeter -n -t 脚本.jmx -l result.jtl -e -o 报告目录Jmeter -n -t 脚本⽂件 -l ⽇志⽂件 -e -o ⽬录-n ⽆图形化运⾏-t 被运⾏的脚本-l 将运⾏信息写⼊⽇志⽂件后缀为 jtl 的⽇志⽂件-e ⽣成测试报告-o 指定报告输出⽬录Gitee效果展示1.2.活跃进程数量3.吞吐量4.响应时间gitee代码https://gitee.com/im-just-a-pig/test-development