2016-06-08 102 views
0

我對travis和Go非常陌生。我對https服務器進行了測試,運行良好,我在本地計算機上運行了go test -v ./...,但在嘗試連接到服務器時,由於getsocketopt: connection refused錯誤,Travis的大部分時間都會失敗。它應該在https://localhost:8081上收聽。我的.travis.yml中有什麼可以阻止這種情況發生?Travis CI在嘗試測試Golang HTTP Server時失敗

這裏是我的.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()) 
      } 
    } 
}() 
+0

您是否在嘗試啓動服務器時檢查錯誤? – JimB

+0

是的,它被設置爲在執行'http.ListenAndServeTLS'命令時產生的任何錯誤都無法通過測試。雖然創建測試客戶端嘗試連接到服務器時發生故障。 – cphelps

+0

您需要先展示如何創建服務器和客戶端。這並不一定與Travis有關。 – JimB

回答

3

你啓動服務器,並嘗試連接之間沒有同步。啓動服務器後添加time.Sleep應該突出顯示該問題。

減少服務器未準備好的窗口的一種方法是同步創建net.Listener,然後在啓動服務器之前將打開的偵聽器添加到http.Server配置。 httptest.Server可以爲您執行此操作,並綁定到隨機端口以防止在測試期間發生衝突,並使用本地測試TLS證書。

相關問題