community 智慧社区项目全维度测试报告:功能、接口、自动化与性能验证
项目地址:https://gitee.com/shiquan_zhan/shi-xun_-community
| 项目名称 | community 智慧社区系统 | 版本号 | V1.0 |
|---|---|---|---|
| 发布类型 | 本地测试基线发布 | 测试负责人 | 第 12 开发组 |
| 测试完成日期 | 2026-07-15 | 展示渠道 | CSDN 在线展示 |
| 报告类型 | 项目测试报告 | 测试范围 | 用户端、管理端、AI 助手、主后端、AI 后端、中间件 |
| 测试方式 | 功能测试、接口测试、自动化烟测、JMeter 性能测试、安全检查、构建验证 | 保密说明 | 不记录密码、Token、API Key、邮箱授权码 |
文章目录
- 项目背景
- 测试安排
- 测试分类
- [(1) 功能测试](#(1) 功能测试)
- [(2) 自动化测试](#(2) 自动化测试)
- [(3) 性能测试](#(3) 性能测试)
- [(4) 接口测试](#(4) 接口测试)
- [(5) 安全测试](#(5) 安全测试)
- [(6) 构建与环境测试](#(6) 构建与环境测试)
- [(7) 缺陷统计与分析](#(7) 缺陷统计与分析)
- [总结测试 tips](#总结测试 tips)
项目背景
项目背景与意义
随着社区服务数字化程度提高,居民缴费、物业报修、访客登记、车位申请、商城购物和运营管理等业务逐渐从线下人工流转转向线上系统处理。community 智慧社区系统围绕居民端、物业管理端和 AI 助手三个入口,模拟了一个社区综合服务平台。
从软件测试岗位作品集角度看,该项目不只是一个单页面演示项目,而是一个包含前端页面、后端接口、数据库、中间件、AI 独立服务和多端联动的综合系统。它适合用于展示功能测试、接口测试、自动化烟测、安全风险识别、缺陷分级和测试报告编写能力。
图 1 项目目录与系统组成截图

项目概述
本项目采用前后端分离架构,由用户端、管理端、AI 助手前端、主业务后端和 AI 助手后端组成。
| 子系统 | 技术栈 | 默认地址 | 主要职责 |
|---|---|---|---|
| 用户端 | Vue 3、TypeScript、Vite、Element Plus、Pinia | http://127.0.0.1:5173 |
首页、商品、购物车、订单、钱包、公告、缴费、物业、安保、车位申请 |
| 管理端 | Vue 3、TypeScript、Vite、Element Plus、Pinia、ECharts | http://127.0.0.1:5174 |
动态权限、会员、商品、促销、门店、订单、社区事项、统计、日志 |
| 主业务后端 | Java 11、Spring Boot 2.3.1、MyBatis-Plus | http://127.0.0.1:8099 |
用户端和管理端业务 API、认证授权、事务和数据访问 |
| AI 助手前端 | Vue 3、TypeScript、Vite、Element Plus | http://127.0.0.1:5175 |
智能问答、会话历史和知识库界面 |
| AI 助手后端 | JDK 17、Spring Boot 3、Spring AI、JPA | http://127.0.0.1:8100/api |
模型调用、流式问答、会话和知识库管理 |
主业务后端与 AI 后端是两个独立 JVM 进程。AI 服务不可用时,不应影响用户端和管理端核心业务。
已实现的主要功能包括
用户端
- 用户注册、登录、忘记密码、个人资料和修改密码。
- 商品搜索、分类筛选、价格筛选、商品详情、门店库存和促销价格展示。
- 商品收藏、购物车勾选、数量调整、结算和历史订单。
- 钱包充值、转账和账单记录。
- 通知公告、生活缴费、物业报修与投诉、安保访客。
- 车位申请、申请进度和审批结果通知。
管理端
- 管理员账号登录、JWT 认证、菜单权限和动态路由。
- 运营看板、会员管理、冻结和解冻。
- 商品分类、商品、本地图片上传、促销活动和商品绑定。
- 区域、门店和门店商品库存管理。
- 订单查询和状态处理。
- 公告、生活缴费、投诉、访客、车位和车位申请审批。
- 商品销量排行、访问排行、管理员和用户登录日志。
AI 助手
- 普通问答和流式回答。
- 历史会话管理。
- 社区知识库查询与维护。
- 独立 JDK 17 运行环境,可按需启动。
当前系统存在的不足
| 编号 | 不足项 | 影响 |
|---|---|---|
| RISK-001 | 自动化测试覆盖不足 | 当前主要为构建验证、只读接口验证和烟测,写入流程自动化不足 |
| RISK-002 | 前端依赖存在漏洞 | npm audit 记录 90 个漏洞,其中用户端存在 3 个 critical |
| RISK-003 | Token/session 存储在 localStorage | XSS 后可能扩大影响范围 |
| RISK-004 | 用户端 /goods/list 直达路由可能被代理抢占 |
浏览器直达商品列表可能返回后端 404 |
| RISK-005 | Swagger 默认路径 /v2/api-docs 返回 404 |
接口测试人员可能误判接口文档不可用 |
| RISK-006 | 主后端与 AI 后端 JDK 版本不同 | 测试执行前必须确认 Java 环境 |
| RISK-007 | 仓库存在日志和临时文件 | 交付或发布时需要避免误提交 |
项目的系统功能说明
1. 用户登录功能
用户端和管理端均提供登录入口。用户端登录用于访问个人资料、购物车、订单、钱包、车位申请等居民功能;管理端登录用于进入后台运营系统,加载动态菜单和权限路由。
测试关注点:
- 登录页是否正常渲染。
- 正确账号是否能进入系统。
- 错误账号或未登录访问是否有合理提示。
- 登录后菜单、用户状态和接口请求是否一致。
图 2 用户端登录页截图

图 3 管理端登录页截图

图 4 登录功能测试点脑图
围绕登录功能拆分功能测试、界面测试、安全测试、性能测试和兼容性测试。

2. 用户端商城与社区服务功能
用户端覆盖商城购物和社区服务两类业务。商城部分包括商品列表、商品详情、分类筛选、购物车和订单;社区服务包括公告、缴费、物业、访客和车位申请。
测试关注点:
- 首页是否正常打开。
- 商品分类和热销商品接口是否返回数据。
- 商品列表、详情和门店库存是否能展示。
- 公告、缴费、物业、访客和车位申请页面是否可进入。
- 空数据状态是否能正常展示,不出现白屏。
图 5 用户端首页截图

图 6 商品列表或商品详情截图

图 7 社区服务页面截图

图 8 用户端业务测试点脑图
围绕用户端业务拆分商城功能、社区服务、界面测试、安全测试和兼容性测试。

3. 管理端运营功能
管理端提供后台运营能力,包括会员管理、商品管理、门店管理、订单管理、社区事项、统计图表和日志管理。
测试关注点:
- 管理端登录后是否能进入首页。
- 动态菜单是否按权限展示。
- 商品、门店、订单、会员等列表是否能加载。
- 社区审批列表是否能查看。
- 统计图表是否能正常渲染。
图 9 管理端首页或运营看板截图

图 10 管理端业务列表截图

图 11 管理端业务测试点脑图
围绕管理端拆分功能测试、双端联动、界面测试、安全测试和性能测试。

4. AI 助手功能
AI 助手提供普通问答、快捷问题、历史会话和社区知识库查询。AI 服务与主业务服务独立部署,因此测试时需要单独验证 AI 前端和 AI 后端。
测试关注点:
- AI 前端页面是否正常打开。
/api/chat/health是否返回status=UP。- 快捷问题接口是否返回列表。
- 知识库接口是否返回分页数据。
- AI 接口异常时前端是否有明确提示。
图 12 AI 助手页面截图

测试目标
| 目标编号 | 测试目标 | 验收标准 |
|---|---|---|
| OBJ-001 | 验证核心功能可测 | 用户端、管理端、AI 助手均形成测试用例 |
| OBJ-002 | 验证核心接口可访问 | 主后端和 AI 后端只读接口返回符合预期 |
| OBJ-003 | 验证运行环境完整性 | MySQL、Redis、RabbitMQ、ElasticSearch 和前后端端口可检查 |
| OBJ-004 | 验证页面可渲染 | 用户端、管理端、AI 前端首屏可打开 |
| OBJ-005 | 识别安全和质量风险 | 富文本、依赖漏洞、Token 存储、Swagger 路径等问题有记录 |
| OBJ-006 | 形成缺陷闭环 | 缺陷按级别统计,说明影响、状态和后续建议 |
测试项目相关信息
| 项目 | 内容 |
|---|---|
| 项目名称 | community 智慧社区系统 |
| 测试版本 | 本地 003-community 当前仓库版本 |
| 测试日期 | 2026-07-15 |
| 用户端地址 | http://127.0.0.1:5173 |
| 管理端地址 | http://127.0.0.1:5174 |
| AI 前端地址 | http://127.0.0.1:5175 |
| 主后端地址 | http://127.0.0.1:8099 |
| AI 后端地址 | http://127.0.0.1:8100/api |
| 测试脚本 | scripts/qa/runtime-smoke.ps1 |
| 测试文档 | docs/testing/01-test-plan.md 至 docs/testing/06-quality-assessment-guide.md |
测试安排
| 模块 | 子模块 | 前端负责人 | 后端负责人 | 提测内容 | 测试方式 | 当前进度 | 备注 |
|---|---|---|---|---|---|---|---|
| 用户端 | 登录、首页、商品、购物车、订单 | 第 12 开发组 | 第 12 开发组 | 居民端核心页面和接口 | 功能测试、接口测试、页面烟测 | 已完成基线记录 | 写入流程建议使用测试库补测 |
| 用户端 | 公告、缴费、物业、访客、车位 | 第 12 开发组 | 第 12 开发组 | 社区服务入口和状态展示 | 功能测试、页面烟测 | 已完成用例设计 | 车位审批需双端联动验证 |
| 管理端 | 登录、动态菜单、会员、商品、订单 | 第 12 开发组 | 第 12 开发组 | 后台运营管理 | 功能测试、页面烟测 | 已完成用例设计 | 关注权限菜单和列表加载 |
| 管理端 | 社区事项、统计、日志 | 第 12 开发组 | 第 12 开发组 | 后台社区管理和统计 | 功能测试、页面烟测 | 已完成用例设计 | 关注图表和数据状态 |
| AI 助手 | 问答、快捷问题、知识库 | 第 12 开发组 | 第 12 开发组 | AI 基础服务 | 接口测试、页面烟测 | 已完成基线记录 | AI 后端需 JDK 17 |
| 环境 | MySQL、Redis、RabbitMQ、ES | 第 12 开发组 | 第 12 开发组 | 本地依赖服务 | 端口检查、只读探测 | 已完成基线记录 | 不记录任何密码 |
| 安全 | 富文本、依赖、Token、Swagger | 第 12 开发组 | 第 12 开发组 | 安全风险识别 | 静态扫描、依赖审计 | 已完成缺陷记录 | 依赖漏洞后续迭代 |
图 13 本地服务启动截图

测试分类
(1) 功能测试
功能测试用例统计
| 模块 | 用例数 | 优先级分布 |
|---|---|---|
| 环境与构建 | 8 | P0: 5,P1: 3 |
| 用户端商城 | 10 | P0: 2,P1: 6,P2: 2 |
| 用户端社区服务 | 8 | P1: 6,P2: 2 |
| 管理端运营 | 9 | P0: 2,P1: 6,P2: 1 |
| AI 助手 | 6 | P1: 4,P2: 2 |
| 接口与安全 | 9 | P0: 2,P1: 5,P2: 2 |
| 合计 | 50 | P0: 11,P1: 30,P2: 9 |
用户端功能测试结果
| 用例编号 | 优先级 | 测试场景 | 预期结果 | 当前记录 |
|---|---|---|---|---|
| USER-GOODS-001 | P0 | 首页渲染 | 页面非空,无错误覆盖层 | 已纳入前端烟测 |
| USER-GOODS-002 | P1 | 商品分类接口 | 返回分类树 | 接口验证通过 |
| USER-GOODS-003 | P1 | 热销商品接口 | 返回商品列表 | 接口验证通过 |
| USER-GOODS-004 | P1 | 商品搜索 | 商品列表刷新 | 已设计用例 |
| USER-GOODS-008 | P0 | 加入购物车 | 登录后购物车数量更新 | 建议后续使用测试库执行 |
| USER-COM-001 | P1 | 公告列表 | 展示公告列表 | 已设计用例 |
| USER-COM-003 | P1 | 公告富文本安全 | 脚本被清洗 | 高风险入口已记录并修复 |
| USER-COM-007 | P1 | 车位申请入口 | 页面可进入 | 已设计用例 |
管理端功能测试结果
| 用例编号 | 优先级 | 测试场景 | 预期结果 | 当前记录 |
|---|---|---|---|---|
| ADMIN-001 | P0 | 登录页渲染 | 显示登录表单 | 已纳入前端烟测 |
| ADMIN-002 | P0 | 管理员登录 | 成功进入首页 | 已设计用例 |
| ADMIN-003 | P1 | 动态菜单 | 菜单按权限展示 | 已设计用例 |
| ADMIN-005 | P1 | 商品列表 | 列表可加载 | 已设计用例 |
| ADMIN-007 | P1 | 订单列表 | 列表可加载 | 已设计用例 |
| ADMIN-008 | P1 | 社区审批 | 车位申请审批列表可加载 | 已设计用例 |
功能测试结果说明:当前项目已形成页面级、接口级和性能级测试点设计,用户端、管理端、AI 助手和后端接口均已纳入测试范围。为了让报告接近原文的颗粒度,测试用例不只按模块统计,而是继续按"页面入口、登录状态、输入组合、异常分支、权限边界、性能和兼容性"展开。部分会写入数据库的业务,例如加入购物车、下单、车位申请和后台审批,建议后续放到专用测试库中执行,避免污染演示数据。
(2) 自动化测试
编写 Web 测试用例
本项目自动化测试分为三层:
- Selenium-Java UI/Web 自动化:覆盖用户端、管理端、AI 助手的页面加载、导航、登录、业务列表和基础安全检查。
- Python 接口自动化:覆盖主后端接口、AI 后端接口、Swagger、前端入口、环境端口和安全检查。
- PowerShell 运行烟测:快速判断本地环境是否测到正确项目、核心服务是否启动、前端页面是否能访问。
自动化 Web 测试用例设计如下。原文之所以测试用例数量多,是因为它不是只写"测试登录页""测试列表页"这种模块级条目,而是继续向下拆到页面状态、输入组合、异常分支、权限边界、性能和兼容性。本报告按同样颗粒度展开:一个登录页面会拆出正确账号、错误密码、空验证码、验证码过期、Token 伪造、SQL 注入、弱网响应等多条测试点;商城、社区服务、管理后台和 AI 助手也按同样方式展开。

图 14-1-1 登录页面详细测试用例思维导图

图 14-1-2 用户端商城与社区服务详细测试用例思维导图

图 14-1-3 管理后台详细测试用例思维导图

图 14-1-4 接口、AI 助手与性能测试用例思维导图

| 编号 | 覆盖项 | 检查方式 | 预期结果 |
|---|---|---|---|
| WEB-001 | 用户端首页 | 访问 5173 |
页面非空,无错误覆盖层 |
| WEB-002 | 管理端登录页 | 访问 5174 |
显示登录表单 |
| WEB-003 | AI 前端首页 | 访问 5175 |
页面非空 |
| WEB-004 | 主后端接口 | 请求商品分类、热销商品、验证码接口 | 返回 200 或符合预期的数据 |
| WEB-005 | AI 后端接口 | 请求健康检查、快捷问题、知识库接口 | 返回 200 或符合预期的数据 |
| WEB-006 | Swagger 文档 | 请求 Swagger 资源和分组 JSON | 分组路径可用 |
| WEB-007 | 中间件端口 | 检查 MySQL、Redis、RabbitMQ、ES | 端口监听或只读探测成功 |

Selenium-Java UI 自动化测试代码
Selenium 测试工程位于:
text
scripts/qa/selenium-java

目录结构:
text
selenium-java/
├─ pom.xml
├─ src/test/java/com/community/qa/config/TestConfig.java
├─ src/test/java/com/community/qa/pages/BasePage.java
└─ src/test/java/com/community/qa/tests/
├─ UserPortalUiTest.java
├─ AdminPortalUiTest.java
└─ AiAssistantUiTest.java
运行命令:
powershell
cd scripts\qa\selenium-java
mvn test
管理端登录测试代码片段如下,演示管理员账号使用 admin / admin123:
java
private void loginAdmin() {
open(TestConfig.url(TestConfig.ADMIN_URL, "/login"));
type(By.cssSelector("input[placeholder='请输入管理员账号']"), TestConfig.ADMIN_NAME);
type(By.cssSelector("input[placeholder='请输入登录密码']"), TestConfig.ADMIN_PASSWORD);
click(By.cssSelector(".login-submit"));
wait.until(webDriver -> !webDriver.getCurrentUrl().contains("/login")
|| pageContains("当前管理员")
|| pageContains("工作台"));
}
管理端核心业务列表测试代码片段:
java
@Test
@DisplayName("ADMIN-004/005/006/007/008 管理端核心业务列表可访问")
void adminBusinessListRoutesShouldRender() {
loginAdmin();
String[] paths = {
"/member/index",
"/goods/index",
"/store/info",
"/order/index",
"/community/parking/application/index"
};
for (String path : paths) {
open(TestConfig.url(TestConfig.ADMIN_URL, path));
assertTrue(driver.getPageSource().contains("查询")
|| driver.getPageSource().contains("申请")
|| driver.getPageSource().contains("商品"));
}
}
用户端社区服务测试代码片段:
java
@Test
@DisplayName("USER-COM-004/005/006/007 社区服务入口可访问")
void communityServiceRoutesShouldRender() {
String[] paths = {
"/community/charge",
"/community/property",
"/community/visitor",
"/community/parking"
};
for (String path : paths) {
open(TestConfig.url(TestConfig.USER_URL, path));
assertTrue(driver.getPageSource().length() > 200);
}
}
java
@Test
@DisplayName("USER-GOODS-001 用户端首页渲染")
void userHomeShouldRender() {
open(TestConfig.USER_URL);
assertTrue(pageContains("智慧社区") || pageContains("商品选购") || pageContains("生活缴费"));
saveScreenshot("USER-GOODS-001-user-home");
}
@Test
@DisplayName("USER-GOODS-004/005/006 商品列表支持搜索、分类和价格筛选入口")
void goodsListShouldExposeSearchAndFilters() {
open(TestConfig.url(TestConfig.USER_URL, "/goods/list"));
assertTrue(pageContains("商品") || pageContains("分类") || pageContains("价格") || pageContains("搜索"));
saveScreenshot("USER-GOODS-004-goods-list");
}
@Test
@Disabled("购物车写入和下单会产生业务数据,需测试库或演示账号隔离后开启")
@DisplayName("USER-GOODS-WRITE 购物车写入和下单流程预留")
void cartAndOrderWriteFlowReserved() {
open(TestConfig.url(TestConfig.USER_URL, "/carts/index"));
}
Selenium-Java 执行结果截图

本次 Selenium-Java 执行结果为失败,失败原因包括管理端登录后等待超时、AI 前端在 127.0.0.1:5175 下连接被拒绝。报告将该结果作为真实测试证据和缺陷线索记录,不伪造通过。target/screenshots 中已生成部分通过用例的页面截图。
无法安全自动执行的写入型 UI 用例已在 Selenium-Java 中预留 @Disabled 方法,例如购物车写入、下单和社区审批。跳过原因统一标注为"需测试库或可回滚演示数据后开启",避免在正式库中制造订单、购物车或审批状态数据。
tests 测试用例编写思维导图

Python 接口自动化测试代码
接口自动化代码位于:
text
scripts/qa/api-automation/test_api.py
运行命令:
powershell
cd scripts\qa\api-automation
python -m pip install -r requirements.txt
python -m pytest
主后端公共接口测试代码片段:
python
def test_USER_GOODS_002_category_tree():
status, payload = request("/goods/category/tree")
assert status == 200
assert len(payload) > 20
def test_USER_GOODS_003_hot_top_10():
status, payload = request("/goods/special/hotTop10")
assert status == 200
assert len(payload) > 20
管理端登录和业务接口测试代码片段:
python
@pytest.fixture(scope="session")
def admin_token():
_, payload = request(
"/admin/auth/login",
method="POST",
body={"adminName": ADMIN_NAME, "adminPassword": ADMIN_PASSWORD},
)
data = json.loads(payload)
body = data.get("body", data)
token = body.get("accessToken")
if not token:
pytest.skip("管理员登录响应中未取得 accessToken")
return token
def test_ADMIN_004_to_009_admin_business_apis(path, admin_token):
post_admin_list(path, admin_token)
@pytest.mark.skip(reason="审批操作会修改车位申请状态,需测试库或可回滚演示数据后开启")
def test_ADMIN_WRITE_parking_approval_flow_reserved(admin_token):
request(
"/admin/community/parking/application/audit",
method="POST",
body={"id": 1, "status": 1},
headers=admin_headers(admin_token),
)
安全测试代码片段:
python
def test_SEC_003_swagger_group_json():
status, payload = request("/v2/api-docs?group=communityApi")
assert status == 200
assert "swagger" in payload
def test_SEC_005_xss_payload_not_present_in_frontend_shells():
for url in (USER_FRONTEND, ADMIN_FRONTEND, AI_FRONTEND):
_, payload = request(url, headers={"Accept": "text/html"}, expected=(200,))
assert "<script>alert" not in payload.lower()
python
def test_USER_GOODS_001_user_home_http_ok():
status, payload = request(USER_FRONTEND, headers={"Accept": "text/html"}, expected=(200,))
assert status == 200
assert len(payload) > 100
@pytest.mark.parametrize("path", ["goods/list", "carts/index"])
def test_USER_GOODS_004_to_008_user_goods_routes(path):
status, payload = request(
urljoin(USER_FRONTEND + "/", path),
headers={"Accept": "text/html"},
expected=(200,),
)
assert status == 200
assert len(payload) > 100
@pytest.mark.skip(reason="购物车写入和下单会产生业务数据,需测试库或演示账号隔离后开启")
def test_USER_GOODS_WRITE_cart_and_order_flow_reserved():
request("/cart/add", method="POST", body={"goodsId": 1, "quantity": 1})
def test_SEC_004_default_swagger_path_available():
status, payload = request("/v2/api-docs", expected=(200,))
assert status == 200
assert "swagger" in payload
Python 接口自动化执行结果截图

本次 pytest 执行结果为 45 passed / 2 skipped。已覆盖用户端 /goods/list 直达、Swagger 默认路径、主后端公共接口、AI 后端接口和三端前端入口;写入型业务用例保留跳过原因,需测试库或可回滚演示账号后开启。
无法安全自动执行的写入型接口用例在 test_api.py 中使用 @pytest.mark.skip 预留,包括购物车写入、下单和审批操作;待测试库、演示账号和可回滚数据准备完成后再移除跳过标记执行。
创建自动化烟测脚本
脚本位置:
text
scripts/qa/runtime-smoke.ps1
执行命令:
powershell
powershell -ExecutionPolicy Bypass -File scripts\qa\runtime-smoke.ps1
如默认前端端口被占用,可指定备用端口:
powershell
powershell -ExecutionPolicy Bypass -File scripts\qa\runtime-smoke.ps1 `
-UserFrontendUrl http://127.0.0.1:6173 `
-AdminFrontendUrl http://127.0.0.1:6174 `
-AiFrontendUrl http://127.0.0.1:6175
自动化测试目录结构图

自动化测试工具准备
| 工具 | 用途 |
|---|---|
| PowerShell | 执行本地烟测脚本 |
| curl / Invoke-WebRequest | 验证 HTTP 接口 |
| 浏览器 | 检查前端页面渲染 |
| npm audit | 检查前端依赖漏洞 |
| Maven / npm | 构建验证 |

测试用例执行结果
| 编号 | 覆盖项 | 检查方式 |
|---|---|---|
| SMOKE-001 | 中间件端口 | 检查 3306/6379/5672/15672/9200 |
| SMOKE-002 | 后端端口 | 检查 8099/8100 |
| SMOKE-003 | 前端端口 | 检查 5173/5174/5175 或备用端口 |
| SMOKE-004 | Redis | redis-cli ping,不可用时退化为端口检查 |
| SMOKE-005 | ElasticSearch | GET http://127.0.0.1:9200 |
| SMOKE-006 | 主后端接口 | 商品分类、热销商品、验证码 |
| SMOKE-007 | AI 接口 | 健康检查、快捷问题、知识库 |
| SMOKE-008 | Swagger | /swagger-resources 和分组 JSON |
自动化烟测执行结果截图

(3) 性能测试
性能测试工具采用 Apache JMeter 5.5,测试计划位于:
text
scripts/qa/jmeter/community-performance-test-plan.jmx
执行命令:
powershell
cd scripts\qa\jmeter
$env:COMMUNITY_ADMIN_PASSWORD="<演示账号密码>"
powershell -ExecutionPolicy Bypass -File .\run-jmeter.ps1
JMeter 测试设计
| 配置项 | 本轮设置 | 说明 |
|---|---|---|
| 线程数 | 10 | 模拟 10 个并发用户 |
| Ramp-Up | 10 秒 | 线程逐步启动,避免瞬时冲击过大 |
| 循环次数 | 5 | 每个线程执行 5 轮请求 |
| 请求总数 | 350 | 7 个接口 × 10 线程 × 5 轮 |
| 执行方式 | 非 GUI 模式 | 生成 JTL 和 HTML 报告 |
JMeter 压测接口
| ID | 接口 | 类型 | 说明 |
|---|---|---|---|
| PERF-API-001 | /swagger-resources |
主后端 | Swagger 分组接口 |
| PERF-API-002 | /goods/category/tree |
主后端 | 商品分类树 |
| PERF-API-003 | /goods/special/hotTop10 |
主后端 | 热销商品 Top10 |
| PERF-API-004 | /admin/auth/login |
主后端 | 管理员登录接口 |
| PERF-AI-001 | /api/chat/health |
AI 后端 | AI 健康检查 |
| PERF-AI-002 | /api/chat/quick-questions |
AI 后端 | 快捷问题列表 |
| PERF-AI-003 | /api/community/knowledge |
AI 后端 | 知识库列表 |
购物车写入、下单、审批等会修改业务数据的接口不纳入默认压测计划,需测试库或可回滚演示账号后开启。
本轮 JMeter 执行结果
| 指标 | 结果 | 说明 |
|---|---|---|
| 总请求数 | 350 | JMeter 已实际执行 |
| 成功数 | 350 | 本轮请求均成功 |
| 失败数 | 0 | 无失败请求 |
| 错误率 | 0% | 本轮压测通过 |
| 平均响应时间 | 12.64 ms | JMeter Total 统计值 |
| 最大耗时 | 138 ms | JMeter Total 统计值 |
| 吞吐量 | 37.61/s | JMeter Total 统计值 |
| 输出目录 | scripts/qa/jmeter/results/20260716-234121/ |
包含 JTL 与 HTML 报告 |
本轮执行前已确认主业务后端 127.0.0.1:8099 和 AI 后端 127.0.0.1:8100 可访问。JMeter 汇总结果为 350 个请求、0 个错误、错误率 0%,说明在 10 线程、10 秒启动、循环 5 次的基础并发场景下,核心只读接口和管理员登录接口能够正常响应。
JMeter HTML 报告首页截图


JMeter 响应时间截图


图 21-3 JMeter 吞吐量截图

图 21-4 JMeter 活动线程数变化图

图 21-5 JMeter 聚合报告图

图 21-6 JMeter 响应时间与吞吐量对比图

(4) 接口测试
接口测试采用只读请求,不主动执行下单、支付、审批等写入型业务。
接口测试结果汇总
| 类别 | 用例数 | 通过 | 失败 | 备注 |
|---|---|---|---|---|
| 主后端公共接口 | 3 | 3 | 0 | 商品分类、热销商品、验证码 |
| 主后端文档接口 | 3 | 3 | 0 | /v2/api-docs 与分组路径均可用 |
| AI 后端接口 | 4 | 3 | 1 | /api/ 返回 500,具体业务健康接口可用 |
| 合计 | 10 | 8 | 2 | 失败项均已记录为文档或路由差异 |
主业务后端接口
| ID | 接口 | 方法 | 预期 | 实际 |
|---|---|---|---|---|
| API-MAIN-001 | /goods/category/tree |
GET | 200,返回分类树 | 通过 |
| API-MAIN-002 | /goods/special/hotTop10 |
GET | 200,返回商品列表 | 通过 |
| API-MAIN-003 | /user/captcha/image |
GET | 200,返回图片验证码 | 通过 |
| API-MAIN-004 | /swagger-ui.html |
GET | 200,返回 Swagger UI | 通过 |
| API-MAIN-005 | /swagger-resources |
GET | 200,返回 communityApi 分组 |
通过 |
| API-MAIN-006 | /v2/api-docs |
GET | 文档 JSON | 200,返回 Swagger JSON |
| API-MAIN-007 | /v2/api-docs?group=communityApi |
GET | Swagger JSON | 通过 |
AI 后端接口
| ID | 接口 | 方法 | 预期 | 实际 |
|---|---|---|---|---|
| API-AI-001 | /api/chat/health |
GET | 200,status=UP |
通过 |
| API-AI-002 | /api/chat/quick-questions |
GET | 200,返回快捷问题 | 通过 |
| API-AI-003 | /api/community/knowledge |
GET | 200,返回知识库分页数据 | 通过 |
| API-AI-004 | /api/ |
GET | 健康页或明确 404 | 500,记录为路由兜底问题 |
图 22 Swagger UI 截图

图 23 接口请求结果截图

(5) 安全测试
| 安全项 | 测试方式 | 当前结论 | 风险级别 |
|---|---|---|---|
| 富文本 XSS | 扫描 v-html、Markdown 渲染、公告和商品详情入口 |
高风险入口已记录,本轮已修复核心清洗策略 | P1 |
| 前端依赖漏洞 | npm audit |
共发现 90 个漏洞,用户端存在 3 个 critical | P1 |
| Token 存储 | 扫描 localStorage 使用 |
XSS 后可能扩大影响面 | P1 |
| Swagger 路径 | 请求 Swagger UI 与 JSON | 分组路径可用,默认 JSON 路径 404 | P2 |
| 日志提交风险 | 扫描 .log/.err/.gz |
根目录和后端存在日志与临时输出文件 | P3 |
| 后端依赖 | 检查 systemPath、fastjson、jjwt、springfox |
存在可维护性和安全性风险 | P2 |
图 24 npm audit 结果截图

图 25 富文本安全修复或风险点截图

(6) 构建与环境测试
构建验证命令
| 子系统 | 构建命令 |
|---|---|
| 主业务后端 | cd backend\community-api && mvn clean package -DskipTests |
| 管理端 | cd frontend\admin && npm run build |
| 用户端 | cd frontend\user && npm run build |
| AI 后端 | cd backend\community-ai-assistant && mvn clean package -DskipTests |
| AI 助手前端 | cd frontend\ai-assistant && npm run build |
环境验证点
| 环境项 | 端口或命令 | 预期 |
|---|---|---|
| MySQL | 3306 |
端口监听,数据库可供主业务使用 |
| Redis | redis-cli ping |
返回 PONG |
| RabbitMQ | 5672 |
端口监听 |
| RabbitMQ 管理端 | 15672 |
HTTP 200 或登录页 |
| ElasticSearch | http://127.0.0.1:9200 |
返回集群版本 |
| 主业务后端 | 8099 |
Spring Boot 服务可访问 |
| AI 后端 | 8100 |
AI 业务接口可访问 |
| 用户端 | 5173 |
页面非空 |
| 管理端 | 5174 |
登录页可访问 |
| AI 前端 | 5175 |
页面非空 |
图 26 Maven 构建成功截图

图 27 前端构建成功截图

(7) 缺陷统计与分析
缺陷统计
| 严重级别 | 数量 | 状态 |
|---|---|---|
| P0 | 0 | 未发现阻塞级缺陷 |
| P1 | 6 | 3 个本轮修复,3 个建议后续迭代 |
| P2 | 5 | 2 个本轮修复,3 个建议后续迭代 |
| P3 | 2 | 记录为低优先级优化 |
缺陷明细
| ID | 级别 | 模块 | 问题 | 影响 | 状态 |
|---|---|---|---|---|---|
| BUG-001 | P1 | 用户端 / AI 前端 | 多处 v-html 直接或间接渲染接口内容 |
可能产生 XSS,结合 localStorage token 风险更高 | 本轮修复 |
| BUG-002 | P1 | 前端依赖 | npm audit 共发现 90 个漏洞,用户端 3 个 critical |
存在供应链安全风险 | 后续迭代 |
| BUG-003 | P1 | 认证设计 | 用户端、管理端、AI 前端均有 localStorage token/session 存储 | XSS 后可能扩大影响面 | 后续迭代 |
| BUG-004 | P1 | AI 后端 | 启动日志出现 MySQL Public Key Retrieval is not allowed |
环境兼容性不稳定 | 后续迭代 |
| BUG-005 | P1 | 运行环境 | 默认 5173/5174/5175 端口可能被其他项目占用 |
容易误测其他应用 | 本轮通过烟测脚本缓解 |
| BUG-006 | P2 | 文档 | 项目文档引用与实际目录存在偏差 | 新成员无法按规范查找文档 | 已补测试文档,其余后续补齐 |
| BUG-007 | P2 | 后端构建 | 主后端声明 Java 11,但 Maven 绑定 JDK 17 时仍可构建 | 运行环境与文档不一致 | 后续迭代 |
| BUG-008 | P2 | Swagger | /v2/api-docs 默认路径缺少可用文档 JSON |
接口测试人员容易误判 Swagger 不可用 | 本轮修复并回归通过 |
| BUG-009 | P2 | 管理端上传组件 | 图片覆盖层使用 div @click 作为操作控件 |
键盘可访问性与语义不足 | 本轮修复 |
| BUG-010 | P2 | 后端依赖 | systemPath 本地 jar、fastjson 1.2.75、jjwt 0.9.1、springfox 2.9.2 |
可维护性和安全性风险 | 后续迭代 |
| BUG-011 | P3 | 仓库卫生 | 根目录和后端存在日志、临时输出文件 | 容易误提交 | 后续清理 |
| BUG-012 | P3 | AI 前端构建 | Sass legacy JS API 警告 | 后续升级 Sass/Vite 时可能受影响 | 后续清理 |
| BUG-013 | P1 | 用户端路由 | Vite /goods 静态资源代理抢占 /goods/list 前端路由 |
浏览器直达商品列表返回后端 404 | 本轮修复并回归通过 |
图 28 缺陷报告截图

典型缺陷分析
-
Swagger 默认路径 404
已为 Swagger 补充默认 Docket,直接请求
/v2/api-docs与分组路径/v2/api-docs?group=communityApi均可返回文档 JSON。 -
用户端商品列表直达路由 404
用户端
/goods/list前端路由已为 Vite/goods代理增加 HTML 请求绕过,浏览器直达时返回用户端前端页面。 -
富文本 XSS 风险
商品详情、公告详情和 AI Markdown 都可能渲染接口返回内容。若不清洗,脚本片段可能在页面执行。该风险已记录为 P1,并推动清洗策略修复。
总结测试 tips
- 先确认端口归属,再开始页面测试,避免误测其他项目。
- 前后端分离项目不能只看页面打开,还要核对请求路径、状态码、响应结构和数据库状态。
- 写入型流程如购物车、订单、车位申请、审批,建议使用专用测试库执行。
- Swagger 文档要确认分组路径,不能只请求默认
/v2/api-docs后就判断不可用。 - 构建成功只代表代码可编译,不代表 MySQL、Redis、RabbitMQ、ElasticSearch、SMTP 或模型服务全部可用。
- 富文本、Markdown、公告详情、商品详情等内容展示入口必须纳入 XSS 测试。
- 测试报告中不得写入数据库密码、邮箱授权码、Token、API Key 或个人隐私信息。
- 缺陷报告要写清楚影响、优先级、状态和后续建议。
感谢阅读,记得点赞、关注、收藏,欢迎各位评论区交流!!!