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

问题描述 投票:0回答:1
  • go version:go go go1.11.2 linux / amd64
  • gin version(或commit ref):提交#5acf660
  • 操作系统:Ubuntu 16.04LTS

描述

我正在尝试使用示例应用程序为杜松子酒服务器生成代码覆盖率报告。 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 - TypeMode = Gantt -CoverPrint。/ ... -state.coversprofile cover.co.uk

TestRunMain ......

[GIN-debug] [警告]创建已连接Logger and Recovery中间件的Engine实例。

[GIN-debug] [警告]以“调试”模式运行。在生产中切换到“释放”模式。

  • 使用env:export 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%的报表./ ...

ok _ / 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

到目前为止一切都很好!但是你可以看到我还没有运行服务器。在file:sample.go中,当我取消注释行r.Gin()时,服务器运行。要退出应用程序,我需要执行Ctrl + C.在这种情况下,没有生成代码覆盖率报告。我错过了什么?

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

$ Go Test - TypeMode = Gantt -CoverPrint。/ ... -state.coversprofile cover.co.uk

TestRunMain ......

[GIN-debug] [警告]创建已连接Logger and Recovery中间件的Engine实例。

[GIN-debug] [警告]以“调试”模式运行。在生产中切换到“释放”模式。

  • 使用env:export 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]侦听和服务HTTP:8080

^ Csignal:中断

失败_ / home / ubuntu / tmp /样本0.711s

cover.go的内容:

$ cat cover.cov

模式:计数

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

go gin-gonic
1个回答
0
投票

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

如果这有助于你,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.