Golang HTTP集成测试

时间:2015-07-28 19:54:39

标签: go integration-testing

我用Go编写了一个小服务。我已经用httptest等测试了它,但是,我正在嘲笑数据库等...

我想做什么:

  • 启动我在生产中使用的与空数据库相同的服务器
  • 使用HTTP
  • 对其运行测试
  • 获取这些测试的覆盖范围

空数据库部分不是问题,因为我通过环境变量使所有内容都可以配置。

向它发出请求也不是问题,因为它只是标准的Go代码......

问题是:我不知道如何以一种我可以衡量它的覆盖范围(以及它的子包)的方式启动服务器。此外,主服务器代码位于main函数内...我甚至不知道我是否可以从其他地方调用它(我尝试了标准方法,但没有使用反射和类似的东西)

我是一个使用Go的新手,所以,我可能会说废话。

1 个答案:

答案 0 :(得分:6)

您可以在测试中启动http服务器,并对其发出请求。

为了更方便,您可以在测试中使用httptest.Server,并将其作为主要http.Handler。 httptest.Server有一些方法可以更好地控制启动和停止服务器,并提供URL字段来为您提供服务器的本地地址。

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, client")
}))
defer ts.Close()

res, err := http.Get(ts.URL)
if err != nil {
    log.Fatal(err)
}
greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("%s", greeting)