首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法生成gin-gonic服务器应用程序的代码覆盖率报告。

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

Stack Overflow用户
提问于 2019-02-08 11:58:13
回答 1查看 706关注 0票数 0
  • go版本: go版本go1.11.2 linux/amd64 64
  • gin版本(或提交参考):提交#5acf 660
  • 操作系统: Ubuntu 16.04LTS

描述

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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-调试,使用已经附加的Logger和恢复中间件创建引擎实例。 GIN-在“调试”模式下运行的调试。在生产中切换到“释放”模式。

  • 使用env:导出GIN_MODE=release
  • 使用代码: gin.SetMode(gin.ReleaseMode)

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

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

经过

覆盖范围: 100.0%的声明。/.

ok _/home/ubuntu/tmp/样本0.013s

以下是cover.cov文件的内容:

模式:计数 /home/ubuntu/tmp/sample.go:7.13,12.2 3 1 /home/ubuntu/tmp/sample.go:14.30,15.2 0 0 /home/ubuntu/tmp/sample.go:17.30,18.2 0 0

到目前为止一切都很好!但正如您所看到的,我还没有运行服务器。在file: sample.go中,当我取消注释行r.Gin()时,服务器运行。要退出应用程序,我需要执行Ctrl+C。在本例中,没有生成代码覆盖报告。,我错过了什么?

命令行输出带有r.Gin(),在sample.go中不加注释:

$ go test -covermode=count -coverpkg ./. -test.coverprofile cover.cov TestRunMain ... GIN-调试,使用已经附加的Logger和恢复中间件创建引擎实例。 GIN-在“调试”模式下运行的调试。在生产中切换到“释放”模式。

  • 使用env:导出GIN_MODE=release
  • 使用代码: gin.SetMode(gin.ReleaseMode)

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

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

GIN-调试环境变量端口未定义。默认情况下使用端口:8080

GIN-调试侦听和服务HTTP :8080

^C信号:中断

FAIL _/home/ubuntu/tmp/样本0.711 s

Cover.go的内容:

$ cat cover.cov 模式:计数

有人能告诉我我在这里错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 20:48:35

我不太知道吉恩是什么,但我想我能看出你的问题。在您的测试中,您正在调用具有http侦听器的main,这是您正在抱怨的行。似乎您认为需要CTRL +C将应用程序作为某种守护程序运行,但这是错误的,您所做的是提示应用程序过早结束,这会中断您的测试并输出错误消息。

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

代码语言:javascript
运行
复制
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/

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

代码语言:javascript
运行
复制
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()
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54591963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档