yeg
2026-09-17 1805a7b9648ff9cfbd19129255a5a4fa62f0261e
docs/agents/testing.md
@@ -12,7 +12,7 @@
三条由此推出的硬约束:
- **迁移必须同时兼容 5.7 与 8.0**:测试只在 8.0 上跑,跑绿不代表开发库能执行(`V148` 的存储过程写法
- **迁移必须同时兼容 5.7 与 8.0**:测试只在 8.0 上跑,跑绿不代表开发库能执行(`V151` 的存储过程写法
  已在 5.7 上实跑验证过,但每次新增迁移都值得照做一遍)。
- **开发库的结构不由 Flyway 维护**:缺表缺列只能靠启动时的初始化器 best-effort 补,补不上就手工补(见下)。
- 本机 `8134` 实例上另有 `talent_card`、`talent_card_dryrun`、`talent_card_verify1` 三个库:它们是
@@ -79,8 +79,8 @@
  逐条执行 SQL(默认连开发库,可 `-Database/-DatabaseHost/-Port` 覆盖;不带 `-Yes` 只打印不执行)。
  它认得 `DELIMITER`,所以 `db/migration/V*.sql` 也能原样重放。默认指向**开发库**,别拿它去改测试库
  (测试库由 Flyway 从 `db/migration` 重建,手工 DDL 会让迁移与 history 表对不上)。
  开发者首次拿到新列:2026-09-17 的 `V149`(支付流水两列)与 `V150`(手输核销码计数表)就是这样落地的,
  对应脚本 `scripts/dev-schema-v149-payment-attempt.sql`(写法可重复执行的那份在迁移里,两者等价)。
  开发者首次拿到新列:2026-09-17 的 `V152`(支付流水两列)与 `V153`(手输核销码计数表)就是这样落地的,
  对应脚本 `scripts/dev-schema-v152-payment-attempt.sql`(写法可重复执行的那份在迁移里,两者等价)。
- 动结构之前先备份。本机**没有** mysql 客户端、也没有 Docker(README 里指向 `D:\MySQL\...` 和
  `docker exec talent-card-mysql-1` 的两条老做法都已失效),要备份就在 DB 主机上做,或照
  `scripts/reset-test-db.ps1` 的办法用项目已有的 JDBC 驱动写个单文件程序。
@@ -117,6 +117,38 @@
的回退在途)状态。以后新写这类「后台任务只处理了我这条」的用例,照它的做法先腾窗口,不要再依赖测试库的
累积状况。
## 测试库跑不起来时,先看 WSL(2026-09-17 实测)
测试库那个 8.0.36 实例跑在 **WSL 的 docker 里**(发行版 `Ubuntu-26.04`,容器 `talent-card-mysql-1`,
`127.0.0.1:8134->3306`)。WSL 虚拟机会在空闲时自己关掉,容器跟着停——于是测试全部报
```
Unable to obtain connection from database: Communications link failure
Caused by: java.net.ConnectException: Connection refused: getsockopt
```
或者更绕的一句(连接失败被 Hibernate 翻译过之后的表象):
```
Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' ...)
```
判断与恢复:
```bash
wsl.exe -d Ubuntu-26.04 -u root -- docker ps          # 容器在不在
wsl.exe -d Ubuntu-26.04 -u root -- docker start talent-card-mysql-1 talent-card-redis-1
```
**光起容器不够**:跑测试期间要有东西把 VM 挂住,否则命令一返回、VM 又空闲关掉,测试照样撞在停机缝里
(现象是容器每次 `docker ps` 都显示 `Up 2 seconds`)。用一个长命进程持有它,跑完再结束:
```bash
wsl.exe -d Ubuntu-26.04 -u root -- bash -lc "sleep 1800"   # 后台挂着,测试跑完再停
```
本机 Windows 侧没有 mysqld、没有 Docker——**别在 Windows 里找 8.0 实例**,它只在 WSL 里。
## 测试库的状态是共享的
Spring 测试共用一个 schema,测试之间不做清理(没有 `@Transactional` 回滚)。因此: