某网站上有人提了一个问题:根据你的经验,API测试中最常见的缺陷是什么?
以下是一些网友的回复:
网友1:
毫无疑问,API测试中最困难的部分是从开发人员那里获得明确的指示信息,了解正确的请求体是什么,以及预期的响应体应该是什么。
网友2:
我认为问题出现得更早。业务分析师通常不具备技术能力,他们提交的需求往往充斥着假设和未知因素。这就是业务分析师存在的全部意义。
网友3:
我完全同意这一点……分析阶段太不可靠了,所有参与的人几乎都不想记录任何东西。所以,不可避免地会出现各种假设。
网友4:
我们要求他们在其PR(Pull Request,拉取请求)被批准之前,将Postman请求添加到我们的测试仓库中。这样我们至少有了请求体的成功案例。至于让他们进行模式验证测试,那就是另一回事了。
网友5:
以及那些没人告诉你的奇葩更新。
网友6:
有很多这类问题,关于安全方面的,最好通过谷歌搜索一下“owasp top 10 API”了解更多。我列举几个:
- 列表端点的限制参数没有设置最大边界(可能导致数据库拒绝服务攻击,即DB DOS)。
- 通过ID获取或更新实体时没有检查权限(允许一个已认证用户查看或更新属于另一个用户的实体)。
- 没有对查询参数、URL参数、有效载荷的输入进行清理(可能导致数据库或系统注入攻击)。
- 登录或获取令牌端点没有设置速率限制。
- 密码恢复端点没有基于IP的速率限制。
网友7:
需求规格说明与实现之间的不匹配。这里假设你接触到的是书面的需求说明,而不是由代码生成的说明。
我指的是请求体中那些本应为可空的部分,结果却要求你输入空字符串或空的Json对象。
网友8:
可能这不是一个常见的情况,但我最近就遇到了。我们的开发人员决定在搜索用户资料但未找到记录时返回404状态码。我建议我们应该返回204状态码,因为请求是成功的,只是没有找到记录。他们没有听取我的建议,我还告诉他们,这样会在我们上线后污染生产环境的日志。结果,上线后,果然在非工作时间接到了技术支持的电话,因为这个问题导致生产环境中触发了大量警报。他们很快就修复了这个问题。
我想说,一定要确保你的团队对响应码有统一的处理方式,因为这本不必引发这么多麻烦。
网友9:
你好,你的评论很引人深思。我立刻觉得这是错误的,而且问题不在于响应码,而在于警报规则。我从来没有想过这样的处理方式,尽管我感觉它不对,但一开始并不清楚为什么。经过一些思考和研究后,我明白了为什么这是错误的。
这违反了RESTful原则中的自描述性消息原则:
- 在RESTful API中,每个URL都旨在表示一个特定的资源。如果客户端请求一个不存在的资源,返回404 Not Found状态码是正确的方式来表明该资源不存在。这与使用标准的HTTP方法和状态码来描述资源状态的原则是一致的。
- 返回200 OK状态码意味着资源存在但当前为空,但如果路径参数无效或未映射到现有资源,则情况并非如此。
如果违反这一原则并遵循你的做法,可能会导致以下情况:
- 误导客户端逻辑:客户端可能会错误地认为资源存在且为空,从而导致应用程序中出现潜在的错误或意外行为。
- API设计不一致:这种做法可能导致API不一致且难以使用,因为它不符合RESTful服务所期望的标准做法。
- 增加客户端复杂性:开发人员可能需要在客户端添加额外的检查来处理200 OK响应为空的情况,这增加了代码的复杂性并降低了清晰度。
我们每天都会学到一些东西。干杯。
网友10:
意外的空值。
网友11:
不确定这是否常见,但最近我们遇到了一个问题:消费者发送的可选请求体参数全部为小写,而API期望的是驼峰命名法(camelCase),不过由于API会忽略所有未知字段,因此没有抛出验证错误。
直到真实用户开始注意到一些不一致之处时,我们才在生产环境中发现了这个问题。
网友12:
运行负向测试时的错误处理。似乎每个人对于应有的响应都有不同的看法。
网友13:
文档/规范 - 通常API接口会被更新/修改,但文档却跟不上进度。对于公共API来说,这可能是个大问题。
网友14:
我对此的解决方案是保持API规范在线开放,并使用遵循此规范的库来验证测试中的每个请求和响应。如果有人更改了某个接口而没有更新并发布文档,那么所有测试都将失败。
是的,类似契约测试。你只需要为自己发布契约,这份契约同时也可以作为你API的公开文档或内部文档。
网友15:
空值、未定义值和空字符串的处理。通常,开发工程师应该在整个系统中遵循相同的规则,但我经常发现响应和处理方式往往不同。
网友16:
数据完整性和处理流程不符合要求。
网友17:
在我的工作中,最常见的问题是发送POST API调用时缺少了UI中所需的值。不知为何,我的API团队总是忽略这一点。
网友18:
合约失败。最具破坏性的是生产环境中的认证失败。
网友19:
资源不足(以及运维关注不够)的预发布环境,导致你请求所依赖的服务经常宕机。
网友20:
密码套件不匹配、未找到算法等问题会导致SSL/TLS握手失败,进而造成请求失败。
那么,各位小伙伴,你认为在API测试中常见的缺陷有哪些呢?欢迎在评论区进行评论。