描述
我试图使用示例应用程序为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-调试,使用已经附加的Logger和恢复中间件创建引擎实例。 GIN-在“调试”模式下运行的调试。在生产中切换到“释放”模式。
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-在“调试”模式下运行的调试。在生产中切换到“释放”模式。
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 模式:计数
有人能告诉我我在这里错过了什么吗?
发布于 2019-02-08 20:48:35
我不太知道吉恩是什么,但我想我能看出你的问题。在您的测试中,您正在调用具有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()
}
}
如果这对你有帮助,请告诉我。
https://stackoverflow.com/questions/54591963
复制相似问题