为了账号安全,请及时绑定邮箱和手机立即绑定

片状单元测试中的“连接被拒绝”错误,涉及启动 HTTP 服务器并连接到它

片状单元测试中的“连接被拒绝”错误,涉及启动 HTTP 服务器并连接到它

Go
弑天下 2022-09-19 10:42:16
我正在尝试调试一个类似于以下内容的片状单元测试: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)

    }()

}


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信