簡體   English   中英

在Go中正確測試HTTP路由

[英]Proper testing of http routes in go

我有5個端點,它們具有諸如GET,POST和DELETE之類的方法來進行測試。 我使用go的內置測試包編寫了測試用例。 我擔心我遺漏了一些我沒有想到的案例。我已經在代碼審查中發布了要審查的測試用例,但沒有得到任何回應。 我也關注了這篇文章, 在golang中測試HTTP路由 所有這些測試用例都在檢查響應代碼。

問題是,我的大多數測試用例都遵循類似的模式,即以不同的格式發布數據並檢查響應代碼。 我強烈感覺我缺少將API推入產品時會破壞我的API的東西。 我需要一些有關測試這些路線的見識,以便可以自信地將api推入產品。

main_test.go

func TestSigHandler(t *testing.T){

    test_cases := []string{"2021205"}  
    // GET Testing
    for _, method := range test_cases{
        usersUrl = fmt.Sprintf("%s/1/sig/id/%s", server.URL, method) //Grab the address for the API endpoint
        request, err := http.NewRequest("GET", usersUrl, nil)
        res, err := http.DefaultClient.Do(request)

        if err != nil {
            t.Error(err) //Something is wrong while sending request
        }

        if res.StatusCode != 200  {
            t.Errorf("Something went wrong : ", res.StatusCode) //Uh-oh this means our test failed
        }
    }

    // POST Testing
        sig := []byte( `{
        "raw": "a new sig"
    }`)
        usersUrl = fmt.Sprintf("%s/1/sig/id/2021205", server.URL) //Grab the address for the API endpoint
        request, err := http.NewRequest("POST", usersUrl, bytes.NewBuffer(sig))
        if err != nil{
            t.Error(err)
        }
        request.Header.Set("Content-Type", "application/json")
        res, err := http.DefaultClient.Do(request)

        if err != nil {
            t.Error(err) //Something is wrong while sending request
        }

        if res.StatusCode != 200  {
            t.Errorf(" Something Went Wrong: ", res.StatusCode) //Uh-oh this means our test failed
        }

        // DELETE Testing

        sigs_delete_cases := []string{ "1000345"}
        for _, sig_to_be_deleted := range sigs_delete_cases{
            usersUrl = fmt.Sprintf("%s/1/sig/id/%s", server.URL, sig_to_be_deleted) //Grab the address for the API endpoint
            request, err := http.NewRequest("DELETE", usersUrl, nil)
            res, err := http.DefaultClient.Do(request)

            if err != nil {
                t.Error(err) //Something is wrong while sending request
            }

            if res.StatusCode != 200  {
                t.Errorf("Tried to delete a reserved Id : ", res.StatusCode) //Uh-oh this means our test failed
            }
        }


}

我喜歡這樣:

  1. 建立持續集成。 如果您的項目是開源的,則可以使用Travis CI之類的服務-安裝非常簡單。 這可以幫助您查看更改如何影響代碼。

  2. 設置代碼測試范圍。 它使您可以查看測試覆蓋了哪些源代碼行,哪些沒有覆蓋以及在什么地方可能出現錯誤。 當然,代碼覆蓋率工具不是萬能葯。 並且,如果選中了該行,並不表示絕對正確,並且在其他輸入下也不會失敗。 但這有助於維護良好的代碼並查找錯誤。 對於開源,您可以使用coveralls.io。 有一個特殊的goveralls插件。

  3. 為了解決上述問題,您可以使用所謂的模糊測試-具有隨機輸入的探索性測試來找到根本原因。 有標准的https://golang.org/pkg/testing/quick/和非標准的軟件包https://github.com/dvyukov/go-fuzz

然后我嘗試測試,它們既是正面的也是負面的。 我嘗試檢查錯誤,超時,錯誤回復的情況。

對於我的測試,我像往常一樣使用客戶端http這樣的httptest包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM