用调试代理设计故障用例
根据基于代理的测试需要检验的客户端行为,选择 HTTP 改写、延迟和中断的交换。
当客户端需要遇到正常服务器很少产生的响应时,调试代理就派上了用场。先定义客户端行为,再选择能够制造该状况的干预手段。
“请求失败了”这个测试用例过于宽泛。一个合法的 HTTP 错误响应、一个永远不会到达的响应,以及一个在下载中途被切断的连接,对应用提出的要求各不相同。
| 用例 | 要检验的行为 |
|---|---|
| 完整的 HTTP 错误响应 | 客户端是否读取状态码并执行既定的错误策略 |
| 被延迟的响应 | 用户能否取消,超时是否在预期的阶段生效 |
| 意外的首部或主体字段 | 解析与校验是否清晰地失败 |
| 被中断的交换 | 不完整的数据是否仍能与已完成的结果区分开 |
在正确的层次介入
Charles 提供断点,可以在转发之前暂停请求或响应。被拦截的消息可以查看和编辑,也可以放行或中止。它的 Rewrite 工具会对匹配的首部、URL 或主体施加可重复的修改。限速则控制带宽和附加延迟。
这些控制手段可以检验 HTTP 客户端的行为,但带宽限制并不是随机 IP 丢包的精确模型。代理可能缓冲数据、复用连接,并另开一条上游连接。当所需条件明确位于 HTTP 之下时,应选择网络劣化工具。
让每个用例都可解释
把目标主机和路径匹配得很窄。从一次正常交换开始,只开启一项改动,并记录改了什么。如果重试到达了第二个端点,要判断同一条规则是否也应作用于那次尝试。否则,无条件的重写会把每一条恢复路径都变回最初的故障。
对于上传或类似支付的操作,响应丢失并不能证明服务器拒绝了请求。要把这种不确定性写进重试用例,而不是断言任何传输故障都可以安全重试。
检查或编辑 HTTPS 内容,需要客户端参与调试代理的 TLS 检查配置。只承载 CONNECT 的代理看到的是加密后的应用字节。请使用隔离的测试配置,事后再恢复其路由与信任设置,这样后续观察描述的才是正常客户端。