54

Илья Шишков, Принципы создания тестируемого кода

Embed Size (px)

Citation preview

Page 1: Илья Шишков, Принципы создания тестируемого кода
Page 2: Илья Шишков, Принципы создания тестируемого кода

Принципы создания тестируемого кодаИлья Шишковстарший разработчик компании Яндекс

Логотип партнера

Page 3: Илья Шишков, Принципы создания тестируемого кода

3

Что такое автотесты?

▌Юнит-тесты▌Интеграционные тесты▌Функциональные тесты▌Нагрузочные тестыи другие виды тестов, которые выполняются регулярно и автоматически

Page 4: Илья Шишков, Принципы создания тестируемого кода

Зачем нужны автотесты

Page 5: Илья Шишков, Принципы создания тестируемого кода

5

Без использования автотестов

▌ Новый код тестируется вручную

▌ Нет регулярного контроля регрессии

▌ Многие баги проявляют себя только в продакшене

▌ Любой релиз может стать большим стрессом

Page 6: Илья Шишков, Принципы создания тестируемого кода

6

При использовании автотестов

▌ Большинство багов выявляется во время разработки

▌ Регрессия выявляется сразу после заливки кода в репозиторий

▌ Значительно возрастает надёжность кода

▌ Работать гораздо комфортнее

Page 7: Илья Шишков, Принципы создания тестируемого кода

Отдельно про юнит-тесты

Page 8: Илья Шишков, Принципы создания тестируемого кода

│Юнит-тест – тест одной функции или класса отдельно от остальных частей системы

Page 9: Илья Шишков, Принципы создания тестируемого кода

Преимущества юнит-тестов

▌Контролируют корректность нового и существующего кода

▌Сокращают время между допущением ошибки и её обнаружением

Page 10: Илья Шишков, Принципы создания тестируемого кода

Преимущества юнит-тестов

▌ Являются примером применения кода

Page 11: Илья Шишков, Принципы создания тестируемого кода

Преимущества юнит-тестов

▌ Документируют поведение

Page 12: Илья Шишков, Принципы создания тестируемого кода

Преимущества юнит-тестов

▌ Упрощают поиск ошибок

Page 13: Илья Шишков, Принципы создания тестируемого кода

Не все юнит-тесты одинаково полезны

Page 14: Илья Шишков, Принципы создания тестируемого кода

14

Хороший юнит-тест▌Короткий, простой и понятный

▌Проверяет что-то одно

▌Обладает минимумом внешних зависимостей

▌Тестирует контракт без предположений о его реализации

› Контракт – публичный интерфейс, задекларированное поведение, гарантия безопасности исключений, предусловия, постусловия и т.д.

Page 15: Илья Шишков, Принципы создания тестируемого кода

Не все пишут автотесты

Page 16: Илья Шишков, Принципы создания тестируемого кода

16

Я не пишу тесты, потому что

▌ Мне некогда, у меня полно важных задач

▌ Я пишу код без багов

▌ Код слишком запутан

▌ Мне лень

▌ Закон Деметры

▌ Внедрение зависимости

▌ Принцип одной ответственности

Page 17: Илья Шишков, Принципы создания тестируемого кода

Закон Деметры

Закон Деметры Внедрение зависимостиПринцип одной ответственности

Page 18: Илья Шишков, Принципы создания тестируемого кода

18

Закон Деметры

▌ Don’t look for things. Ask directly what you need!

Название взято из проекта 80-х гг «Деметра», который использовал идеи аспектно-ориентированного и адаптивного программирования.

Проект был назван в честь Деметры, греческой богини земледелия.

Википедия

Page 19: Илья Шишков, Принципы создания тестируемого кода

19

Закон Деметры

▌Разработать класс для логирования сообщений

▌Сообщения должны сохраняться в файл

▌Сообщения должны накапливаться в буфере и сохраняться в файл, только когда он заполнился

▌Кроме того, запись в файл должна производиться после логирования каждого K-го сообщения

Page 20: Илья Шишков, Принципы создания тестируемого кода

20

Закон Деметры

Page 21: Илья Шишков, Принципы создания тестируемого кода

21

Закон Деметры

Page 22: Илья Шишков, Принципы создания тестируемого кода

22

Закон Деметры

Page 23: Илья Шишков, Принципы создания тестируемого кода

23

Закон Деметры

Page 24: Илья Шишков, Принципы создания тестируемого кода

24

Закон Деметры

Page 25: Илья Шишков, Принципы создания тестируемого кода

25

Закон Деметры▌ Хороший юнит-тест тестирует контракт без предположений о

его реализации› Контракт – публичный интерфейс, задекларированное

поведение, гарантия безопасности исключений, предусловия, постусловия и т.д.

Page 26: Илья Шишков, Принципы создания тестируемого кода

26

Закон Деметры

Page 27: Илья Шишков, Принципы создания тестируемого кода

27

Закон Деметры▌Don’t look for things. Ask directly what you need!

Page 28: Илья Шишков, Принципы создания тестируемого кода

28

Закон Деметры

Page 29: Илья Шишков, Принципы создания тестируемого кода

29

Закон Деметры

Page 30: Илья Шишков, Принципы создания тестируемого кода

30

Закон ДеметрыПреимущества:▌ Явное декларирование

зависимостей▌ Отсутствие лишних

зависимостей

▌ Упрощение повторного использования кода

▌ Упрощение тестирования

Недостатки:▌ Увеличение числа

параметров

▌ Вызовы становятся более громоздкими

Page 31: Илья Шишков, Принципы создания тестируемого кода

Внедрение зависимости

Закон Деметры Внедрение зависимостиПринцип одной ответственности

Page 32: Илья Шишков, Принципы создания тестируемого кода

32

Внедрение зависимости

Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (англ. Inversion of control, IoC), когда она применяется к управлению зависимостями.

Википедия

Page 33: Илья Шишков, Принципы создания тестируемого кода

33

Внедрение зависимости

Page 34: Илья Шишков, Принципы создания тестируемого кода

34

Внедрение зависимости

Page 35: Илья Шишков, Принципы создания тестируемого кода

35

Внедрение зависимости

Page 36: Илья Шишков, Принципы создания тестируемого кода

36

Внедрение зависимости

Page 37: Илья Шишков, Принципы создания тестируемого кода

37

Внедрение зависимости

Page 38: Илья Шишков, Принципы создания тестируемого кода

38

Внедрение зависимости

Page 39: Илья Шишков, Принципы создания тестируемого кода

39

Внедрение зависимости

Page 40: Илья Шишков, Принципы создания тестируемого кода

40

Внедрение зависимостиПреимущества▌ Зависимость от интерфейса,

а не от реализации▌ Гибкость

▌ Высокая комбинируемость кода

▌ Упрощение повторного использования кода

▌ Упрощение тестирования

Недостатки▌ Перенос деталей

реализации в интерфейс▌ Код разбивается на два

слоя: отдельные блоки и слой их «склейки»

▌ Становится сложнее понять, как работает программа целиком

Page 41: Илья Шишков, Принципы создания тестируемого кода

Принцип одной ответственности

Закон Деметры Внедрение зависимостиПринцип одной ответственности

Page 42: Илья Шишков, Принципы создания тестируемого кода

Robert C. Martin

│A class should have only one reason to change

Принцип одной ответственности

42

Page 43: Илья Шишков, Принципы создания тестируемого кода

43

Принцип одной ответственности

Page 44: Илья Шишков, Принципы создания тестируемого кода

44

Принцип одной ответственности

Page 45: Илья Шишков, Принципы создания тестируемого кода

45

Принцип одной ответственности

Page 46: Илья Шишков, Принципы создания тестируемого кода

46

Принцип одной ответственности

Page 47: Илья Шишков, Принципы создания тестируемого кода

47

Принцип одной ответственности

Page 48: Илья Шишков, Принципы создания тестируемого кода

48

Принцип одной ответственности

Page 49: Илья Шишков, Принципы создания тестируемого кода

49

Принцип одной ответственности

Page 50: Илья Шишков, Принципы создания тестируемого кода

50

Принцип одной ответственности

Page 51: Илья Шишков, Принципы создания тестируемого кода

51

Принцип одной ответственностиПреимущества▌ Код разбивается на простые

для понимания блоки

▌ Высокая комбинируемость кода

▌ Упрощение повторного использования кода

▌ Упрощение тестирования

Недостатки▌ Появление большого

количества блоков▌ Становится сложнее

понять, как работает программа целиком

Page 52: Илья Шишков, Принципы создания тестируемого кода

52

ИтогиПреимущества применения автотестов и описанных принципов▌ Повышение стабильности

кода

▌ Уменьшение числа зависимостей

▌ Упрощение рефакторинга

▌ Ускорение разработки

▌ Спокойный сон после релиза

Page 53: Илья Шишков, Принципы создания тестируемого кода

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: Илья Шишков, Принципы создания тестируемого кода

Контакты

vk.com/ishfb

[email protected]

linkedin.com/in/ishfb

Илья Шишков

Старший разработчик компании Яндекс