无法生成Gin-Gonic服务器应用程序的代码覆盖率报告

时间:2019-02-08 11:58:13

标签: go gin-gonic

  • go版本:go版本go1.11.2 linux / amd64
  • gin版本(或提交参考):提交#5acf660
  • 操作系统:Ubuntu 16.04LTS

说明

我正在尝试使用示例应用程序为gin服务器生成代码覆盖率报告。 sample.go

package main

import (
        "github.com/gin-gonic/gin"
)

func main() {
        r := gin.Default()
        r.GET("/ep1", getEp1)
        r.GET("/ep2", getEp2)
        //r.Run()
}

func getEp1(c *gin.Context) {
}

func getEp2(c *gin.Context) {
}

这是我的测试文件:sample_test.go

package main

import (
        "fmt"
        "testing"
)

func TestRunMain(t *testing.T) {
        fmt.Println("TestRunMain ...")
        main()
}

生成代码覆盖率的命令:

  

$ go test -covermode = count -coverpkg。/ ... -test.coverprofile cover.cov

     

TestRunMain ...

     

[GIN-debug] [警告]使用已附加Logger和Recovery中间件创建Engine实例。

     

[GIN-debug] [警告]以“ debug”模式运行。在生产中切换到“发布”模式。

     
      
  • 使用env:导出GIN_MODE = release

  •   
  • 使用代码:gin.SetMode(gin.ReleaseMode)

  •   
     

[GIN-debug] GET / ep1-> _ / home / ubuntu / tmp / sample.getEp1(3个处理程序)

     

[GIN-debug] GET / ep2-> _ / home / ubuntu / tmp / sample.getEp2(3个处理程序)

     

通过

     

覆盖率:。/ ...

中100.0%的语句      

确定_ / home / ubuntu / tmp / sample 0.013s

这是cover.cov文件的内容:

  

模式:计数

     

/home/ubuntu/tmp/sample/sample.go:7.13,12.2 3 1

     

/home/ubuntu/tmp/sample/sample.go:14.30,15.2 0 0

     

/home/ubuntu/tmp/sample/sample.go:17.30,18.2 0 0

到目前为止一切都很好!但是如您所见,我尚未运行服务器。在文件sample.go中,当我取消注释r.Gin()行时,服务器运行。要退出该应用程序,我需要执行Ctrl + C。在这种情况下,不会生成任何代码覆盖率报告。 我想念什么?

在sample.go中未注释r.Gin()的命令行输出:

  

$ go test -covermode = count -coverpkg。/ ... -test.coverprofile cover.cov

     

TestRunMain ...

     

[GIN-debug] [警告]使用已附加Logger和Recovery中间件创建Engine实例。

     

[GIN-debug] [警告]以“ debug”模式运行。在生产中切换到“发布”模式。

     
      
  • 使用env:导出GIN_MODE = release

  •   
  • 使用代码:gin.SetMode(gin.ReleaseMode)

  •   
     

[GIN-debug] GET / ep1-> _ / home / ubuntu / tmp / sample.getEp1(3个处理程序)

     

[GIN-debug] GET / ep2-> _ / home / ubuntu / tmp / sample.getEp2(3个处理程序)

     

[GIN-debug]环境变量PORT未定义。默认使用端口:8080

     

[GIN-debug]在:8080上监听和提供HTTP服务

     

^ Csignal:中断

     

失败_ / home / ubuntu / tmp / sample 0.711s

cover.go的内容:

  

$ cat cover.cov

     

模式:计数

谁能告诉我我在这里想念的东西吗?

1 个答案:

答案 0 :(得分:1)

我不太清楚杜松子酒是什么,但我想我可以看到您的问题。在您的测试中,您要呼叫具有HTTP侦听器的main,这就是您所抱怨的行。似乎您认为需要CTRL + C才能使应用程序作为某种守护程序运行,但这是错误的,您正在做的是提示您的应用程序过早结束,这会中断测试并输出错误消息。

要回答您的问题,您需要创建一个测试套件,您可以在其中运行测试,并选择在这些测试失败时也关闭您的http服务器。看看这个:https://golang.org/pkg/testing/#hdr-Main

func TestMain(m *testing.M) {
    /*set up your router or 
        database connections or
        anything else you'll need
    */
    exitCode := m.Run()
    os.Exit(exitCode)
}

现在,当为端点运行测试时,您将需要发出模拟http请求,有点像真实用户。看看这个:

https://golang.org/pkg/net/http/httptest/

我将提供一个通用的小例子。

func ATest(t* testing.T){    
    req, _ := http.NewRequest("GET", "/route", nil)
    responseRecorder = httptest.NewRecorder()
    router.ServeHTTP(responseRecorder, req)
    if (http.StatusOk != responseRecorder.Code){
        t.Fail()
    }
}

让我知道这是否对您有帮助。