我有一个连接到数据库并检索记录的处理程序。我为此写了一个测试用例,它是这样的:
main_test.go
package main
import (
"os"
"fmt"
"testing"
"net/http"
"net/http/httptest"
)
var a App
func TestMain(m *testing.M) {
a = App{}
a.InitializeDB(fmt.Sprintf("postgres://****:****@localhost/db?sslmode=disable"))
code := m.Run()
os.Exit(code)
}
func TestRulesetGet(t *testing.T) {
req, err := http.NewRequest("GET", "/1/sig/", nil)
if err != nil {
t.Fatal(err)
}
// We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
rr := httptest.NewRecorder()
handler := http.HandlerFunc(a.Get)
handler.ServeHTTP(rr, req)
// Check the response body is what we expect.
if len(rr.Body.String()) != 0 {
fmt.Println("Status OK : ", http.StatusOK)
fmt.Println("handler returned body: got ",
rr.Body.String())
}
}
我觉得这是一个非常基本的测试用例,我只是在检查响应长度(这是因为我希望得到一个片段)。我不确定这是否是编写测试用例的正确方法。请指出一些循环漏洞,以便我可以为其余的处理程序编写可靠的测试用例。而且,我没有使用实际的 Error
和 Fatal
方法来检查错误。
最佳答案
如果它有效,那么它就没错,但它并没有验证太多,只是响应主体是非空的 - 甚至不是成功的。我不确定它为什么会打印出 http.StatusOK
,这是一个常量,但不会告诉您响应中的状态代码是什么。
就我个人而言,当我进行这一级别的测试时,我至少会检查响应代码是否符合预期、响应主体是否正确解码(如果它是 JSON 或 XML)、响应数据是否基本正常等。对于更复杂的有效负载我可能会使用 golden file测试。对于关键代码,我可能会使用 fuzz (aka monte carlo) test .对于性能关键代码,我可能会添加基准测试和负载测试。实际上有无数种测试代码的方法。您必须弄清楚自己的需求是什么以及如何满足这些需求。
关于go - 在 go 中测试连接到 db 的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933674/