Testing 测试golang Web应用程序查询参数的最佳实践
在两个所需参数的简单情况下,有四个可能的测试用例IIUC: 都是空的 第一盘,但不是第二盘 第二盘,但不是第一盘 两套 什么是最佳实践,测试所有四种情况 因为在Golang,即使测试第一个和最后一个案例也相当冗长: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"
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不存在