猿问

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

  • go版本:go版本go1.11.2 linux/amd64

  • gin 版本(或提交参考):提交 #5acf660

  • 操作系统:Ubuntu 16.04LTS

描述

我正在尝试使用示例应用程序为 gin 服务器生成代码覆盖率报告。示例.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

测试运行主要...

[GIN-debug] [WARNING] 创建一个引擎实例,其中已经附加了 Logger 和 Recovery 中间件。

[GIN 调试] [警告] 在“调试”模式下运行。在生产中切换到“发布”模式。

  • 使用环境:export GIN_MODE=release

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

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

[GIN 调试] 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。在这种情况下,不会生成代码覆盖率报告。我错过了什么?

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

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

测试运行主要...

[GIN-debug] [WARNING] 创建一个引擎实例,其中已经附加了 Logger 和 Recovery 中间件。

[GIN 调试] [警告] 在“调试”模式下运行。在生产中切换到“发布”模式。

  • 使用环境:export GIN_MODE=release

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

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

[GIN 调试] 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 的内容:

$ 猫封面.cov

模式:计数

谁能告诉我我在这里缺少什么?



缥缈止盈
浏览 126回答 1
1回答

拉莫斯之舞

我不太清楚杜松子酒是什么,但我想我可以看到你的问题。在您的测试中,您正在调用具有 http 侦听器的 main,这就是您抱怨的行。似乎您认为您需要 CTRL + C 才能让您的应用程序作为某种守护进程运行,但这是错误的,您正在做的是提示您的应用程序过早结束,这会中断您的测试并输出错误消息。要回答您的问题,您需要创建一个测试套件,您可以在其中运行测试并在这些测试停止时选择它以放下您的 http 服务器。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 请求,有点像真实用户。我将提供一个通用的小例子。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()    }}让我知道这是否对您有帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答