асинхронное тестирование с Gingko и Gomega

Я расширил следующий код в соответствии с моими требованиями. https://github.com/radovskyb/watcher/blob/master/example/basics/main.go

Цель этого кода - отслеживать определенные события (CREATE, WRITE) и предпринимать соответствующие действия на их основе. Чтобы проверить этот код, я использую 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 поддерживает асинхронное тестирование, которое поддерживает Channel, но я попробовал несколько вещей, но в итоге я инициализировал новый объект-наблюдатель, который требует запуска фактического события для тестирования. Я попытался создать 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

person tgcloud    schedule 06.01.2021    source источник


Ответы (1)


Есть несколько видов тестов

Модульное тестирование

Этот метод проверяет один фрагмент кода. Например, функция или даже часть функции.
Перспектива: функция пользователя (разработчик)

Поведенческое тестирование

Это просто тестирование черного ящика, вы тестируете поведение всей вашей функциональности (иногда ее части).
Перспектива: пользователь модуля

Сквозное тестирование

Это тестирование всего рабочего процесса программы.
Перспектива: Пользователь программы


Конечно, существует гораздо больше типов тестов, но эти 3 покажут вам основную разницу.

Первые два типа тестов должны иметь какой-то модуль, который можно повторно использовать в коде. Это означает, что вы можете использовать этот модуль в реальном производственном коде и в сценарии тестирования.

Тестирование выглядит так:

Написать тест - ›Запустить тестируемую функцию (передать аргумент и получить результат) -› Проверить результат.


Третий - это просто программа, которую вы скомпилируете и запустите, выполните все шаги и убедитесь, что они в порядке.

Ваш код очень плохой с точки зрения тестирования. Вы не можете повторно использовать какую-либо часть кода, потому что у вас есть все в функции main.

Итак, процедура тестирования выглядит так:

Скомпилировать программу - ›запустить программу (с некоторыми параметрами) -› взаимодействовать с программой - ›получить вывод -› проанализировать собранный вывод.


Итак, решение для тестирования вашего кода - это его рефакторинг. Вам предстоит очень долгий путь, чтобы научиться писать тестируемый код.

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

Но я советую вам купить эту книгу и написать ее. Это покажет вам основы тестируемого кода. Книга потрясающая, и это классика в мире информационных технологий.

Книга:

Test Driven Development 
   by Kent Beck 
ISBN 13: 9780321146533
ISBN 10: 0321146530
person Daniel Hornik    schedule 06.01.2021