使用 httptest 单元测试 http 请求重试
php小编百草为大家介绍了一种名为"httptest"的单元测试工具,它能够帮助开发者在进行http请求重试时进行测试。这个工具不仅可以模拟各种http请求,还能够自动重试请求,以确保代码的稳定性和可靠性。使用httptest工具,开发者可以轻松进行http请求的单元测试,并且可以方便地对请求进行重试,以应对网络不稳定或者其他异常情况。这种工具的使用能够大大提升开发效率,减少出错的可能性,是每个php开发者都值得尝试的工具。
问题内容
我正在努力为名为 HttpRequest
的组件编写单元测试,该组件包装 HTTP 请求并处理响应解组。最近,我向该组件添加了一项功能,允许它在第一次尝试时遇到“连接被拒绝”错误时重试 HTTP 请求。
要使用 HttpRequest 组件,我这样调用一次:user, err := HttpRequest[User](config)
。 config 参数包含执行请求的所有必要信息,例如 URL、方法、超时、重试次数和请求正文。它还将响应正文解组为指定类型的实例(在本例中为 User
)
当我尝试测试初始请求失败并出现“连接被拒绝”错误但第二次尝试成功的场景时,就会出现问题。重试发生在组件内部,因此我只对组件进行一次调用。
我发现为这种情况创建单元测试具有挑战性,因为为了使请求因“连接被拒绝”而失败,被调用的端口上不需要有侦听器。问题是,当使用 httptest
时,它总是在创建实例时侦听端口,即使使用 httptest.NewUnstartedServer
也是如此。因此,在创建 httptest
实例后,我的客户端代码中将永远不会遇到“连接被拒绝”错误。
但是,在创建 httptest
实例之前,我不知道它将侦听哪个端口。 httptest
总是选择一个随机端口,并且无法以编程方式指定一个端口。这意味着我无法在创建 httptest
实例之前进行 HttpRequest 调用。
有人对如何有效地对这种场景进行单元测试有任何想法吗?
解决方法
newunstartedserver
非常简单:
func newunstartedserver(handler http.handler) *server { return &server{ listener: newlocallistener(), config: &http.server{handler: handler}, } }
如果自己选择一个端口适合您,您可以这样做:
func mynewunstartedserver(port int, handler http.handler) *httptest.server { addr := fmt.sprintf("127.0.0.1:%d", port) l, err := net.listen("tcp", addr) if err != nil { addr = fmt.sprintf("[::1]::%d", port) if l, err = net.listen("tcp6", addr); err != nil { panic(fmt.sprintf("httptest: failed to listen on a port: %v", err)) } } return &httptest.server{ listener: l, config: &http.server{handler: handler}, } }
创建监听器的代码修改自httptest.newlocallistener
。
另一个选择是实现 http.roundtripper
接口并使用此 roundtripper 创建一个 http.client
。以下是从 net/ 复制的示例http/client_test.go:
type recordingTransport struct { req *Request } func (t *recordingTransport) RoundTrip(req *Request) (resp *Response, err error) { t.req = req return nil, errors.New("dummy impl") } func TestGetRequestFormat(t *testing.T) { setParallel(t) defer afterTest(t) tr := &recordingTransport{} client := &Client{Transport: tr} url := "http://dummy.faketld/" client.Get(url) // Note: doesn't hit network if tr.req.Method != "GET" { t.Errorf("expected method %q; got %q", "GET", tr.req.Method) } if tr.req.URL.String() != url { t.Errorf("expected URL %q; got %q", url, tr.req.URL.String()) } if tr.req.Header == nil { t.Errorf("expected non-nil request Header") } }
以上是使用 httptest 单元测试 http 请求重试的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

本文讨论了GO编程中的GO FMT命令,该命令将代码格式化以遵守官方样式准则。它突出了GO FMT在维持代码一致性,可读性和降低样式辩论方面的重要性。 FO的最佳实践

本文介绍在Debian系统下监控PostgreSQL数据库的多种方法和工具,助您全面掌握数据库性能监控。一、利用PostgreSQL内置监控视图PostgreSQL自身提供多个视图用于监控数据库活动:pg_stat_activity:实时展现数据库活动,包括连接、查询和事务等信息。pg_stat_replication:监控复制状态,尤其适用于流复制集群。pg_stat_database:提供数据库统计信息,例如数据库大小、事务提交/回滚次数等关键指标。二、借助日志分析工具pgBadg

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...
