买家门户与交易测试记录 迭代2 - xiaochu-dev/online-shopping-group5 GitHub Wiki
日期:2026-10-22。对应代码:iter2-java @ c48a13a。 环境:Windows · JDK 17.0.20 · Maven 3.9.9 · Spring Boot 3.3.5 · SQLite(测试用临时库)。
本页记录 T2-13~T2-18 六个任务的全部自动化用例与真实页面证据。逐条结果由 Maven Surefire 原始报告直接渲染,未做筛选。
$env:JAVA_HOME="D:\Java\jdk-17"
& "...\mvn.cmd" -B test # 全量 83 项
& "...\mvn.cmd" -B -Dtest=PortalFlowTest+SellerTradeFlowTest+MyOrdersFlowTest test # 本模块 26 项本次最后全量执行结束于 2026-10-22 10:00:83 项,失败 0、错误 0、跳过 0,BUILD SUCCESS。

| 测试类 | 模块 · 负责人 | 用例 | 失败 | 错误 | 耗时 |
|---|---|---|---|---|---|
AuthFlowTest |
账号与客户 · 胡成溯 | 15 | 0 | 0 | 6.20s |
BuyerAuthTest |
买家账号 · 胡成溯 | 18 | 0 | 0 | 1.50s |
CommonLayerTest |
公共层 · 胡成溯 | 6 | 0 | 0 | 1.21s |
ProductCenterTest |
商品中心 · 黄程宇 | 14 | 0 | 0 | 4.50s |
ProductMigrationTest |
商品迁移 · 黄程宇 | 2 | 0 | 0 | 0.19s |
SchemaIdempotencyTest |
表结构幂等 · 黄程宇 | 2 | 0 | 0 | 1.77s |
PortalFlowTest |
买家门户 · 周到 | 14 | 0 | 0 | 3.05s |
SellerTradeFlowTest |
卖家交易 · 周到 | 9 | 0 | 0 | 1.87s |
MyOrdersFlowTest |
我的订单 · 周到 | 3 | 0 | 0 | 1.00s |
| 合计 | 83 | 0 | 0 |
本模块 26 项 = 14 + 9 + 3,包含在全量 83 项之内。
项目运行在 Java 17。用系统默认的 JDK 25 执行会整类失败,报错并不是用例本身:
MockitoException: Could not modify all classes [... BuyerContext]
Caused by: Java 25 (69) is not supported by the current version of Byte Buddy
which officially supports Java 23 (67)
@MockBean BuyerContext 依赖 Mockito 改字节码,Byte Buddy 版本上限是 Java 23。此时 Surefire 会把整个类记成 Tests run: 1, Errors: 1,看起来像用例全红,实际一个都没执行。指定 JAVA_HOME 指向 JDK 17 即恢复正常。

| 任务 | 用例 | 断言什么 |
|---|---|---|
| T2-13 列表 | 首页公开可访问且只显示在售商品 | 未登录 200、视图为 portal/product-list、model 有 pageResult/categoryTree/categoryNames;HTML 含在售商品名,不含已下架与交易中的商品 |
| 分类筛选只返回该分类商品 | 只出现该二级分类下商品 | |
| 分页参数非法时回落到默认值而不报错 |
?page=0&size=-5 仍 200,model 里 pageResult 正常生成,不抛异常 |
|
| 在售商品详情可访问且显示排队人数 | 200,含「当前有 N 人在排队」 | |
| 已下架与不存在的商品详情返回 404 | 两种都 404,不区分(不泄露存在性) | |
| 交易中的商品详情可见但下单按钮不可用 | 200,含「该商品正在交易中,暂时无法提交意向」,不含提交表单 action | |
| T2-14 搜索 | 关键词搜索命中名称也命中描述 | 名称匹配、描述匹配都能查到 |
| 关键词无匹配时显示空态提示 | 200,含空态文案,不含商品卡片 | |
| T2-15 提交意向 | 未登录提交意向跳买家登录页并带回跳地址 | 302 → /buyer/login?redirect= 且 redirect 含原商品路径 |
| 已登录下单成功并落库买家快照 | 302 回详情;库里 intent 行有 buyer_id 与联系方式快照 |
|
| 同一买家对同一商品重复提交被拒 | 第二次 302 回详情并带 error;该买家在该商品的未结束意向仍为 1 条 |
|
| 未填写交易地点时使用注册时的默认地点 | 落库地点 = 注册默认地点 | |
| 已下架商品不接受新意向 | 302 回详情并带 error 参数,不进入排队 |
|
| 交易地点与默认地点都为空时拒绝下单 | 拒绝并提示补地点,不落库 | |
| T2-16 我的订单 | 未登录访问我的订单跳买家登录页 | 302 到登录页 |
| 只显示已有结果的订单且按交易时间倒序 | 进行中的不出现;两笔已结束按时间倒序 | |
| 换号看不到别人的订单 | 换一个 buyer 登录后,HTML 不含他人商品 | |
| T2-17 卖家看客户 | 未登录访问意向管理被拦截到登录页 | 302 到 /login
|
| 卖家商品列表显示待处理意向数 | 每个商品显示待处理数,与库中 pending 计数一致 |
|
| 队列页只展示未结束的意向 | 已成功/已失败的意向不出现在队列 | |
| 跳过队首确认被拒 | 跳过第 1 位直接确认第 2 位,被拒且状态不变 | |
| T2-18 确认交易 | 确认队首后进入交易中且商品冻结 |
intent.status=trading、商品 status=frozen,且库存仍为 3(此时不扣) |
| 商品交易中不能同时开第二笔 | 第二笔确认被拒 | |
| 标记交易成功订单结束且商品解冻 |
success、trade_result=success、finished_at 已落库;商品回 on_sale,库存 3 → 2 真实扣减
|
|
| 交易失败作废后商品回到在售且库存不动 |
failed 且记下失败原因,商品回 on_sale,库存仍是 2 不扣
|
|
| 交易失败可把买家塞回队尾 | 该买家重新排到队尾,位次不前移 |
| 做法 | 原因 |
|---|---|
每个类用独立 SQLite 临时库(target/test-portal-<时间戳>.db) |
跑多少遍都互不污染,也不碰课程原库 |
登录态用 @MockBean BuyerContext 顶替 |
登录归账号与客户模块,门户只消费 current() 的结果;这样测的是"拿到身份之后门户做什么" |
| 断言 HTML 片段而不只看状态码 | 例如交易中的商品必须能看到商品名,否则买家以为商品丢了;同时断言不含提交表单 |
类内用 @Order 递进 |
状态是链式的:先下单(10),才能验证重复提交被拒(11) |
自动化之外,把系统真跑起来走了完整链路,逐页截图。以下图片均为实际页面,未做修饰。
浏览




下单



交易




买家门户的 55 秒操作录屏见 周到-第2次个人汇报 第四章。
| 未覆盖 | 说明 |
|---|---|
| 同一件商品并发抢购 | 属商品中心库存范围,已在 商品中心测试记录-迭代2 用 5 个并发任务验证(库存 3 → 恰好 3 成功) |
| 会话过期与登出 | 归账号与客户模块,门户只消费 BuyerContext.current()
|
| 真实支付、物流 | 不在迭代 2 的挑战需求 A 范围内 |
| 移动端与浏览器兼容 | 本迭代未作要求,模板按桌面宽度设计 |
| 卖家重复点击「确认」 | 现状是第二次点击被"商品交易中"规则拦下,有业务保护,但没有专门的幂等用例 |
- PortalFlowTest.java(14 项)
- SellerTradeFlowTest.java(9 项)
- MyOrdersFlowTest.java(3 项)
相关文档:买家门户与交易模块-迭代2(模块设计与路由表)、第2次阶段性评审报告、周到-第2次个人汇报