我使用相同的技术。等待 goroutine 结束。很可能它还没有设置。
此外,我建议使用竞争条件检测器运行此类测试。它有助于捕捉这种情况。然后,您可以向测试添加一些同步以使其可靠。
我的测试中的示例。一个被测试的函数应该同时检查两个网页是否包含指定的字符串。所以测试应该检查被测试的功能是否访问了两个页面
更新:附加了不正确的测试。固定的。
func TestCheckSites_TwoSlowHandlers_BothContain(t *testing.T) {
var config = GetConfig()
var v1, v2 bool
var wg sync.WaitGroup
wg.Add(2)
handler1 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer wg.Done()
v1 = true
time.Sleep(2 * config.Http.Timeout) // Use double HTTP_TIMEOUT
io.WriteString(w, "Present")
})
ts1 := httptest.NewServer(handler1)
defer ts1.Close()
handler2 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer wg.Done()
v2 = true
time.Sleep(2 * config.Http.Timeout)
io.WriteString(w, "Present")
})
ts2 := httptest.NewServer(handler2)
defer ts2.Close()
result, err := checkSites([]string{ts1.URL, ts2.URL}, "Present")
assert.Equal(t, nil, err, "Error should be nil")
assert.Contains(t, []string{""}, result, "Should be empty string")
//assert.(t, ts1.URL, result, "Should first or second empty string")
wg.Wait()
assert.Equal(t, true, v1, "First server should be visited")
assert.Equal(t, true, v2, "Second server should be visited")
}