构建有弹性的 Go 应用程序:模拟和测试数据库错误响应

主要观点:在依赖数据库的应用开发中,测试代码处理各种错误场景是最大挑战之一,Azure Cosmos DB 也不例外,错误不可避免,需进行 robust 错误处理和测试。传统测试边缘情况和错误场景复杂且费力,而错误模拟可通过拦截 HTTP 请求并返回错误响应来以可控、可重复的方式测试特定场景。

关键信息

  • 常见测试错误场景的方法有在开发环境触发真实错误(不可靠难重现)、模拟整个 SDK 响应(复杂且可能不反映真实行为)、等待生产环境出错(不理想)。
  • 示例使用 Go SDK 为 Azure Cosmos DB 模拟 HTTP 错误条件(如 403 Forbidden ),通过自定义传输层CustomTransport403Error拦截请求并根据操作类型决定是否模拟错误,返回模拟错误响应并包装为azcore.ResponseError
  • 还使用自定义策略RetryLoggingPolicy观察 SDK 重试行为,记录重试过程中的详细信息,以了解应用在错误条件下的行为。
  • main函数将自定义传输和重试策略集成到 Cosmos DB 客户端中,进行ReadItem操作,若出错则提取并记录错误响应的状态码和子状态码。

重要细节

  • CustomTransport403Error通过检查请求方法和 URL 路径来确定是否为ReadItem操作,若为则模拟 403 错误并设置相关头部信息。
  • RetryLoggingPolicy在每次重试请求时记录相关信息,如状态码、子状态码和请求 URL。
  • main函数中,通过设置ClientOptionsTransportCustomTransport403ErrorPerRetryPoliciesRetryLoggingPolicy来集成自定义传输和重试策略,进行ReadItem操作并处理错误。
  • 结论指出通过使错误场景易于重现和测试,可构建更能优雅处理错误的应用,可扩展此模式测试更多复杂场景。
阅读 278
0 条评论