Невозможно сгенерировать отчет о покрытии кода в приложении 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()
    }
}

Дайте мне знать, если это поможет вам.

Другие вопросы по тегам