Запуск набора тестов Ginkgo (настройка BeforeSuite перед запуском любой спецификации)

Я испытываю пакеты Ginkgo (и Gomega) для модульного тестирования Go (lang) Rest API.

Мне нужно использовать глобальную настройку, которая должна быть достижима путем определения

var _ = BeforeSuite(func() {...})

Затем каждая спецификация (конкретная <file>_test.go) должна запускаться после этой глобальной настройки. К сожалению, я не могу этого сделать...

Имя моего файла набора — handlers_suite_test.go, а имя моей первой тестовой спецификации — cartContentsHandler_test.go. Мне кажется, что Ginkgo запускает тестовые файлы в алфавитном порядке, заставляя cartContentsHandler_test.go запускаться перед handlers_suite_test.go. Я поместил несколько вызовов log() в оба файла, и, к сожалению, они только подтверждают мои выводы...

Это действительно неприятная ситуация, так как я вообще не могу запустить свои тесты... Мне нужно убедиться, что соединение httptest.Server и пула БД настроено и работает до всех спецификаций.

Знаете ли вы, что нужно сделать, чтобы файл suite_test запускался в качестве самого первого файла перед спецификациями теста? (я уже пытался назвать файл пакета как _suite_test.go, но в данном случае он выглядит как набор даже не выполнено вообще).

My handlers_suite_test.go:

package handlers_test

import (
    "<PROJ>/config"
    "<PROJ>/lib"
    "<PROJ>/router"
    "github.com/gorilla/mux"
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"

    "log"
    "net/http/httptest"
    "os"
    "testing"
)

var r *mux.Router
var s *httptest.Server
var serverURL string

func TestHandlers(t *testing.T) {
    RegisterFailHandler(Fail)
    RunSpecs(t, "Caracal Handlers Suite")
}

var _ = BeforeSuite(func() {
    r = router.NewRouter()
    s = httptest.NewServer(r)
    Expect(len(s.URL)).To(BeNumerically(">", 0))
    serverURL = s.URL
    log.Print("###" + serverURL + "###\n\n") // ==> THIS PRINTS MUCH LATER AFTER log.Print() in cartContentsHandler_test.go

    cwd, _ := os.Getwd()
    cfg := config.ReadCfg(cwd + "/../config/config.json").DB
    lib.DB = lib.InitDB(cfg)
    err := lib.DB.Ping()
    Expect(err).NotTo(HaveOccurred())
})

var _ = AfterSuite(func() {
    //  lib.DB.Close() // ==> this was running into Panic...
    s.Close()
})

My cartContensHandler_test.go:

обработчики пакетов_тест

import (
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"

    "log"
    "net/http"
    "strings"
)

var _ = Describe("Handlers/CartContentsHandler", func() {
    Describe("Retrieves all available cart content types", func() {
        Context("No query string parameters", func() {
            var rdr *strings.Reader
            var req *http.Request
            var res *http.Response
            var err error
            var url = serverURL + "/cart-contents"

            log.Print(url)

            It("Makes a GET request", func() {
                rdr = strings.NewReader("")
                req, err = http.NewRequest("GET", url, rdr)
                Expect(err).NotTo(HaveOccurred())
            })

            It("retrieves a response", func() {
                res, err = http.DefaultClient.Do(req)
                Expect(err).NotTo(HaveOccurred())
            })

            It("Returns HTTP 200 OK", func() {
                Expect(res.StatusCode).To(BeNumerically("==", http.StatusOK)) // ==> NOW THIS RETURNS 404 as request is to URL without server part
            })
        })
    })
})

В корне ‹PROJ> я запускаю тесты следующим образом:

ginkgo handlers -cover --v

person shadyyx    schedule 24.03.2016    source источник
comment
Что произойдет, если вы поместите log.Print внутри функций It в cartContensHandler_test.go?   -  person user1431317    schedule 24.03.2016
comment
Хм, так что добавление нового log.Print() внутри It действительно выводит после печати в BeforeSuite! Я перенесу код настройки спецификации в It и попробую!   -  person shadyyx    schedule 24.03.2016


Ответы (2)


Что происходит, так это то, что BeforeSuite регистрирует функцию, которая будет выполняться перед набором тестов, а It регистрирует тестовую функцию, которая будет частью набора тестов. Обратные вызовы к Describe и Context выполняются немедленно. Итак, вы должны поместить все, что зависит от BeforeSuite, в It.

person user1431317    schedule 24.03.2016
comment
Ты мой герой! Спасибо!!! Наконец-то я могу запускать тесты для одного пакета с одной глобальной настройкой!!! Ура!!! И с использованием Ginkgo и Gomega модульные тесты также выглядят так, как я привык из мира PHP или JS :-) - person shadyyx; 24.03.2016

Чтобы гарантировать, что BeforeSuite запустит необходимую глобальную настройку до локальной настройки для блока Describe, вы должны использовать BeforeEach:

В вашем люксе:

var serverURL string

var _ = BeforeSuite(func() {
    r = router.NewRouter()
    s = httptest.NewServer(r)
    serverURL = s.URL
})

и в тесте:

var _ = Describe("Handlers/CartContentsHandler", func() {
  var url url.URL

  BeforeEach(func() {
    url = serverURL + "/cart-contents"
  })

  It("Makes a GET request", func() {
    # ....
  })
})
person Beterraba    schedule 17.04.2018