асинхронное тестирование с помощью Gingko и Gomega

#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