Travis CI在尝试测试Golang HTTP Server时失败

时间:2016-06-08 15:05:14

标签: go travis-ci

我对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())
            }
    }
}()

1 个答案:

答案 0 :(得分:3)

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

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