У меня есть часть тестов, и я хочу запустить их на одном экземпляре 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». Вероятно, это потому, что сервер работает в горутине, и я одновременно пытаюсь изменить обработчик. Я прав?
Если я попробую альтернативный код, где я создаю новый сервер для каждого теста, то никаких гонок:
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()
})
}
Итак, первый вопрос, как лучше всего использовать один сервер для части тестов и обработчика изменений на лету без гонок? И стоит ли с точки зрения производительности иметь один сервер вместо создания новых?
handlerIdx
работает на другой горутине с сервером. Но пока это только для этих тестов и тесты не парелят, я думаю тогда все ок. 17.07.2018handlerIdx
должен быть синхронизирован. 17.07.2018