go - 在 go 中测试连接到 db 的处理程序

标签 go

我有一个连接到数据库并检索记录的处理程序。我为此写了一个测试用例,它是这样的:

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

我觉得这是一个非常基本的测试用例,我只是在检查响应长度(这是因为我希望得到一个片段)。我不确定这是否是编写测试用例的正确方法。请指出一些循环漏洞,以便我可以为其余的处理程序编写可靠的测试用例。而且,我没有使用实际的 ErrorFatal 方法来检查错误。

最佳答案

如果它有效,那么它就没错,但它并没有验证太多,只是响应主体是非空的 - 甚至不是成功的。我不确定它为什么会打印出 http.StatusOK,这是一个常量,但不会告诉您响应中的状态代码是什么。

就我个人而言,当我进行这一级别的测试时,我至少会检查响应代码是否符合预期、响应主体是否正确解码(如果它是 JSON 或 XML)、响应数据是否基本正常等。对于更复杂的有效负载我可能会使用 golden file测试。对于关键代码,我可能会使用 fuzz (aka monte carlo) test .对于性能关键代码,我可能会添加基准测试和负载测试。实际上有无数种测试代码的方法。您必须弄清楚自己的需求是什么以及如何满足这些需求。

关于go - 在 go 中测试连接到 db 的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933674/

相关文章:

python - 读取 csv 并插入数据库性能

go - 如何通过 Homebrew 软件从 1.4 升级到 1.5

go - Grafana/Prometheus 将多个 ip 可视化为查询

go - 与接收器一起使用的功能,可在go中遍历结构的某些字段

Golang : the hang of fmt. Printf 标准输出发生在 for 循环中的 fmt.Scan 标准输入旁边

git - 如何将 go pkg 添加到现有仓库?

go - 打开新的控制台窗口

go - 如何使用 pprof 工具分析基准?

go - 指向 map 范围或接口(interface) slice 范围的循环变量的指针{}

go - 改变单元测试的结构字段