当客户端需要遇到正常服务器很少产生的响应时,调试代理就派上了用场。先定义客户端行为,再选择能够制造该状况的干预手段。

“请求失败了”这个测试用例过于宽泛。一个合法的 HTTP 错误响应、一个永远不会到达的响应,以及一个在下载中途被切断的连接,对应用提出的要求各不相同。

用例要检验的行为
完整的 HTTP 错误响应客户端是否读取状态码并执行既定的错误策略
被延迟的响应用户能否取消,超时是否在预期的阶段生效
意外的首部或主体字段解析与校验是否清晰地失败
被中断的交换不完整的数据是否仍能与已完成的结果区分开

在正确的层次介入

Charles 提供断点,可以在转发之前暂停请求或响应。被拦截的消息可以查看和编辑,也可以放行或中止。它的 Rewrite 工具会对匹配的首部、URL 或主体施加可重复的修改。限速则控制带宽和附加延迟。

这些控制手段可以检验 HTTP 客户端的行为,但带宽限制并不是随机 IP 丢包的精确模型。代理可能缓冲数据、复用连接,并另开一条上游连接。当所需条件明确位于 HTTP 之下时,应选择网络劣化工具。

让每个用例都可解释

把目标主机和路径匹配得很窄。从一次正常交换开始,只开启一项改动,并记录改了什么。如果重试到达了第二个端点,要判断同一条规则是否也应作用于那次尝试。否则,无条件的重写会把每一条恢复路径都变回最初的故障。

对于上传或类似支付的操作,响应丢失并不能证明服务器拒绝了请求。要把这种不确定性写进重试用例,而不是断言任何传输故障都可以安全重试。

检查或编辑 HTTPS 内容,需要客户端参与调试代理的 TLS 检查配置。只承载 CONNECT 的代理看到的是加密后的应用字节。请使用隔离的测试配置,事后再恢复其路由与信任设置,这样后续观察描述的才是正常客户端。

相关文章