#go #testing #ginkgo #gomega
#Вперед #тестирование #ginkgo #gomega
Вопрос:
Я расширил следующий код в соответствии с моими требованиями. https://github.com/radovskyb/watcher/blob/master/example/basics/main.go
Цель этого кода — отслеживать определенные события (СОЗДАНИЕ, ЗАПИСЬ) и предпринимать соответствующие действия на основе этого. Для тестирования этого кода я использую Ginkgo и Gomega, и именно здесь я ищу помощи.
Я пытаюсь протестировать нижеприведенный код (также приведен по ссылке), и я не уверен, как мне поступить.
go func() {
for {
select {
case event := <-w.Event:
fmt.Println(event) // Print the event's info.
case err := <-w.Error:
log.Fatalln(err)
case <-w.Closed:
return
}
}
}()
Я проверил, у Gomega есть поддержка асинхронного тестирования, которое поддерживает «Канал», но я попробовал пару вещей, но в итоге я инициализировал новый объект наблюдателя, который требует запуска фактического события для тестирования. Я попытался создать «tempDir», чтобы я мог вызвать событие CRETE / WRITE, а затем закрыть канал, но это не помогло, и после запуска этого конкретного теста он просто дождался закрытия канала.
w := watcher.New()
w.FilterOps(watcher.Create, watcher.Write)
dir, err := ioutil.TempDir("", "watcher2")
Expect(err).To(BeNil())
defer os.RemoveAll(dir)
tmpfile := filepath.Join(dir, "watcherremoved")
err = ioutil.WriteFile(tmpfile, []byte("init"), 0666)
Expect(err).To(BeNil())
event := <-w.Event
Eventually(event.Path).Should(Equal(ADMIN_VAULT))
<-w.Closed
Ответ №1:
Существует несколько типов тестов
Модульное тестирование
Этот метод проверяет один фрагмент кода. Например, функция или даже часть функции.
Перспектива: пользователь функции (разработчик)
Поведенческое тестирование
Это просто тестирование черного ящика, вы тестируете поведение всей своей функциональности (иногда ее части).
Перспектива: пользователь модуля
Сквозное тестирование
Это тестирование всего рабочего процесса программы.
Перспектива: пользователь программы
Конечно, существует гораздо больше типов тестов, но эти 3 покажут вам основное различие.
Первые два типа тестов должны иметь некоторый модуль, который можно повторно использовать в коде. Это означает, что вы можете использовать этот модуль в реальном производственном коде и в сценарии тестирования.
Тестирование выглядит следующим образом:
Написать тест -> Запустить тестируемую функцию (передать аргумент и получить результат) -> проверить результат.
Третий — это просто программа, которую вы компилируете и запускаете, выполняете все шаги и проверяете, все ли в порядке.
Ваш код очень плох с точки зрения тестирования. Вы не можете повторно использовать какую-либо часть кода, потому что у вас есть все в основной функции.
Итак, процедура тестирования выглядит следующим образом:
Скомпилировать программу -> запустить программу (с некоторыми параметрами) -> взаимодействовать с программой -> захватить выходные данные -> проанализировать собранные выходные данные.
Итак, решение для тестирования вашего кода — это его рефакторинг. Вам предстоит очень долгий путь, чтобы научиться писать тестируемый код.
Чтобы улучшить свои навыки, вы можете обратиться к некоторому открытому исходному коду.
Но мой совет в том, что вы можете купить эту книгу и написать ее. Это покажет вам основы тестируемого кода. Книга потрясающая, и это классика в мире ИТ.
Книга:
Test Driven Development
by Kent Beck
ISBN 13: 9780321146533
ISBN 10: 0321146530