无法生成 gin-gonic 服务器应用程序的代码覆盖率报告
Unable to generate code coverage report of a gin-gonic server application
- go版本:go版本go1.11.2linux/amd64
- gin 版本(或提交参考):提交 #5acf660
- 操作系统:Ubuntu16.04LTS
描述
我正在尝试使用示例应用程序为 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] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
using env: export GIN_MODE=release
using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ep1 --> _/home/ubuntu/tmp/sample.getEp1 (3 handlers)
[GIN-debug] GET /ep2 --> _/home/ubuntu/tmp/sample.getEp2 (3 handlers)
PASS
coverage: 100.0% of statements in ./...
ok _/home/ubuntu/tmp/sample 0.013s
这是 cover.cov 文件的内容:
mode: count
/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
TestRunMain ...
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
using env: export GIN_MODE=release
using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ep1 --> _/home/ubuntu/tmp/sample.getEp1 (3 handlers)
[GIN-debug] GET /ep2 --> _/home/ubuntu/tmp/sample.getEp2 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
^Csignal: interrupt
FAIL _/home/ubuntu/tmp/sample 0.711s
cover.go的内容:
$ cat cover.cov
mode: count
任何人都可以告诉我我在这里缺少什么吗?
我不太清楚 Gin 是什么,但我想我能看出你的问题。在您的测试中,您正在调用具有 http 侦听器的 main,这就是您抱怨的行。似乎您认为您需要 CTRL + C 才能让您的应用程序 运行ning 成为某种守护进程,但这是错误的,您正在做的是提示您的应用程序过早结束,这会中断您的测试和输出一条错误消息。
要回答您的问题,您需要创建一个测试套件,您可以在其中 运行 您的测试,并在这些测试停止时选择它来关闭您的 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)
}
现在,当 运行ning 测试您的端点时,您将需要发出模拟 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()
}
}
如果这对你有帮助,请告诉我。
- go版本:go版本go1.11.2linux/amd64
- gin 版本(或提交参考):提交 #5acf660
- 操作系统:Ubuntu16.04LTS
描述
我正在尝试使用示例应用程序为 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] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
using env: export GIN_MODE=release
using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ep1 --> _/home/ubuntu/tmp/sample.getEp1 (3 handlers)
[GIN-debug] GET /ep2 --> _/home/ubuntu/tmp/sample.getEp2 (3 handlers)
PASS
coverage: 100.0% of statements in ./...
ok _/home/ubuntu/tmp/sample 0.013s
这是 cover.cov 文件的内容:
mode: count
/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
TestRunMain ...
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
using env: export GIN_MODE=release
using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ep1 --> _/home/ubuntu/tmp/sample.getEp1 (3 handlers)
[GIN-debug] GET /ep2 --> _/home/ubuntu/tmp/sample.getEp2 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
^Csignal: interrupt
FAIL _/home/ubuntu/tmp/sample 0.711s
cover.go的内容:
$ cat cover.cov
mode: count
任何人都可以告诉我我在这里缺少什么吗?
我不太清楚 Gin 是什么,但我想我能看出你的问题。在您的测试中,您正在调用具有 http 侦听器的 main,这就是您抱怨的行。似乎您认为您需要 CTRL + C 才能让您的应用程序 运行ning 成为某种守护进程,但这是错误的,您正在做的是提示您的应用程序过早结束,这会中断您的测试和输出一条错误消息。
要回答您的问题,您需要创建一个测试套件,您可以在其中 运行 您的测试,并在这些测试停止时选择它来关闭您的 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)
}
现在,当 运行ning 测试您的端点时,您将需要发出模拟 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()
}
}
如果这对你有帮助,请告诉我。