一、测试概述
本次测试对象为 Web 博客系统,系统主要包含登录、显示个人信息、发布博客、显示博客内容等核心功能。本次测试通过手工测试、Postman 接口测试、JMeter 性能测试以及 Web + Python + Selenium 自动化测试,对系统功能正确性、接口可靠性、性能表现和核心业务流程稳定性进行验证。
二、测试范围
|------|-------------------------|-------------------------|
| 测试模块 | 主要测试内容 | 测试方式 |
| 用户模块 | 登录、退出、显示个人信息 | 手工、Postman、Jmeter、自动化测试 |
| 文章模块 | 文章列表、发布文章,查看文章详情 | 手工,Postman、Jmeter、自动化测试 |
| 接口测试 | 状态码,响应数据、参数校验 | Postman |
| 性能测试 | 登录,个人信息,博客列表,博客详情页,发布博客 | Jmeter |
三、测试环境
|-------|------------------------------------------------------------|
| 项目 | 配置 |
| 操作系统 | Windows11 |
| 浏览器 | Google Chrome 156.0.8078.48 |
| 测试地址 | 博客登陆页 |
| 后端环境 | Pythpn3.11 |
| 手工测试 | Chrome、浏览器开发者工具 |
| 接口测试 | Postman |
| 性能测试 | Jmeter5.5 |
| 自动化测试 | Python3.11、Selenium |
| 测试时间 | 2026.9-10 |
| 测试人员 | |
四、测试方法
1.设计总体测试用例
| 用例编号 | 模块 | 测试场景 | 手工 | Postman | JMeter | Selenium | 优先级 |
|---|---|---|---|---|---|---|---|
| LOGIN-001 | 登录 | 使用正确账号和密码登录 | 是 | 是 | 是 | 是 | P0 |
| LOGIN-002 | 登录 | 使用错误密码登录 | 是 | 是 | 否 | 是 | P1 |
| LOGIN-003 | 登录 | 使用不存在的账号登录 | 是 | 是 | 否 | 否 | P1 |
| LOGIN-004 | 登录 | 用户名或密码为空 | 是 | 是 | 否 | 否 | P1 |
| LOGIN-005 | 登录 | 登录成功后退出或结束登录状态 | 是 | 是 | 否 | 否 | P1 |
| LIST-001 | 博客列表 | 打开并查看博客列表 | 是 | 是 | 是 | 是 | P0 |
| LIST-002 | 博客列表 | 博客列表为空 | 是 | 是 | 否 | 否 | P1 |
| LIST-003 | 博客列表 | 列表中的博客信息正确 | 是 | 是 | 否 | 是 | P0 |
| DETAIL-001 | 博客详情 | 从列表打开博客详情 | 是 | 否 | 否 | 是 | P0 |
| DETAIL-002 | 博客详情 | 详情页内容与列表所选博客一致 | 是 | 否 | 否 | 是 | P0 |
| DETAIL-003 | 博客详情 | 访问不存在的博客详情 | 是 | 是 | 否 | 否 | P1 |
| PUBLISH-001 | 发布博客 | 登录后发布正常博客 | 是 | 是 | 是 | 是 | P0 |
| PUBLISH-002 | 发布博客 | 标题为空时提交 | 是 | 是 | 否 | 否 | P1 |
| PUBLISH-003 | 发布博客 | 正文为空时提交 | 是 | 是 | 否 | 否 | P1 |
| PUBLISH-004 | 发布博客 | 标题或正文超过长度限制 | 是 | 是 | 否 | 否 | P1 |
| PUBLISH-005 | 发布博客 | 发布后从列表和详情查看新博客 | 是 | 否 | 否 | 是 | P0 |
| AUTH-001 | 登录状态 | 未登录时尝试发布博客 | 是 | 是 | 否 | 是 | P0 |
| DATA-001 | 数据一致性 | 页面显示与接口返回数据一致 | 是 | 是 | 否 | 可选 | P1 |
2.手工测试
| 用例编号 | 测试场景 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| MAN-LOGIN-001 | 正常登录 | 测试账号有效 | 打开登录页,输入正确用户名和密码并提交 | 登录成功,进入预期页面,登录状态显示正确 | 登录成功,进入预期页面,登录状态显示正确 |
| MAN-LOGIN-002 | 错误密码登录 | 测试账号有效 | 输入正确用户名和错误密码并提交 | 登录失败,显示合理提示,不进入登录状态 | 登录失败,系统显示密码不正确 |
| MAN-LOGIN-003 | 不存在的账号登录 | 登录页可访问 | 输入不存在的用户名和任意密码并提交 | 登录失败,不进入登录状态 | 登录失败,系统显示用户不存在 |
| MAN-LOGIN-004 | 登录字段为空 | 登录页可访问 | 分别测试用户名为空、密码为空、两项均为空 | 阻止提交或提示必填,不出现异常 | 系统提示参数校验失败 |
| MAN-LOGIN-005 | 登录输入边界 | 登录页可访问 | 输入超长用户名、超长密码、前后空格和特殊字符 | 系统按规则校验,页面稳定,提示合理 | 系统提示参数校验失败 |
| MAN-LOGIN-006 | 退出或登录状态结束 | 用户已登录 | 点击退出;若无退出功能,则清除登录状态或重新打开浏览器验证 | 登录状态失效,不能继续使用需要登录的功能 | 系统提示用户退出,并跳转到登录页 |
| MAN-LIST-001 | 查看博客列表 | 系统中存在博客 | 登录或访问首页,打开博客列表 | 列表正常显示,没有加载错误 | 列表正常显示,没有加载错误 |
| MAN-LIST-002 | 空博客列表 | 测试环境无博客数据 | 打开博客列表 | 显示合理的空状态,不出现空白异常或错误信息 | 系统显示博客列表为空 |
| MAN-LIST-003 | 博客列表信息 | 列表中存在博客 | 检查页面实际展示的标题、作者、发布时间或摘要 | 展示内容与对应博客数据一致 | 展示内容与对应博客数据一致 |
| MAN-DETAIL-001 | 打开博客详情 | 列表中存在博客 | 点击一篇博客的标题或详情入口 | 打开所选博客详情页 | 成功打开所选博客详情页 |
| MAN-DETAIL-002 | 检查详情内容 | 已打开博客详情页 | 对照测试数据检查标题、作者、时间和正文 | 详情内容完整,且属于所选博客 | 文章详情内容完整,且属于所选博客 |
| MAN-DETAIL-003 | 不存在的博客详情 | 可直接访问详情 URL | 输入或访问不存在的博客地址 | 显示不存在或错误提示,不显示其他博客内容,不出现服务异常 | 不显示任何内容 |
| MAN-PUBLISH-001 | 发布正常博客 | 用户已登录 | 进入发布页面,输入有效标题和正文并提交 | 发布成功,显示合理反馈 | 系统弹窗显示博客发表成功 |
| MAN-PUBLISH-002 | 验证发布结果 | 已成功发布博客 | 返回博客列表并打开新博客详情 | 新博客在列表中可见,详情内容与提交内容一致 | 新博客在列表中可见,详情内容与提交内容一致 |
| MAN-PUBLISH-003 | 标题为空 | 用户已登录 | 留空标题,填写正文并提交 | 阻止发布或提示标题必填,不产生无效博客 | 系统提示参数校验失败 |
| MAN-PUBLISH-004 | 正文为空 | 用户已登录 | 填写标题,留空正文并提交 | 阻止发布或提示正文必填,不产生无效博客 | 系统提示参数校验失败 |
| MAN-PUBLISH-005 | 标题和正文均为空 | 用户已登录 | 不填写内容直接提交 | 阻止发布,提示信息明确 | 系统提示参数校验失败 |
| MAN-PUBLISH-006 | 发布内容边界 | 用户已登录 | 测试最短、最大长度、超长内容、纯空格和特殊字符 | 按系统规则接受或拒绝;页面无异常,失败时内容不被错误提交 | 系统提示标题不能超过100个字符 |
| MAN-PUBLISH-007 | 发布内容格式 | 用户已登录 | 在正文输入换行、标点和 HTML 标签等内容,提交后查看详情 | 内容按系统设计正确保存和展示,不发生页面异常 | 内容按系统设计正确保存和展示,不发生页面异常 |
| MAN-AUTH-001 | 未登录尝试发布 | 用户未登录 | 直接访问发布页面或尝试提交发布请求 | 按系统设计跳转登录页或拒绝操作,不创建博客 | 系统提示用户未登录, 即将跳转到登录页 |
3.Postman接口测试
| 用例编号 | 接口场景 | 请求条件 | 检查内容 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| API-LOGIN-001 | 正常登录 | 正确用户名和密码 | 状态码、响应结构、登录凭据或用户信息 | 登录成功,返回有效登录状态 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": { "id": 1, "token": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImlhdCI6MTc5Mzc3OTk3OSwiZXhwIjoxNzk0Mzg0Nzc5fQ.Xq4ujIjQMaBKIrZiWxIpntI_WJXMxbLxSBaWrYfLg1Q" } } 确认:成功获取到Token,未返回密码等敏感信息 |
| API-LOGIN-002 | 错误密码 | 正确用户名、错误密码 | 状态码、错误信息、是否返回有效凭据 | 登录失败,不返回有效登录状态 | http状态码:200 返回数据: { "code": -1, "errMsg": "密码不正确", "data": null } 确认:无Token返回,提示密码不正确 |
| API-LOGIN-003 | 不存在的用户名 | 不存在的用户名和密码 | 状态码、响应信息 | 登录失败,响应符合接口约定 | http状态码:200 返回数据: { "code": -1, "errMsg": "用户不存在", "data": null } 确认:无Token返回,提示用户不存在 |
| API-LOGIN-004 | 缺少登录参数 | 缺少用户名或密码 | 参数校验、错误响应结构 | 返回参数错误,不出现服务器异常 | http状态码:400 返回数据: { "code": -1, "errMsg": "参数不合法:密码不能为空", "data": null } 确认:无Token返回,提示参数不合法,用户名/密码不能为空 |
| API-LOGIN-005 | 非法登录参数 | 错误类型、超长字段或特殊字符 | 输入校验、错误响应 | 请求被合理处理,不出现服务器异常 | http状态码:400 返回数据: { "code": -1, "errMsg": "参数不合法:用户名长度不能超过20", "data": null } 确认:无Token返回,提示参数不合法,用户名长度不能超过20 |
| API-LIST-001 | 查询博客列表 | 正常请求 | 状态码、列表结构、博客字段 | 返回成功,列表结构和字段符合接口约定 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": [ { "id": 6917, "title": "qqq", "content": "##在这qqq里写下一篇博客", "userId": 2, "updateTime": "2026-11-04 16:01" }, { "id": 6916, "title": "111", "content": "111\n222\n555\n&&& \n 7@#$%^&", "userId": 2, "updateTime": "2026-11-04 15:59" }, .......... 确认:成功获取到博客列表,正确返回博客id,标题,内容,时间 |
| API-LIST-002 | 查询空列表 | 使用无数据环境或测试数据 | 空列表响应结构 | 返回空列表或系统约定的空状态,不报错 | 待执行 |
| API-DETAIL-001 | 查询正常博客详情 | 使用存在的博客 ID | 状态码、标题、正文等字段 | 返回对应博客详情 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": { "id": 6917, "title": "qqq", "content": "##在这qqq里写下一篇博客", "userId": 2, "updateTime": "2026-11-04 16:01" } } 确认:成功获取到博客详情 |
| API-DETAIL-002 | 查询不存在的博客 | 使用不存在的博客 ID | 状态码、错误信息 | 返回未找到或业务错误,不泄露其他数据 | http状态码:200 返回数据: { "code": -1, "errMsg": "Method parameter 'blogId': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; For input string: \"9999999999999999\"", "data": null } 确认:无博客返回,显示博客id错误 |
| API-DETAIL-003 | 非法博客 ID | 使用空值、负数或非数字 ID | 参数处理、响应状态 | 请求被拒绝或返回合理错误,不出现服务器异常 | http状态码:200 返回数据:(负数)(这可能算是一个bug) { "code": 200, "errMsg": null, "data": null } 返回数据:(空值) { "code": -1, "errMsg": "参数不合法", "data": null } 返回数据:(非数字Id) { "code": -1, "errMsg": "Method parameter 'blogId': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; For input string: \"asg\"", "data": null } 确认:无博客返回,提示后端要求blogId参数必须是数字 |
| API-PUBLISH-001 | 正常发布博客 | 有效登录状态、有效标题和正文 | 状态码、返回数据、创建结果 | 发布成功,可通过列表或详情接口查询到新博客 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": true } 确认:成功发布博客 |
| API-PUBLISH-002 | 未登录发布博客 | 不携带登录凭据 | 鉴权状态码、数据是否创建 | 请求被拒绝,不创建博客 | http状态码:401 Unauthorized 验证确认:接口成功拦截了未登录的发布请求,未执行博客发布逻辑 |
| API-PUBLISH-003 | 标题为空 | 有效登录状态、标题为空 | 参数校验、数据是否创建 | 返回参数错误,不创建博客 | http状态码:400 Bad Request 返回数据: { "code": -1, "errMsg": "参数不合法:博客标题不能为空", "data": null } 确认:后端成功拦截非法参数,报错提示清晰。未出现服务器内部异常 |
| API-PUBLISH-004 | 正文为空 | 有效登录状态、正文为空 | 参数校验、数据是否创建 | 返回参数错误,不创建博客 | http状态码:400 Bad Request 返回数据: { "code": -1, "errMsg": "参数不合法:博客内容不能为空", "data": null } 确认:后端成功拦截非法参数,报错提示清晰。未出现服务器内部异常 |
| API-PUBLISH-005 | 发布超长内容 | 有效登录状态、超长标题或正文 | 长度校验和响应信息 | 按系统限制拒绝或处理,不出现异常 | http状态码:400 Bad Request 返回数据: { "code": -1, "errMsg": "参数不合法:标题长度不能超过100个字符", "data": null } 确认:后端成功拦截非法参数,报错提示清晰。未出现服务器内部异常 |
| API-PUBLISH-006 | 发布特殊内容 | 有效登录状态、正文包含特殊字符或 HTML 内容 | 数据保存和返回内容 | 内容按系统规则保存和呈现 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": true } 确认:内容按系统规则保存和呈现 |
| API-DATA-001 | 发布后查询数据 | 先调用发布接口,再调用列表或详情接口 | 创建结果和查询结果 | 查询到的数据与提交内容一致 | http状态码:200 返回数据: { "code": 200, "errMsg": null, "data": { "id": 6931, "title": "测试特殊字符", "content": "这是一段正常文字😀,包含特殊符号 !@#¥%......&*。还有 HTML 标签:<b>加粗</b>,以及一段危险脚本:<script>alert('xss')</script>,最后是一个 SQL 注入尝试:' OR 1=1 -- ", "userId": 1, "updateTime": "2026-11-04 17:29" } } 确认:查询接口返回的title为"测试特殊字符",content与提交的内容完全一致,id成功生成 |
| API-RESP-001 | 接口响应时间 | 登录、列表、详情、发布接口 | Postman 显示的响应时间 | 记录响应时间,并与项目约定阈值比较 | 登录接口实际响应时间:39ms 列表页接口实际响应时间:14.06s 博客详情页接口实际响应时间:38ms 发布接口实际响应时间:46ms |
4.Jmeter性能测试
| 用例编号 | 测试场景 | 前置条件 | 负载配置 | 测试步骤 | 预期结果 | |
|---|---|---|---|---|---|---|
| JM-001 | 登录接口并发测试 | 登录接口可用,准备有效测试账号 | 20 个用户;Ramp-up 20 秒;持续 60 秒 | 配置登录请求和成功断言;设置线程组参数;运行并记录指标 | 有效账号登录成功,响应内容正确;响应时间和错误率满足约定目标 | |
| JM-002 | 博客列表并发测试 | 系统中存在博客;若接口需要登录,已配置登录凭据 | 50 个用户;Ramp-up 30 秒;持续 120 秒 | 配置列表请求和响应断言;运行测试,检查返回数据并记录指标 | 列表正常返回,数据结构正确,无业务异常;性能指标满足约定目标 | |
| JM-003 | 博客详情并发测试 | 准备多个有效博客 ID;若接口需要登录,已配置登录凭据 | 50 个用户;Ramp-up 30 秒;持续 120 秒 | 参数化博客 ID;配置详情请求和断言;运行并记录指标 | 返回对应博客详情,标题和正文等关键字段正确;性能指标满足约定目标 | |
| JM-004 | 发布博客并发测试 | 用户可正常登录;使用专用测试数据,标题具有唯一标识 | 5 个用户;Ramp-up 10 秒;持续 60 秒 | 配置登录及发布请求;生成唯一标题;添加发布成功断言;运行后抽查新博客 | 发布成功,内容保存正确;不存在请求失败却错误创建数据等异常;性能指标满足约定目标 | |
| JM-005 | 核心业务组合测试 | 准备有效账号和博客数据 | 30 个用户;Ramp-up 30 秒;持续 180 秒 | 每个用户首次登录后,循环执行查看列表、打开详情;分别统计接口指标 | 业务流程正常,登录状态有效,列表和详情返回正确;各接口性能指标满足约定目标 |
5.Web UI自动化测试
测试目的
为了提高博客系统回归测试的效率,减少重复的人工操作,本项目使用 Python 和 Selenium WebDriver 编写 Web UI 自动化测试脚本,对博客系统的核心功能进行验证。
本次自动化测试主要用于:
- 验证博客系统核心业务流程是否能够正常执行。
- 检查系统页面元素是否正确加载。
- 验证登录成功和登录失败场景。
- 验证博客发布后的页面跳转和数据展示。
- 提高回归测试效率,降低人工测试成本。
测试工具与环境
| 项目 | 内容 |
|---|---|
| 编程语言 | Python |
| 自动化测试框架 | Selenium WebDriver |
| 浏览器 | Chrome |
| 浏览器驱动 | ChromeDriver |
| 测试对象 | 博客系统 Web 页面 |
| 测试地址 | http://47.108.157.13:8090 |
| 元素定位方式 | CSS Selector |
| 等待方式 | 显式等待、固定等待 |
| 测试执行方式 | Python 脚本顺序执行 |
| 测试结果辅助 | 页面截图、断言、控制台输出 |
自动化测试框架结构
本项目按照页面功能对测试代码进行划分,主要包括登录页面、博客列表页面、博客详情页面和博客编辑页面。
| 文件或模块 | 主要职责 |
|---|---|
BlogLogin.py |
执行登录成功和登录失败测试 |
BlogList.py |
验证博客列表页面元素是否正常显示 |
BlogDetail.py |
验证博客详情页面的标题、时间和正文区域 |
BlogEdit.py |
验证博客发布流程及发布后的页面跳转 |
RunTest.py |
统一组织和执行所有自动化测试用例 |
common.Utils.BlogDriver |
提供浏览器驱动和截图功能 |
测试脚本通过 BlogDriver.driver 共享浏览器实例。RunTest.py 负责按照既定顺序执行测试,并使用 try...finally 结构确保测试结束后关闭浏览器。
自动化测试流程
自动化测试的整体执行流程如下:
- 打开博客登录页面。
- 输入错误密码,验证登录失败提示。
- 输入正确用户名和密码,验证登录成功。
- 进入博客列表页面,检查博客标题、摘要、链接和用户昵称。
- 进入博客详情页面,检查博客标题、发布时间和正文区域。
- 进入博客编辑页面,填写博客标题和正文。
- 点击发布按钮,处理发布成功提示。
- 验证页面是否跳转到博客列表页面。
- 检查发布后的博客标题是否正确显示。
- 测试结束后关闭浏览器。
自动化测试执行顺序如下:
登录失败测试
↓
登录成功测试
↓
博客列表测试
↓
博客详情测试
↓
博客发布测试
↓
关闭浏览器
自动化测试用例
| 用例编号 | 测试功能 | 测试步骤 | 预期结果 |
|---|---|---|---|
| UI-AUTO-001 | 登录失败 | 输入正确用户名和错误密码,点击登录 | 系统弹出"密码不正确"提示,登录失败 |
| UI-AUTO-002 | 登录成功 | 输入正确用户名和密码,点击登录 | 成功进入博客系统,并显示用户昵称 |
| UI-AUTO-003 | 博客列表展示 | 打开博客列表页面 | 页面显示博客标题、博客摘要、详情入口和用户昵称 |
| UI-AUTO-004 | 博客详情展示 | 打开指定博客详情页面 | 页面显示博客标题、发布时间和正文区域 |
| UI-AUTO-005 | 发布博客 | 输入博客标题和正文,点击发布 | 出现发布成功提示,并跳转到博客列表页面 |
| UI-AUTO-006 | 发布结果验证 | 在博客列表页面查找刚发布的博客标题 | 页面显示与输入内容一致的博客标题 |
关键实现说明
1. 页面元素定位
测试脚本主要使用 CSS Selector 定位页面元素。例如:
self.driver.find_element(By.CSS_SELECTOR, "#username")
self.driver.find_element(By.CSS_SELECTOR, "#password")
self.driver.find_element(By.CSS_SELECTOR, "#submit")
其中,#username 用于定位用户名输入框,#password 用于定位密码输入框,#submit 用于定位登录或发布按钮。
对于博客列表和详情页面,脚本通过 CSS Selector 定位标题、正文、时间和用户昵称等元素,从而判断页面内容是否正常加载。
2. 显式等待
对于页面加载、按钮显示和浏览器弹窗等动态内容,脚本使用 Selenium 的显式等待机制。例如:
wait.until(
EC.visibility_of_element_located(
(By.CSS_SELECTOR, "#title")
)
)
显式等待会在指定时间内持续检查目标元素是否满足条件。与固定等待相比,显式等待能够减少因页面加载速度不同导致的测试失败。
3. 登录失败验证
登录失败测试输入错误密码后,等待浏览器弹窗出现,读取弹窗文字并进行断言:
actual = alert.text
assert actual == "密码不正确"
alert.accept()
该测试不仅检查弹窗是否出现,还验证弹窗内容是否符合预期。
4. 博客发布验证
博客发布测试首先输入标题和正文,然后点击发布按钮。发布后,脚本执行以下检查:
- 是否出现发布成功提示;
- 弹窗内容是否能够正常读取;
- 是否跳转到博客列表页面;
- 博客列表中是否出现预期标题。
通过以上检查,可以验证博客发布流程是否基本正常。
5. 测试截图
每个主要测试用例执行完成后调用截图方法:
BlogDriver.getScreeShot()
截图可以作为测试结果的辅助证据,用于记录测试执行时的页面状态,也便于定位测试失败原因。
自动化测试结果
| 用例编号 | 测试功能 | 执行结果 | 实际结果 | 备注 |
|---|---|---|---|---|
| UI-AUTO-001 | 登录失败 | 通过 | 输入错误密码后,弹窗提示为"密码不正确",与断言一致 | 已验证错误提示文字 |
| UI-AUTO-002 | 登录成功 | 通过 | 提交有效账号后,成功定位登录页面中的用户昵称元素 | 已验证昵称元素存在,未校验具体昵称 |
| UI-AUTO-003 | 博客列表展示 | 通过 | 成功定位博客标题、摘要、详情入口及用户昵称元素 | 已验证关键元素存在 |
| UI-AUTO-004 | 博客详情展示 | 通过 | 成功定位博客标题、时间及正文区域 | 已验证关键元素存在 |
| UI-AUTO-005 | 发布博客 | 通过 | 提交后出现提示弹窗,关闭弹窗后跳转至博客列表页 | 代码未断言弹窗的具体文字 |
| UI-AUTO-006 | 发布结果验证 | 通过 | 列表中显示的博客标题与输入的"自动化测试创建"一致 | 已验证标题,未复查正文 |
自动化测试结果分析
本次自动化测试覆盖了博客系统的主要用户操作流程。测试结果表明,自动化脚本能够模拟用户完成登录、查看博客列表、查看博客详情和发布博客等操作,并能够通过元素定位、页面跳转、弹窗信息和文本断言对执行结果进行判断。
其中,登录失败用例通过检查错误弹窗内容验证系统的异常处理功能;登录成功用例通过检查登录后页面中的用户昵称验证登录状态;博客列表和详情用例通过检查关键页面元素验证页面加载情况;博客发布用例则进一步验证了输入、提交、弹窗提示、页面跳转和发布结果展示等流程。
但是,当前自动化测试仍存在一定局限:
- 部分测试只检查页面元素是否存在,没有进一步校验元素的具体文本内容。
- 登录成功测试使用了固定等待时间,可能受到网络或服务器响应速度影响。
- 部分 CSS Selector 层级较深,页面结构变化后可能导致定位失败。
- 博客标题采用固定内容,多次执行可能产生重复数据。
- 测试账号、密码和服务器地址直接写在代码中,环境切换不够方便。
- 当前测试用例之间存在登录状态依赖,部分用例不能完全独立运行。
- 博客正文发布后没有进一步进入详情页验证正文内容是否保存成功。
测试结果
六、测试结果填写设计
测试完成后再填写实际执行数量、通过率和性能指标。
1. 功能与接口测试汇总
| 测试类型 | 计划用例数 | 实际执行数 | 通过数 | 失败数 | 阻塞/跳过数 | 通过率 |
|---|---|---|---|---|---|---|
| 手工测试 | 20 | 20 | 19 | 1 | 0 | 95% |
| Postman 接口测试 | 18 | 18 | 17 | 0 | 1 | 94.4% |
| Selenium 自动化测试 | 6 | 6 | 6 | 0 | 0 | 100% |
2. JMeter 性能测试结果
| 用例编号 | 测试场景 | 用户数 | 样本数 | 平均响应时间(ms) | P95(ms) | 吞吐量(次/秒) | 错误率 | 测试结论 |
|---|---|---|---|---|---|---|---|---|
| JM-001 | 登录接口 | 20 | 5216 | 193 | 519 | 86.5/sec | 0.00% | 通过:各项指标正常,错误率0% |
| JM-002 | 博客列表 | 50 | 122 | 41512 | 162029 | 27.3/min | 11.48% | 不通过:响应时间过长,TPS极低,错误率过高 |
| JM-003 | 博客详情 | 50 | 5714 | 447 | 780 | 47.5/sec | 0.00% | 通过:各项指标正常,错误率0% |
| JM-004 | 发布博客 | 5 | 3385 | 42 | 53 | 56.5/sec | 0.00% | 通过:各项指标正常,错误率0% |
| JM-005 | 核心业务组合 | 30 | 357 | 18164 | 30393 | 1.1/sec | 21.57% | 不通过:响应时间过长,TPS极低,错误率过高 |
3. 缺陷记录
| 编号 | 问题描述 | 影响 | 建议 |
|---|---|---|---|
| BUG-001 | 缺少空白个人账户,未能充分验证新用户或无个人资料用户的页面展示 | 无法确认空白账户登录后,个人信息区域和博客列表等页面是否能正常显示,可能遗漏空数据场景下的展示或处理问题 | 创建专用空白测试账户,补充登录、个人信息展示及博客列表的测试用例 |
| BUG-002 | 用户登录凭证存在有效期限制,测试执行过程中凭证可能过期 | 用户登录状态失效后,后续博客列表请求可能返回异常或无法获取数据,影响测试结果判断 | 在测试流程中增加凭证有效性检查;凭证失效时重新登录或刷新凭证;记录凭证失效时间及相关响应信息 |
| BUG-003 | 公用小型系统在测试期间出现卡顿 | 系统响应变慢可能导致页面加载超时、请求失败或测试结果波动,影响自动化测试的稳定性,也可能影响其他使用者 | 控制并发量和测试时长,优先在低峰时段测试;与系统维护方确认测试窗口,并监控服务器资源和请求错误情况 |
4. 测试结论
本次测试覆盖登录、博客列表、博客详情和博客发布功能,使用手工测试、Postman 接口测试、JMeter 性能测试及 Selenium 自动化测试进行验证。功能及接口用例共计划执行 44 条,实际执行 44 条,其中通过 42 条、失败 1 条、阻塞或跳过 1 条,整体通过率为 95.5%。其中手工测试 20 条,通过 19 条、失败 1 条,通过率 95%;Postman 接口测试 18 条,通过 17 条、阻塞 1 条,通过率 94.4%;Selenium 自动化测试 6 条,全部通过,通过率 100%。
性能测试覆盖登录、博客列表、博客详情、发布博客和核心业务组合共 5 个场景。登录接口在 20 并发下 P95 响应时间为 519 ms ,错误率 0.00% ;博客详情在 50 并发下 P95 为 780 ms ,错误率 0.00% ;发布博客在 5 并发下 P95 为 53 ms ,错误率 0.00% ,均满足预期目标。博客列表在 50 并发下 P95 高达 162029 ms ,错误率 11.48% ;核心业务组合在 30 并发下 P95 为 30393 ms ,错误率 21.57%,两项均未达到性能目标,说明列表查询接口在高并发下存在明显性能瓶颈。
本轮共发现 3 个缺陷,其中严重缺陷 0 个,主要为空白账户场景覆盖不足、登录凭证有效期限制以及测试期间系统卡顿等问题,均已记录并给出改进建议。综合功能、接口、性能和自动化测试结果,核心业务流程功能正确、接口校验完善、自动化回归稳定,但博客列表接口在高并发场景下响应时间和错误率不达标,测试结论为 有条件通过:建议优先优化列表查询性能(如分页、缓存、索引优化),修复后再进行一轮性能回归验证。