Невозможно сгенерировать отчет о покрытии кода в приложении gin-gonic server - PullRequest
0 голосов
/ 08 февраля 2019
  • версия go: версия go go1.11.2 linux / amd64
  • версия джина (или ссылка ref): 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 and 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 обработчика)

PASS

покрытие: 100,0% операторов в ./...

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] [ПРЕДУПРЕЖДЕНИЕ] Создание экземпляра 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 / sample0,711 с

Содержимое cover.go:

$ cat cover.cov

режим: count

МожетКто-нибудь, пожалуйста, скажите мне, что мне здесь не хватает?

1 Ответ

0 голосов
/ 08 февраля 2019

Я не совсем знаю, что такое Джин, но я думаю, что вижу твою проблему.В своем тесте вы вызываете main, у которого есть http-слушатель, это та строка, на которую вы жалуетесь.Похоже, вы думаете, что вам нужно сочетание клавиш 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()
    }
}

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

...