测试golang的Web应用程序查询参数的最佳做法

hen*_*dry 0 testing go

在两个必需参数的简单情况下,有四个可能的测试用例IIUC:

  1. 都是空的
  2. 第一组,但第二组
  3. 第二组但不是第一组
  4. 都设置

什么是最佳实践,请对这四个案例进行测试?

因为即使在Golang中测试第一个和最后一个案例也很冗长:

func TestGoodParameter(t *testing.T) {

        req, _ := http.NewRequest("GET", "/", nil)

        q := req.URL.Query()
        q.Add("first", "foo")
        q.Add("second", "bar")
        req.URL.RawQuery = q.Encode()

        rec := httptest.NewRecorder()
        root(rec, req)
        res := rec.Result()

        if res.StatusCode != http.StatusOK {
                t.Errorf("got %v, expected %v", res.StatusCode, http.StatusOK)
        }

}

func TestBadParameter(t *testing.T) {

        req, _ := http.NewRequest("GET", "/", nil)

        rec := httptest.NewRecorder()
        root(rec, req)
        res := rec.Result()

        if res.StatusCode != http.StatusBadRequest {
                t.Errorf("got %v, expected %v", res.StatusCode, http.StatusBadRequest)
        }

}
Run Code Online (Sandbox Code Playgroud)

还是我在这里缺少一些技巧?当说有五个参数(其中两个是可选参数)时,显然变得更加复杂!

s7a*_*ley 5

定义您的测试用例表驱动方式,并为其编写单个实现。您可以通过省略测试用例的名称来简化定义。

package main

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestParameters(t *testing.T) {
    testCases := map[string]struct {
        params map[string]string
        statusCode int
    }{
        "good params": {
            map[string]string{
                "first": "foo", "second": "bar",
            },
            http.StatusOK,
        },
        "without params": {
            map[string]string{},
            http.StatusBadRequest,
        },
    }

    for tc, tp := range testCases {
        req, _ := http.NewRequest("GET", "/", nil)
        q := req.URL.Query()
        for k, v := range tp.params {
            q.Add(k, v)
        }
        req.URL.RawQuery = q.Encode()
        rec := httptest.NewRecorder()
        root(rec, req)
        res := rec.Result()
        if res.StatusCode != tp.statusCode {
            t.Errorf("`%v` failed, got %v, expected %v", tc, res.StatusCode, tp.statusCode)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)