32
Автотесты Как перестать бояться и полюбить тестировать

Автотесты и образ мышления

Embed Size (px)

Citation preview

Page 1: Автотесты и образ мышления

АвтотестыКак перестать бояться и полюбить тестировать

Page 2: Автотесты и образ мышления

Что будет?

Зачем тестировать?

Основные принципы

Как тестировать?

Что тестировать?

Какие бывают тесты?

Как не бросить их писать?

Page 3: Автотесты и образ мышления

Зачем тестировать?

Page 4: Автотесты и образ мышления

Регрессионная спираль смерти

Начальный этап Больше фич Еще больше фич Коллапс0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

Трудозатраты в зависимости от количества фич

Разработка Тестирование

Андрей Зубов
Чем больше фич реализовано в продукте, тем большее времени требуется, чтобы убедиться,что старый функционал работает корректно. При ручном тестировании с развитием продукта регрессионное тестирование занимает все больше времени, пока, наконец, затраты на тестирование не начинают превышать затраты на разработку.
Page 5: Автотесты и образ мышления

Рефакторинг

Без автотестов С автотестами

Андрей Зубов
Код нуждается в постоянном улучшении. Архитектурные решения, бывшие удачными и оправданными вчера, сегодня уже не подходят. Рефакторинг без автотестов похож на попытку переставить хрусталь с полки на полку в темном чулане.
Page 6: Автотесты и образ мышления

You Ain’t Gonna Need It

Андрей Зубов
Тесты, написанные еще до написания кода приложения, позволяют лучше понимать, что действительно нужно реализовать прямо сейчас, а что может подождать какое-то время или вообще не понадобится.
Page 7: Автотесты и образ мышления

Быстрый запуск нужного кода

Андрей Зубов
Даже если нет автотестов, мы всё равно тестируем свой код, запуская приложение и проходя по шагам реализуемый функционал. Но часто в крупных проектах запустить всё приложение целиком не проще, чем подготовить к запуску спейсшаттл. В процессе отладки это может потребоваться сделать несколько раз. Даже если приложение и запускается быстро, продраться сквозь череду экранов пользовательского интерфейса может занять какое-то время. Автоматические тесты сразу запускают именно тот код, который вас интересует в данный момент.
Page 8: Автотесты и образ мышления

Основные принципыили

Каким должен быть правильный тест?

Page 9: Автотесты и образ мышления

F.I.R.S.T.

Fast

Independent

Repeatable

Self-validating

Timely

Андрей Зубов
Тесты должны выполняться быстро (от долей секунды, до нескольких минут. Чем дольше выполняются тесты, тем реже их получается запускать. Тесты не должны зависеть друг от друга. Тесты должны давать одинаковые результаты на каждый прогон, если в кодовой базе не было изменений. Тесты сами должны проверять, правильно ли выполняется тот или иной код. Тесты должны быть написаны вовремя - поздно обычно означает никогда.
Page 10: Автотесты и образ мышления

Автоматический запуск

My code sure works, why bother?

Андрей Зубов
Тесты должны регулярно автоматически прогоняться. Люди часто забывают, или ленятся их запускать, отчего эффективность автотестов резко падает
Page 11: Автотесты и образ мышления

Читаемость

Андрей Зубов
Мы пишем тесты не для билд-сервера, но для людей, которые будут поддерживать наш код (возможно, это мы сами через несколько месяцев)
Page 12: Автотесты и образ мышления

Достоверность

Ложные срабатывания подрывают доверие к тестам

Андрей Зубов
Если тест слишком часто кричит "Волк!", то в какой-то момент ему перестанут верить и обращать на него внимание, даже если "волк" действительно случится.
Page 13: Автотесты и образ мышления

Как тестировать?

Page 14: Автотесты и образ мышления

Red-Green-Refactor

Обычно весь цикл занимает не более 15 минут

Андрей Зубов
Шаг с проверкой, что тест падает, является очень важным. Часто может оказаться, что тест проверят совсем не те условия, которые нужны для проверки разрабатываемого функционала и внесение в код ломающих изменений не повлечет за собой падения теста.
Page 15: Автотесты и образ мышления

Arrange-Act-Assert

Андрей Зубов
читаемость внутри теста также должна быть на высоком уровне, чтобы разработчик смог быстро сориентироваться, что происходит во время его выполнения
Page 16: Автотесты и образ мышления

Адвокат дьявола

Андрей Зубов
Удостовериться, что ваша группа тестов тестирует именно то, что нужно, можно стараясь написать код так, чтобы он заставлял пройти тест самым простым способом. Если при этом система очевидно не выполняет своих функций, значит требуются уточняющие тесты. В конце концов набор тестов станет надежным и сразу укажет, что тестируемая система стала вести себя неожиданным образом при внесении изменений в кодовую базу
Page 17: Автотесты и образ мышления

Outside-In & Bottom-Up

Андрей Зубов
Два подхода к разработке: Сначала писать крупные компоненты и заменять внутренние фальшивыми объектами, или сначала писать внутренние компоненты, объединяя их уже готовые в более крупную систему.
Page 18: Автотесты и образ мышления

Mocks & StubsStub

Не может провалить тест

Реагирует заданным образом на внешние воздействия, предоставляя данные или некий контекст для SUT

Mock Может провалить тест

Проверяет, были ли вызваны SUT методы замоканного объекта

Используйте не более одного мока для одного теста. Правда.

Андрей Зубов
Фальшивые объекты в коде хорошо именовать согласно их назначению
Page 19: Автотесты и образ мышления

Что делать со старым кодом?

Приоритезировать объекты, которые нужно покрыть тестами

Написать интеграционные тесты для облегчения рефакторинга

Провести рефакторинг для избавления от внешних зависимостей

Написать юнит-тесты

Page 20: Автотесты и образ мышления

Что тестировать?

Page 21: Автотесты и образ мышления

Избегайте тестирования внутренней структуры

Page 22: Автотесты и образ мышления

Старайтесь тестировать фичи

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

Фичи медленнее изменяются со временем. Если требования к фиче все-таки изменились, хорошо начать с того, чтобы модифицировать тесты под новые требования, а уже потом – код, под новые (падающие!) тесты

Тесты на фичу, написанные до её реализации, позволяют успешно реализовать YAGNI-принцип и могут служить одним из критериев приемки

Page 23: Автотесты и образ мышления

Какие бывают тесты?

Page 24: Автотесты и образ мышления

Юнит тесты

Быстрые

System Under Test == Class Under Test

Изменение тестируемого класса с большой вероятностью приведет к поломке тестов.

Page 25: Автотесты и образ мышления

Приемочные тесты

• Не используют (в идеале) фейки• Тестируют конкретные бизнес-фичи• Более устойчивы – измененияобычно не приводят к поломке тестов

Page 26: Автотесты и образ мышления

UI тесты

Фреймворки: Coded UI test project, Selenium

Медленные

Требуют специального окружения, где будет разворачиваться приложение

Page 27: Автотесты и образ мышления

Как не бросить писать тесты?

Page 28: Автотесты и образ мышления

Аргументы против тестов

У нас нет времени, нужно писать код!

Тесты только мешают – постоянно приходится переписывать!

Андрей Зубов
На самом деле, если требуется поставить качественный продукт в сжатые сроки, наличие тестов только поможет, так как позволяют быстрее выполнять код, который пишет разработчик. Если требуется изменить поведение тестируемой системы, то в первую очередь должны поменяться тесты, чтобы отразить это новое состояние
Page 29: Автотесты и образ мышления

Как же не бросить их писать?

Принять наличие тестов, как одно из условий DoD

Проводить Code Review тестов

Делиться опытом внутри команды и между командами

Андрей Зубов
и главное - показать, что тесты приносят пользу. Положительный опыт очень важен.
Page 30: Автотесты и образ мышления

Резюме

Автоматические тесты ускоряют процесс разработки

Чтобы тесты выполняли свои функции, они должны быть написаны вовремя, запускаться автоматически, быть читаемыми и надежными

Невыполнение хотя бы одного из условий скорее всего приведет к скопищу бесполезных тестов, которые проще отключить, чем разбираться как они работают

Делитесь опытом – вместе мы сильнее

Page 31: Автотесты и образ мышления

Рекомендации

• The Art of Unit Testing – Roy Osherove• Pluralsight – TDD course,• Pluralsight – Outside-in TDD

Page 32: Автотесты и образ мышления

Спасибо за внимание!