Тестирование жизненного стиля в Go. Можно ли добавить метод разрыва и вниз без дублирования кода? - PullRequest
0 голосов
/ 10 ноября 2018

Я начал работать с Go месяц назад. Я родом из java / kotlin, и мне хотелось бы понять, возможно ли добиться того же, что я делал на этих языках, даже в Go.

Моя текущая проблема заключается в следующем.

У меня есть набор интеграционных тестовых примеров, в которых мне нужно инициализировать некоторые вещи, а затем очистить ресурсы: я считаю, что это общий случай использования.

Вот некоторый псевдокод того, чего я хочу достичь, если возможно:

for each test {
  init resources
  run test {
     init test resources
     execute method under test
     assert
  }
  clean resources
}

На данный момент, что я мог попробовать, был такой подход:

func TestMain(m *testing.M) {
    setup()
    code := m.Run() 
    shutdown()
    os.Exit(code)
}

Что нормально, если не сказать, что он работает на уровне пакета. Это не дает мне большого контроля в данный момент, потому что я хотел бы запустить один из тех для тестовых файлов. (это то, что я заметил по крайней мере, пожалуйста, дайте мне знать, если я ошибаюсь)

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

address, tearDownTestCase := testutils.SetupTestCase(emptyContext, postRouter(login.LoginUser), "/login")
defer tearDownTestCase()
// init test use case data
// run test
// clean use case data

Как вы думаете, есть лучший подход?

1 Ответ

0 голосов
/ 10 ноября 2018

Go не имеет встроенной функциональности для поддержки методов разрыва и понижения.Однако есть несколько сторонних пакетов, которые позволяют это.Из всего этого мне больше всего нравится пакет ginkgo .Это очень выразительно и позволяет избежать дублирования кода.

Пример теста будет выглядеть следующим образом:

var _ = Describe("Book", func() {
    var (
        longBook  Book
        shortBook Book
    )

    BeforeEach(func() {
        longBook = Book{
            Title:  "Les Miserables",
            Author: "Victor Hugo",
            Pages:  1488,
        }

        shortBook = Book{
            Title:  "Fox In Socks",
            Author: "Dr. Seuss",
            Pages:  24,
        }
    })

    Describe("Categorizing book length", func() {
        Context("With more than 300 pages", func() {
            It("should be a novel", func() {
                Expect(longBook.CategoryByLength()).To(Equal("NOVEL"))
            })
        })

        Context("With fewer than 300 pages", func() {
            It("should be a short story", func() {
                Expect(shortBook.CategoryByLength()).To(Equal("SHORT STORY"))
            })
        })
    })
})

Сходство есть и у других методов жизненного цикла, таких как afterEach, justBeforeEach и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...