GraphQL 测试是什么
GraphQL 只有一个端点,行为由查询语句决定,测试重点和 REST 明显不同:验证 schema 与字段级授权、查询与变更的返回结构(含 errors 数组)、参数校验错误、多层嵌套查询的性能(N+1 问题)、查询深度与复杂度限制。只对端点发固定请求测不出任何东西——同一个 URL,换个查询就是另一个世界。
基本信息
| 端点特征 | 单一 POST 端点,查询与变更都走同一入口 |
|---|---|
| 错误结构 | 顶层 errors 数组与 data 字段并存,部分成功是常态 |
| Schema 校验 | 用内省或 schema 文件核对字段类型与必填参数 |
| 权限模型 | 字段级鉴权,越权查询要逐字段验证 |
| 性能风险 | 嵌套查询放大、N+1、深度炸弹与批量别名攻击 |
| 辅助工具 | 内省查询、schema 校验工具、查询复杂度规则 |
查询与断言示例
查询与断言示例
query OrderDetail($id: ID!) {
order(id: $id) { # 变量化参数,便于多场景复用
id status amount
items { sku qty } # 嵌套字段要做深度与耗时验证
}
}
# 断言要点:data 结构与字段类型、errors 为空或符合预期错误码
# 异常场景:无效 id 应返回业务错误而不是 500典型使用场景
- 字段授权:同样查询不同角色执行,验证敏感字段被拒绝返回。
- 错误契约:参数校验失败时 errors 数组的错误码与提示符合约定。
- 嵌套性能:多层嵌套查询触发 N+1 时压测暴露慢查询。
- 限制验证:超深查询与恶意别名被复杂度限制拦截。
- 变更测试:mutation 的幂等、并发冲突与回滚行为验证。
REST 与 GraphQL 测试差异
| 维度 | REST | GraphQL |
|---|---|---|
| 端点 | 按资源多个 | 单一端点 |
| 请求形态 | 路径加查询参数 | 查询文档加变量 |
| 部分失败 | 单响应单结果 | data 与 errors 并存 |
| 权限粒度 | 接口级 | 字段级 |
| 性能坑 | 接口设计 | 嵌套与 N+1 |
别忘了禁用或加固内省:生产环境开放内省会暴露完整 schema,测试要确认策略是否符合预期。
别名轰炸要防:一个请求用大量别名放大后端调用,复杂度限制必须覆盖这种模式。
缓存策略确认:单端点让 HTTP 缓存几乎失效,客户端缓存与持久化查询的配合要一并验证。