![Page 1: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/1.jpg)
![Page 2: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/2.jpg)
Принципы создания тестируемого кодаИлья Шишковстарший разработчик компании Яндекс
Логотип партнера
![Page 3: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/3.jpg)
3
Что такое автотесты?
▌Юнит-тесты▌Интеграционные тесты▌Функциональные тесты▌Нагрузочные тестыи другие виды тестов, которые выполняются регулярно и автоматически
![Page 4: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/4.jpg)
Зачем нужны автотесты
![Page 5: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/5.jpg)
5
Без использования автотестов
▌ Новый код тестируется вручную
▌ Нет регулярного контроля регрессии
▌ Многие баги проявляют себя только в продакшене
▌ Любой релиз может стать большим стрессом
![Page 6: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/6.jpg)
6
При использовании автотестов
▌ Большинство багов выявляется во время разработки
▌ Регрессия выявляется сразу после заливки кода в репозиторий
▌ Значительно возрастает надёжность кода
▌ Работать гораздо комфортнее
![Page 7: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/7.jpg)
Отдельно про юнит-тесты
![Page 8: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/8.jpg)
│Юнит-тест – тест одной функции или класса отдельно от остальных частей системы
![Page 9: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/9.jpg)
Преимущества юнит-тестов
▌Контролируют корректность нового и существующего кода
▌Сокращают время между допущением ошибки и её обнаружением
![Page 10: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/10.jpg)
Преимущества юнит-тестов
▌ Являются примером применения кода
![Page 11: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/11.jpg)
Преимущества юнит-тестов
▌ Документируют поведение
![Page 12: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/12.jpg)
Преимущества юнит-тестов
▌ Упрощают поиск ошибок
![Page 13: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/13.jpg)
Не все юнит-тесты одинаково полезны
![Page 14: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/14.jpg)
14
Хороший юнит-тест▌Короткий, простой и понятный
▌Проверяет что-то одно
▌Обладает минимумом внешних зависимостей
▌Тестирует контракт без предположений о его реализации
› Контракт – публичный интерфейс, задекларированное поведение, гарантия безопасности исключений, предусловия, постусловия и т.д.
![Page 15: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/15.jpg)
Не все пишут автотесты
![Page 16: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/16.jpg)
16
Я не пишу тесты, потому что
▌ Мне некогда, у меня полно важных задач
▌ Я пишу код без багов
▌ Код слишком запутан
▌ Мне лень
▌ Закон Деметры
▌ Внедрение зависимости
▌ Принцип одной ответственности
![Page 17: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/17.jpg)
Закон Деметры
Закон Деметры Внедрение зависимостиПринцип одной ответственности
![Page 18: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/18.jpg)
18
Закон Деметры
▌ Don’t look for things. Ask directly what you need!
Название взято из проекта 80-х гг «Деметра», который использовал идеи аспектно-ориентированного и адаптивного программирования.
Проект был назван в честь Деметры, греческой богини земледелия.
Википедия
![Page 19: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/19.jpg)
19
Закон Деметры
▌Разработать класс для логирования сообщений
▌Сообщения должны сохраняться в файл
▌Сообщения должны накапливаться в буфере и сохраняться в файл, только когда он заполнился
▌Кроме того, запись в файл должна производиться после логирования каждого K-го сообщения
![Page 20: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/20.jpg)
20
Закон Деметры
![Page 21: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/21.jpg)
21
Закон Деметры
![Page 22: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/22.jpg)
22
Закон Деметры
![Page 23: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/23.jpg)
23
Закон Деметры
![Page 24: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/24.jpg)
24
Закон Деметры
![Page 25: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/25.jpg)
25
Закон Деметры▌ Хороший юнит-тест тестирует контракт без предположений о
его реализации› Контракт – публичный интерфейс, задекларированное
поведение, гарантия безопасности исключений, предусловия, постусловия и т.д.
![Page 26: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/26.jpg)
26
Закон Деметры
![Page 27: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/27.jpg)
27
Закон Деметры▌Don’t look for things. Ask directly what you need!
![Page 28: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/28.jpg)
28
Закон Деметры
![Page 29: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/29.jpg)
29
Закон Деметры
![Page 30: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/30.jpg)
30
Закон ДеметрыПреимущества:▌ Явное декларирование
зависимостей▌ Отсутствие лишних
зависимостей
▌ Упрощение повторного использования кода
▌ Упрощение тестирования
Недостатки:▌ Увеличение числа
параметров
▌ Вызовы становятся более громоздкими
![Page 31: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/31.jpg)
Внедрение зависимости
Закон Деметры Внедрение зависимостиПринцип одной ответственности
![Page 32: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/32.jpg)
32
Внедрение зависимости
Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (англ. Inversion of control, IoC), когда она применяется к управлению зависимостями.
Википедия
![Page 33: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/33.jpg)
33
Внедрение зависимости
![Page 34: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/34.jpg)
34
Внедрение зависимости
![Page 35: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/35.jpg)
35
Внедрение зависимости
![Page 36: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/36.jpg)
36
Внедрение зависимости
![Page 37: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/37.jpg)
37
Внедрение зависимости
![Page 38: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/38.jpg)
38
Внедрение зависимости
![Page 39: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/39.jpg)
39
Внедрение зависимости
![Page 40: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/40.jpg)
40
Внедрение зависимостиПреимущества▌ Зависимость от интерфейса,
а не от реализации▌ Гибкость
▌ Высокая комбинируемость кода
▌ Упрощение повторного использования кода
▌ Упрощение тестирования
Недостатки▌ Перенос деталей
реализации в интерфейс▌ Код разбивается на два
слоя: отдельные блоки и слой их «склейки»
▌ Становится сложнее понять, как работает программа целиком
![Page 41: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/41.jpg)
Принцип одной ответственности
Закон Деметры Внедрение зависимостиПринцип одной ответственности
![Page 42: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/42.jpg)
Robert C. Martin
│A class should have only one reason to change
Принцип одной ответственности
42
![Page 43: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/43.jpg)
43
Принцип одной ответственности
![Page 44: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/44.jpg)
44
Принцип одной ответственности
![Page 45: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/45.jpg)
45
Принцип одной ответственности
![Page 46: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/46.jpg)
46
Принцип одной ответственности
![Page 47: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/47.jpg)
47
Принцип одной ответственности
![Page 48: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/48.jpg)
48
Принцип одной ответственности
![Page 49: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/49.jpg)
49
Принцип одной ответственности
![Page 50: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/50.jpg)
50
Принцип одной ответственности
![Page 51: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/51.jpg)
51
Принцип одной ответственностиПреимущества▌ Код разбивается на простые
для понимания блоки
▌ Высокая комбинируемость кода
▌ Упрощение повторного использования кода
▌ Упрощение тестирования
Недостатки▌ Появление большого
количества блоков▌ Становится сложнее
понять, как работает программа целиком
![Page 52: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/52.jpg)
52
ИтогиПреимущества применения автотестов и описанных принципов▌ Повышение стабильности
кода
▌ Уменьшение числа зависимостей
▌ Упрощение рефакторинга
▌ Ускорение разработки
▌ Спокойный сон после релиза
![Page 53: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/53.jpg)
53
Ссылки› Guide: Writing Testable Code (
http://misko.hevery.com/code-reviewers-guide/)› The Clean Code Talks (
http://www.youtube.com/playlist?list=PLBDAB2BA83BB6588E)
› All Your Tests are Terrible... (https://www.youtube.com/watch?t=2285&v=u5senBJUkPc)
![Page 54: Илья Шишков, Принципы создания тестируемого кода](https://reader036.vdocuments.site/reader036/viewer/2022081513/586fb2031a28abe57d8b671f/html5/thumbnails/54.jpg)
Контакты
vk.com/ishfb
linkedin.com/in/ishfb
Илья Шишков
Старший разработчик компании Яндекс