在go中正确测试http路由

时间:2017-07-24 18:51:57

标签: unit-testing go

我有5个端点,可以测试GET,POST和DELETE等方法。我使用内置测试包中的go来编写测试用例。我担心我错过了一些并不引人注目的案例。我已经在代码审查中发布了我的测试用例,但我没有得到任何回复。我也关注过这篇文章Testing HTTP routes in golang。所有这些测试用例都在检查响应代码。

问题是,我的大多数测试用例都遵循类似的模式,我以不同的格式发布数据并检查响应代码。我强烈地感觉我错过了一些会在我推送它时破坏我的API的东西。我需要一些关于测试这些路线的见解,以便我有信心将api推向prod。

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 个答案:

答案 0 :(得分:0)

我喜欢这样做:

  1. 建立持续整合。如果您的项目是开源的,您可以使用Travis CI之类的服务 - 它的安装非常简单。这有助于您了解更改如何影响代码。

  2. 设置代码测试覆盖率。它允许您查看测试中包含哪些源代码行,哪些不是,以及可能出现的错误。当然,代码覆盖工具不是灵丹妙药。如果检查了行,那并不意味着它绝对正常,并且它不会因其他输入而失败。但它有助于维护良好的代码并寻找错误。对于开源,您可以使用coveralls.io。它有一个特殊的goveralls插件。

  3. 为了解决上述问题,您可以使用所谓的模糊测试 - 随机输入的探索性测试来查找根本原因。标准https://golang.org/pkg/testing/quick/和非标准包https://github.com/dvyukov/go-fuzz

  4. 然后我尝试测试,他们既是积极的,也是消极的。我尝试检查错误,超时和错误回复的情况。

    对于我的测试,我像往常一样使用http httptest个包。