为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
缥缈止盈 2023-06-05 17:40:44
go版本:go版本go1.11.2 linux/amd64gin 版本(或提交参考):提交 #5acf660操作系统:Ubuntu 16.04LTS描述我正在尝试使用示例应用程序为 gin 服务器生成代码覆盖率报告。示例.gopackage mainimport (        "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.gopackage mainimport (        "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.711scover.go 的内容:$ 猫封面.cov模式:计数谁能告诉我我在这里缺少什么?
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

我不太清楚杜松子酒是什么,但我想我可以看到你的问题。在您的测试中,您正在调用具有 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()

    }

}

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


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信