我正在尝试调试一个类似于以下内容的片状单元测试:package mainimport ( "net" "net/http" "testing" "time" "github.com/stretchr/testify/require")func TestFlaky(t *testing.T) { // Mock an API http.HandleFunc("/foo/bar", func(w http.ResponseWriter, r *http.Request) { _, err := w.Write([]byte("foobar")) require.NoError(t, err) }) go func() { require.NoError(t, http.ListenAndServe("localhost:7777", nil)) }() // Wait (up to 1 second) for the mocked API to be available conn, err := net.DialTimeout("tcp", "localhost:7777", time.Second) require.NoError(t, err) require.NoError(t, conn.Close())}但是,从错误之后的行中,我收到以下错误(仅在CI环境中):require.NoError()DialTimeout --- FAIL: TestFlaky (0.00s) main_test.go:24: Error Trace: main_test.go:24 Error: Received unexpected error: dial tcp [::1]:7777: connect: connection refused Test: TestFlaky由于测试立即失败,我猜这不是调整超时的问题。我应该如何使这个测试不片状?我正在考虑将最后三行替换为类似于以下内容的行:require.Eventually var conn net.Conn require.Eventually(t, func() bool { var err error conn, err = net.DialTimeout("tcp", "localhost:7777", time.Second) if err != nil { t.Logf("DialTimeout error: %v. Retrying...", err) return false } return true }, time.Second, 100*time.Millisecond) require.NoError(t, conn.Close())这是否足以消除测试剥落?
1 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
goroutine内部的代码不能保证在拨号之前执行(如果你在大流子之后睡觉,它应该可以工作,但这是一个丑陋的解决方案)。
另请注意,当连接稳定时,“超时拨号”正在等待 tcp 数据包,但拒绝的连接实际上是 RST 数据包。
提示:看看 httptest 包是如何工作的。
编辑:这是 httptest 的工作原理:https://cs.opensource.google/go/go/+/refs/tags/go1.16.6:src/net/http/httptest/server.go;l=304
func (s *Server) goServe() {
s.wg.Add(1)
go func() {
defer s.wg.Done()
s.Config.Serve(s.Listener)
}()
}
- 1 回答
- 0 关注
- 74 浏览
添加回答
举报
0/150
提交
取消