Невозможно сгенерировать отчет о покрытии кода в приложении gin-gonic server
- версия go: версия go go1.11.2 linux/amd64
- версия джина (или подтверждение ссылки): Commit #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 -covermode = count -coverpkg. /... -test.coverprofile cover.cov
TestRunMain...
[GIN-debug] [ПРЕДУПРЕЖДЕНИЕ] Создание экземпляра Engine с уже подключенным промежуточным программным обеспечением Logger и Recovery.
[GIN-debug] [WARNING] Запуск в режиме "отладки". Переключиться в режим "релиз" в производстве.
используя 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
Пока все хорошо! Но, как вы можете видеть, я еще не запускаю сервер. В файле: sample.go, когда я раскомментирую строку r.Gin(), сервер запускается. Для выхода из приложения мне нужно выполнить Ctrl+C. В этом случае не создаются отчеты о покрытии кода. Что мне не хватает?
Вывод командной строки с некомментированным r.Gin () в sample.go:
$ go test -covermode = count -coverpkg. /... -test.coverprofile cover.cov
TestRunMain...
[GIN-debug] [ПРЕДУПРЕЖДЕНИЕ] Создание экземпляра Engine с уже подключенным промежуточным программным обеспечением Logger и Recovery.
[GIN-debug] [WARNING] Запуск в режиме "отладки". Переключиться в режим "релиз" в производстве.
используя 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: прерывание
FAIL _/home/ubuntu/tmp/sample 0.711s
Содержание cover.go:
$ cat cover.cov
режим: считать
Может кто-нибудь сказать мне, что я здесь скучаю?
1 ответ
Я не совсем знаю, что такое Джин, но я думаю, что вижу твою проблему. В вашем тесте вы вызываете main, у которого есть http-слушатель, это та строка, на которую вы жалуетесь. Похоже, вы думаете, что вам нужно сочетание клавиш CTRL + C, чтобы ваше приложение работало как своего рода демон, но это неверно, но вы заставляете приложение преждевременно завершать работу, что прерывает ваши тесты и выдает сообщение об ошибке.
Чтобы ответить на ваш вопрос, вам нужно создать набор тестов, в котором вы сможете запускать свои тесты и выбрать его, когда эти тесты будут недоступны, чтобы отключить ваш http-сервер. Посмотрите на это: https://golang.org/pkg/testing/
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()
}
}
Дайте мне знать, если это поможет вам.