Ver Fonte

Загрузить файлы 'Лекции'

u20skirda há 2 anos atrás
pai
commit
3866f87367

+ 67 - 0
Лекции/Скирда Алексей 45 группа.md

@@ -0,0 +1,67 @@
+# **Unit-тестирование**
+
+# **Пирамида тестирования**
+
+![Alt-текст](https://habrastorage.org/getpro/habr/upload_files/06b/613/3c3/06b6133c389bd18af288d54386e86357.png)
+Чем шире уровень, тем больше тестов. Хорошее приложение должно иметь минимальное кол-во ручных тестов. Они дорогие и неэффективные. Если у вас не так, то ваш процесс проверки качества нездоровый.
+Если вам кажется, что тестировщик должен только тестить руками функционал перед релизом или писать автотесты, то вы не работали с хорошим тестировщиком. 
+Ручное тестирование не требует особых навыков и почти любой человек в команде это может выполнить.
+Хороший тестировщик учит и менторит всех в команде как следить за качеством.
+В большинстве случаев ручное тестирование — огромная трата денег и времени. Почти любой тест, допускающий автоматизацию, должен быть автоматизирован. 
+Это касается модульных, приемочных, интеграционных и системных тестов .
+Дорогостоящую операцию, как ручное тестирование, следует оставить для ситуаций, в которых необходимо человеческое суждение. 
+Например, если нужно проверить эстетику графического интерфейса, провести исследовательское тестирование или субъективно оценить простоту взаимодействия .
+
+# **Недостатки e2e и интеграционных тестов**
+
+В клиентских приложениях об юнит тестах почти забывают. Выделяя ресурсы только на UI тесты. Но это неправильно и не всегда полезно.
+Автоматизированные тесты не должны осуществлять проверку бизнес-правил через пользовательский интерфейс. (c) Роберт Мартин
+Это очень распространенная проблема, когда клиентские приложения проверяют корректность бизнес-логики через UI пользователя. Почему это плохо?
+Повышается хрупкость теста. Бизнес-логика никак не зависит от цвета кнопки или дизайна. Это лишь косметический эффекты, что зависят от платформы. 
+Будь у меня андроид, веб или айфон, то ни одно из устройств не должно сломать бизнес-логику. Такие тесты в будущем часто будут флаковать, а в будущем игнорироваться
+Некоторая бизнес-логика не зависят от View слоя или имеют его по-минимуму.
+Дорого для корнер-кейсов. Создавать e2e или компонентные тесты дорого по времени для всех состояний. Часто пишут только один успешный сценарий
+Долгий запуск других тестов. Обычно е2е запускаются рано утром и могут достигать 20-40 часов ожидания.
+Часто дорогие тесты детектят только факт падения, но не дают причины.
+
+# **Чем полезны unit-тесты**
+
+Модульное тестирование (unit testing) — тесты, задача которых проверить каждый класс системы по отдельности. 
+Желательно, чтобы это были минимально делимые кусочки системы, например, модули. Unit-тесты — это тесты для одного класса. 
+Такие тесты используют для тщательной проверки сложной логики и алгоритмов, инкапсулированных в одном классе.
+ Желательно, чтобы у таких классов не было изменяемых зависимостей.
+Зачем нужны юнит-тесты?
+Цель — обеспечение стабильного роста программного проекта. Ключевым словом здесь является «стабильный». 
+В начале жизни проекта развивать его довольно просто. Намного сложнее поддерживать это развитие с прошествием времени.
+
+![Alt-текст](https://habrastorage.org/getpro/habr/upload_files/af9/031/96f/af903196fb37db186ef3ad34559b3e5e.png)
+Основной смысл модульного тестирования заключается в том, чтобы избежать накапливания ошибок в будущем, а также исключить регрессию уже отлаженных модулей. 
+Например, у вас есть в целом готовое приложение, к которому необходимо добавить несколько новых функций или процессов.
+
+# **Свойства идеальных тестов**
+![Alt-текст](https://habrastorage.org/getpro/habr/upload_files/cd7/7ff/9f7/cd77ff9f7c60506875a8ac7d244a3aaa.png)
+защита от багов. Чем больше кода в проекте, тем выше шанс поймать баг. Хороший юнит-тест — лучшая защита от багов. 
+Чтобы понять насколько код хорошо защищен нужно оценить:
+объем кода, выполняемого тестом
+сложность этого кода
+важность этого кода с точки зрения бизнес-логик
+Как правило, чем больше кода тест выполняет, тем выше вероятность выявить в нем баг
+устойчивость к рефакторингу. Эта устойчивость определяет, насколько хорошо тест может пережить рефакторинг тестируемого им кода без выдачи ошибок. 
+Иначе говоря, тест не должен ломаться при улучшении кода.
+Нет привязанности к деталям имплементации. Избежать хрупкости в тестах и повысить их устойчивость к рефакторингу можно только одним способом — отвязав их от деталей имплементации тестируемой системы. 
+Тесты должны находиться как можно дальше от внутренних механизмов кода и проверять только конечный результат.
+быстрая обратная связь является одним из важнейших свойств юнит-теста. Чем быстрее работают тесты, тем больше их можно включить в проект и тем чаще вы их сможете запускать.
+простота поддержки — оценивает затраты на сопровождение кода. Метрика состоит из двух компонентов:
+Насколько сложно тест понять. Этот компонент связан с размером теста. Чем меньше кода в тесте, тем проще он читается.
+Насколько сложно тест запустить. Если тест работает с внепроцессными зависимостями, вам придется тратить время на то, чтобы поддерживать эти зависимости в рабочем состоянии
+Возможно, чтобы идеальный тест выполнял требования всех пунктов? К сожалению, создать такой тест невозможно
+
+# **Когда не стоит проводить unit-тестирование**
+
+Модульное тестирование — не универсальный инструмент проверки программного продукта. В некоторых ситуациях оно лишь отнимет время и силы, не показав значимого результата, например:
+при тестировании сложных и разветвленных алгоритмов, таких как красно-черное дерево, придется разработать большое число тестов, что существенно усложнит и замедлит проверку;
+отсутствии четких результатов — например, в математическом моделировании природных процессов, настолько сложных, что их «выход» невозможно спрогнозировать, а можно только описать в виде интервалов вероятных значений;
+тестировании кода, взаимодействующего с системой, — например, модуля, связанного с портами, таймерами и другими «нестабильными» компонентами, от которых его сложно изолировать;
+проверке всего приложения — модульное тестирование не покажет ошибки интеграции, баги ядра и другие аспекты, не относящиеся непосредственно к конкретному модулю;
+недостаточной квалификации самого разработчика и низкой культуре программирования, так как модульное тестирование работает только при строгом соблюдении технологии, постоянном отслеживании всех вносимых в модуль изменениях.
+Unit-тестирование окажется бесполезным и при проверке максимально простого кода. Точнее, оно сработает и покажет правильный результат, но сил на написание теста уйдет больше, чем на «ручной» анализ модуля.