# Schemathesis 接口测试：从 OpenAPI 找出隐藏的500，导出 curl 重放失败请求

## 执行范围

已运行Schemathesis原生OpenAPI生成真实HTTP，触发空列表500；保存其curl复现并在修复后重放为200/null。未宣称全局最小反例或AI修复已调用。

## 输入与目标

原创本地OpenAPI接口，空列表触发500但常规样例通过

交付：OpenAPI、真实失败curl、离线报告与修复后回放记录

## 运行

在 reference 目录执行；先按文件 requirements.txt / package.json 或原生工具文档安装依赖。浏览器练习需 `npx playwright install chromium`；也可设置 `PLAYWRIGHT_EXECUTABLE_PATH` 为自己的 Chrome 路径。

```sh
python run.py
```

## 目录

- fixtures：作者原创输入，不包含用户真实资料。
- starter：读者待完成任务。
- reference：作者完成参考。
- results：作者实际运行所得或明确标注的待运行输入/预期合同。

## 七步

1. **保留正常样例**

原创mean接口对[2,4,6]返回正常结果。先验证这个样例不覆盖空数组，不能由三个正常值推断整个输入空间安全。

2. **暴露真实规格**

启动隔离本地FastAPI并读取OpenAPI。Schemathesis依据规格生成请求，不能只测试一个手写SDK函数。

3. **运行原生探索**

按固定seed与max-examples运行fuzzer，实际出现500。保留完整原生文本，不把普通Python构造JSON当作fuzz执行。

4. **保存可重放请求**

从失败报告核对curl、Content-Type和空列表body。另存使用BASE_URL的replay.sh，避免分发作者临时端口。

5. **明确空集合同**

修复参考对空列表返回mean:null/count:0。不要仅吞ZeroDivisionError再假称均值是0；合同由业务含义决定。

6. **重放同一反例**

关闭坏服务、在同一隔离入口启动修复参考，原样curl真实回200。页面保留前后HTTP差异而非只给pass计数。

7. **复核探索边界**

保存OpenAPI源码、fuzzer报告和curl响应。需要继续重新探索其他边界；本文只证明该反例修复，不证明自动缩到全局最小或所有输入安全。

## 来源

- https://raw.githubusercontent.com/schemathesis/schemathesis/master/README.md


## 原生工具与边界补充

需要curl及requirements。脚本只开随机loopback端口，两个服务都在finally停止；未连接生产接口或付费API。
