testing-pyramid

Какие виды тестов есть?

  • Юнит-тесты, которые тестируют какой-то мелкий фунционал. Например, класс или функцию или какой-то минимальный блок.
  • Функциональный тест тестирует связку — пакеты.
  • Интеграционные — проверка на API / DB.

Unit-тесты

Что проверяется? Модульные тесты проверяют, правильно ли работает каждый отдельный модуль (юнит) вашего кода. В идеале при планировании и написании модульных тестов нужно изолировать функционал, который нельзя разделить на более мелкие составляющие, и протестировать его.

Модульные тесты не должны проверять внешние зависимости или взаимодействия. Вам определенно нужно сымитировать (mock out) api-вызовы. Борцы за чистоту модульных тестов будут также настаивать на имитации вызовов базы данных, чтобы убедиться, что ваш код, получая корректный input из внешних источников, ведет себя правильно. Модульные тесты должны быть быстрыми, иначе они значительно замедляют разработку.

Когда их запускать? Вы должны писать и запускать модульные тесты параллельно со своим кодом.

Интеграционные тесты (Integration tests)

Что проверяется? Интеграционные тесты проверяют взаимодействие между двумя (или больше, чем двумя) отдельными юнитами вашего кода.

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

Интеграционные тесты также проверяют интеграцию вашего кода с внешними зависимостями, вроде соединений с базой данных или сторонними API.

Когда их запускать? Интеграционные тесты это следующий шаг после модульных тестов.

Что, если тесты провалены? Провал интеграционных тестов означает, что две (или больше) функции вашего приложения не работают вместе. Это могут быть два написанных вами модуля, которые приходят в противоречие из-за какой-то сложной бизнес-логики. Также провал может случиться из-за того, что изменилась структура ответа стороннего API. Провал тестов может быть предупреждением о плохой обработке ошибок в случае сбоя подключения к базе данных.

Функциональное тестирование

  • Функциональное тестирование может быть определено как тестирование отдельных функций модулей.
  • Это относится к тестированию программного продукта на индивидуальном уровне, чтобы проверить его функциональность.
  • Оно сильно отличается от модульного или интеграционного тестирования; вы не можете написать бесчисленное множество тест-кейсов для функционального тестирования, поскольку оно является более сложным, чем модульное.
  • Инструменты функционального тестирования стремятся проверить функциональные возможности (работоспособность) программного обеспечения. Тестовые примеры используются для проверки ожидаемых и неожиданных результатов тестирования программного обеспечения.
  • Этот тип тестирования проводится больше с точки зрения пользователя. То есть, он рассматривает ожидание пользователя в выбранном типе ввода данных.
  • Selenium является одним из наиболее распространенных инструментов, используемых для функционального тестирования.

Регрессионное тестирование (Regression testing)

Это может быть любой вид теста из описанных выше, который пишется после того, как была обнаружена проблема. Тест должен эмулировать в точности шаги для воспроизведения проблемы. Наличие такого теста после исправления проблемы дает гарантию, что точно такой же баг, больше не появится в системе.

Что проверяется? Регрессионные тесты проверяют набор сценариев, которые раньше работали и должны быть относительно стабильными.

Интеграционное и функциональное разница

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

Python testing

Есть unittest, все в виде классов, not friendly to pep8. Pytest в виде декораторов, pep8 friendly

Что такое mock?

Mock — это просто объект (заглушка), который создает пустой тест для определенной части программы. Вместо вызова обычной проверки, вы вызываете mock и смотрите, как проходит тест какая-то часть программы.

Mock vs Fixtures

Fixtures — это функции, выполняемые pytest до (а иногда и после) фактических тестовых функций.

Что делать, если тестируемая функция использует удалённое подключение к внешним сервисам, которое иногда видает ошибку таймаута, 404 и им подобные

Если мы говорим про юнит тесты, то они не должны вызывать внешние ресурсы, то есть делать http запросы и тд. Следовательно нужно либо замокать http-клиент, который использует функция для вызова сервиса, либо, что обычно является лучшим решением, передавать то что вызывает этот сервис в функцию зависимостью (если конечно мы не тестируем сам клиент для вызова сервиса).