GraphQL接口测试是软件接口测试的一种,只是被测对象从传统的REST API变成了GraphQL API。 在出具CMA 或 CNAS报告时,会被归入功能性测试或软件质量测试的范围。
特殊之处在于GraphQL本身的设计:
1. 和普通接口测试的根本区别
普通 REST 接口测试:是一个地址一个地址地测。你要测用户信息,就测 GET /users/123;要测用户的文章,就测 GET /users/123/posts。每个接口返回的结构是服务端预先定死的。
GraphQL 接口测试:只测一个地址,所有操作都往这个地址发。要什么数据、要哪些字段,都是在请求体里用查询语言自己描述的,服务端会按描述准确返回。
2. GraphQL接口测试的内容
出具带有资质报告时,机构会检查的用例:
测试查得准不准
写一个查询,只要求返回用户的名字和邮箱,服务端就不能多返回一个手机号。测试要证明返回的数据结构是不是严格符合请求,字段不多不少,层级完全一致。
测试改得对不对(变更操作)
GraphQL的增删改操作叫Mutation。测试要证明发出一条修改操作后,数据库里的数据是不是正确更新,并返回了正确的修改结果。
防范拒绝服务风险
这是GraphQL最特殊的问题。比如,用户可以构造一个循环嵌套的查询:查用户张三的朋友的朋友的朋友……无限套下去。这会导致一次查询就给服务器造成巨大压力甚至崩溃。测试必须证实接口对这种恶意深度查询和复杂度攻击有没有防御。
权限和数据泄露测试
GraphQL是单入口,所有角色都访问这一个点。测试必须证明:一个普通权限的用户,能否通过巧妙地编写查询语句,绕开限制,查到管理员才能看的敏感数据(比如所有用户的工资)。
内省功能检查
GraphQL 常会开启内省功能,用来方便地查询这个接口都支持哪些数据和操作。这等于把接口的说明书完全暴露了。在生产环境,测试一般会建议或证实该功能已经关闭,防止泄露系统schema和数据结构。
实时数据测试
如果系统用到了 GraphQL 的订阅功能来实现实时推送,测试还需要测WebSocket连接是不是稳定,有数据更新时客户端能否及时收到。