Testing 测试golang Web应用程序查询参数的最佳实践

Testing 测试golang Web应用程序查询参数的最佳实践,testing,go,Testing,Go,在两个所需参数的简单情况下,有四个可能的测试用例IIUC: 都是空的 第一盘,但不是第二盘 第二盘,但不是第一盘 两套 什么是最佳实践,测试所有四种情况 因为在Golang,即使测试第一个和最后一个案例也相当冗长: func TestGoodParameter(t *testing.T) { req, _ := http.NewRequest("GET", "/", nil) q := req.URL.Query() q.Add("first"

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

都是空的 第一盘,但不是第二盘 第二盘,但不是第一盘 两套 什么是最佳实践,测试所有四种情况

因为在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)
        }

}

还是我在这里错过了一些技巧?如果说有五个参数,其中两个是可选的,那么情况显然会变得更加复杂

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

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)
        }
    }
}

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

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)
        }
    }
}

用以对抗冗长。一般规则。当对最佳实践有疑问时:看看stdlib是如何解决这个问题的。@volker stdlib不测试Web应用程序,现在测试吗?如果你坚持认为测试Web应用程序与测试HTTP端点有很大不同:是的。否则不行,请看一看。而且:如何从测试技术的角度测试你的Web应用并没有什么特别的。正如Cerise建议的那样,使用表驱动测试。根函数不存在,请使用它来对抗冗长。一般规则。当对最佳实践有疑问时:看看stdlib是如何解决这个问题的。@volker stdlib不测试Web应用程序,现在测试吗?如果你坚持认为测试Web应用程序与测试HTTP端点有很大不同:是的。否则不行,请看一看。而且:如何从测试技术的角度测试你的Web应用并没有什么特别的。正如Cerise建议的那样,使用表驱动测试。根func不存在