我正在尝试使用示例应用程序为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
模式:计数
谁能告诉我我在这里想念的东西吗?
答案 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()
}
}
让我知道这是否对您有帮助。