Тестирование в Go с Ginkgo &
Gomega
Александр Егурнов
Team Lead Backend, Verve Group
Slide 2
Slide 2 text
Обо мне
Александр Егурнов
Team Lead Backend в Verve Group
Пишу на Go с 2016
2
Slide 3
Slide 3 text
О компании
Mobile AdTech
Продукт
Потребляет и предоставляет API
Go, MySQL, Kafka, Redis, Docker, K8s, CI/CD
3
Slide 4
Slide 4 text
План
Тестирование кода на Go
Какие варианты?
Как выбирать?
Обзор Ginkgo & Gomega
Интересные особенности
Типичные ошибки
Опыт использования
4
Slide 5
Slide 5 text
Для кого этот доклад?
Уверенное знание Go
Опыт тестирования
Выросший проект
Желание пробовать новое
5
Slide 6
Slide 6 text
Опрос
Как часто вы пишете тесты?
Никогда
Время от времени
Каждый день
Какие проблемы возникают при написании тестов?
Нет проблем
Не царская работа - тесты писать
Read-only тесты: пишутся однажды и больше не меняются
Хрупкие тесты: меняешь одну строчку кода - ломаются 40 разных тестов
Слишком живучие тесты: код сломан, тесты нет
Медленные тесты
Другое: в чат
6
Slide 7
Slide 7 text
Какие варианты есть?
Slide 8
Slide 8 text
Другой язык: Java/Python/etc
Дублирование кода
Усложнение
Разработки
CI/CD
Риски при изменениях в команде
8
Slide 9
Slide 9 text
Популярные опции
Источник: JetBrains - The State of Developer Ecosystem 2020 (https://www.jetbrains.com/lp/devecosystem-2020/go/) 9
Slide 10
Slide 10 text
testing
+ Встроенная
+ Простая
- Надо много писать самостоятельно 10
Slide 11
Slide 11 text
testing
11
Slide 12
Slide 12 text
testing
12
Slide 13
Slide 13 text
testify
assert
require
mock
suite
13
Slide 14
Slide 14 text
testify
+ Дополняет testing
+ Обширный API
+ Setup/teardown - suite
+ Mocking - mock
? Удобство API
- Ограниченная расширяемость 14
Slide 15
Slide 15 text
testify
15
Slide 16
Slide 16 text
Классическая ошибка
16
Slide 17
Slide 17 text
Ginkgo & Gomega
+ Структура
+ Setup / teardown
+ Мощный DSL
+ Естественной язык
+ Расширяемость
- Сложность 17
Slide 18
Slide 18 text
Как выбирать?
Slide 19
Slide 19 text
Когда?
Становится
сложно читать
сложно писать
неудобно менять
Разрастается обвязка - testing harness
построение / очистка тестового окружения
проверки, валидации
API клиенты
19
Зачем?
Упростить
чтение
написание
Убрать повторения
Писать тесты, а не обвязку
Бонус: переносимость
21
Slide 22
Slide 22 text
DRY vs DAMP
DRY - Don’t Repeat Yourself
DAMP - Descriptive And Meaningful Phrases
22
Slide 23
Slide 23 text
Proverb
Источник: Dave Cheney - GopherCon Singapore 2019 (https://dave.cheney.net/paste/clear-is-better-than-clever.pdf) 23
Slide 24
Slide 24 text
Proverb
Ссылки:
Clear is better than clever https://dave.cheney.net/2019/07/09/clear-is-better-than-clever
(https://dave.cheney.net/2019/07/09/clear-is-better-than-clever)
Go Proverbs https://go-proverbs.github.io/ (https://go-proverbs.github.io/)
24
Slide 25
Slide 25 text
Пирамида тестирования
End2End - весь продукт, blackbox
Integration - несколько связанных частей
Unit - одна функция или структура
Адаптировано из martinfowler.com - The Practical Test Pyramid (https://martinfowler.com/articles/practical-test-pyramid.html) 25
Slide 26
Slide 26 text
Ginkgo & Gomega
Slide 27
Slide 27 text
Что это?
Ginkgo
Фреймворк
задает структуру
контролирует твой код
https://onsi.github.io/ginkgo/ (https://onsi.github.io/ginkgo/)
Gomega
Библиотека ассертов
помогает делать утверждения
контролируется твоим кодом
http://onsi.github.io/gomega/ (http://onsi.github.io/gomega/)
27
Slide 28
Slide 28 text
Интересные особенности
Slide 29
Slide 29 text
Ginkgo
Slide 30
Slide 30 text
Testing support
30
Slide 31
Slide 31 text
Дерево тестов
31
Slide 32
Slide 32 text
Дерево тестов
Два этапа
Построение
Исполнение
Внимание: Замыкания! 32
Slide 33
Slide 33 text
Setup/Teardown
33
Slide 34
Slide 34 text
Setup/Teardown
34
Slide 35
Slide 35 text
Focus/Skip/Pending
35
Slide 36
Slide 36 text
GinkgoWriter
36
Slide 37
Slide 37 text
Gomega
Slide 38
Slide 38 text
Отдельное использование
38
Slide 39
Slide 39 text
Матчеры
39
Slide 40
Slide 40 text
Матчеры
40
Slide 41
Slide 41 text
Матчеры
41
Slide 42
Slide 42 text
Матчеры - Комбинирование
42
Slide 43
Slide 43 text
Матчеры - Трансформации
43
Slide 44
Slide 44 text
Типичные ошибки
Slide 45
Slide 45 text
Сравнение разнотипных значений
45
Slide 46
Slide 46 text
ContainElement / ContainSubstring
46
Slide 47
Slide 47 text
Eventually
47
Slide 48
Slide 48 text
Замыкания
48
Slide 49
Slide 49 text
Замыкания
49
Slide 50
Slide 50 text
Переменная цикла
50
Slide 51
Slide 51 text
Переменная цикла
51
Slide 52
Slide 52 text
GinkgoRecover
52
Slide 53
Slide 53 text
GinkgoRecover
53
Slide 54
Slide 54 text
Асинхронные тесты
54
Slide 55
Slide 55 text
Асинхронные тесты
55
Slide 56
Slide 56 text
Опыт использования
Slide 57
Slide 57 text
Положительный
Автоматизация
Читаемость
Простота освоения
Повторное использование кода
Переносимость
57
Slide 58
Slide 58 text
Отрицательный
Ловушки
Сложность
Читаемость >_<
58
Slide 59
Slide 59 text
Заключение
Пишите тесты
Пишите разные тесты
Выбирайте инструмент под задачу
Начинайте со сломанного теста
Не увлекайтесь усложнением, ищите баланс
59
Slide 60
Slide 60 text
Ссылки
Предыдущий доклад
Код https://github.com/egurnov/ginkgo-talk-2020 (https://github.com/egurnov/ginkgo-talk-2020)
Видео https://youtu.be/FaDx5GTlXNE (https://youtu.be/FaDx5GTlXNE)
60