【问题标题】:Travis CI failing when trying to test Golang HTTP ServerTravis CI 在尝试测试 Golang HTTP Server 时失败
【发布时间】:2016-06-08 15:05:14
【问题描述】:

我对 travis 和 Go 很陌生。我对 https 服务器进行了测试,它在我的本地计算机上运行 go test -v ./... 时运行良好,但由于在尝试连接到服务器时出现 getsocketopt: connection refused 错误,它在 Travis 上的大部分时间都会失败。它应该在https://localhost:8081 上收听。我的.travis.yml 中有什么东西可以防止这种情况发生吗?

这是我的.travis.yml

language: go
go:
 - 1.6
 - tip
matrix:
  allow_failures:
 - go: tip
before_install:
 - go get -v github.com/golang/lint/golint
install:
 - go get -v -d -t ./...

这是我的服务器创建代码:

func (webserver *WebServer) Start(keyLocation string, certLocation string) <-chan error {
    errors := make(chan error, 1)
    go func() {
        defer close(errors)
        errors <- http.ListenAndServeTLS(fmt.Sprintf(":%v", webserver.config.WebServerPort), certLocation, keyLocation, nil)
    }()
    return errors
}

以及客户端代码:

func createHTTPClient(t *testing.T) *http.Client {
    t.Log("Creating a test client...")
    tr := &http.Transport {
        TLSClientConfig: &tls.Config {InsecureSkipVerify: true},
    }

    t.Log("Created a test client")
    return &http.Client {Transport: tr}
}

与客户的示例请求

request, _ := http.NewRequest(httpmethod, fmt.Sprintf("https://localhost:%d/token", port), nil)
client.Do(request)

在测试中启动服务器的示例

errors := server.Start(testKeyLocation, testCertLocation)
//Handle errors from server
go func() {
    select {
        case err := <-errors:
            if err != nil {
                t.Fatalf("Error with server: %s", err.Error())
            }
    }
}()

【问题讨论】:

  • 您是否在尝试启动服务器时检查错误?
  • 是的,它被设置为对 go http.ListenAndServeTLS 命令产生的任何错误的测试失败。虽然当我创建一个测试客户端尝试连接到服务器时发生了故障。
  • 您需要先展示如何创建服务器和客户端。这不一定与 travis 有任何关系。
  • 你没有同步你的服务器的启动。您没有显示调用 Start 的位置,但不能保证服务器在之后的任何时候都在监听。 (您还应该使用 httptest.Server 为您处理绑定随机端口和 tls 证书)
  • (另外你的服务端错误处理是在另一个goroutine中没有同步,所以完全有可能是服务端失败了,但是先报客户端失败)

标签: go travis-ci


【解决方案1】:

您在启动服务器和尝试连接之间没有同步。在启动服务器后添加time.Sleep 应该会突出显示该问题。

减少服务器未准备好的窗口的一种方法是同步创建net.Listener,然后在启动服务器之前将打开的侦听器添加到http.Server 配置中。 httptest.Server 可以为您执行此操作,以及绑定到随机端口以防止测试期间发生冲突,并使用本地测试 TLS 证书。

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2018-06-03
    • 2023-03-19
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多