【发布时间】:2018-12-25 02:19:21
【问题描述】:
我有一组测试,我想在 httptest.Server 的一个实例上运行它们。每个测试都有自己的处理函数。
func TestAPICaller_RunApiMethod(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(nil))
defer server.Close()
for _, test := range testData {
server.Config.Handler = http.HandlerFunc(test.handler)
t.Run(test.Name, func(t *testing.T) {
... some code which calls server
}
})
}
当使用“go test -race”运行时,此代码会引发比赛。这可能是因为服务器在 goroutine 中运行,而我正在尝试同时更改处理程序。我对么?
如果我尝试替代代码,为每个测试创建一个新服务器,那么就没有比赛:
func TestAPICaller_RunApiMethod(t *testing.T) {
for _, test := range testData {
server := httptest.NewServer(http.HandlerFunc(test.handler))
t.Run(test.Name, func(t *testing.T) {
... some code which calls server
}
server.Close()
})
}
所以首先要问什么是使用一台服务器进行测试片并在没有比赛的情况下即时更改处理程序的最佳方式?并且在性能方面值得拥有一台服务器而不是创建新服务器吗?
【问题讨论】:
标签: http testing go race-condition