Ответ
В Python есть несколько популярных библиотек для тестирования:
- unittest – встроенная библиотека, аналог JUnit. Подходит для модульного и интеграционного тестирования.
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 1, 2)
- pytest – более современная альтернатива с лаконичным синтаксисом и фикстурами.
def test_add():
assert 1 + 1 == 2
- doctest – тестирование через docstring.
def add(a, b):
"""
>>> add(1, 1)
2
"""
return a + b
-
mock (unittest.mock) – для создания mock-объектов.
-
hypothesis – property-based тестирование.
-
tox – тестирование в разных окружениях.
-
selenium – для UI-тестирования веба.
Pytest сейчас наиболее популярен благодаря простоте и расширяемости. Unittest часто используют в legacy-проектах. Doctest удобен для простых примеров в документации.
Ответ 18+ 🔞
Да ты посмотри, какие у нас инструменты для тестирования в Питоне развелись — целый зоопарк, блядь! Прямо как в том анекдоте про мартышлюшку и удава. Ну, давай разбираться, пока не накрылись все медным тазом.
Первое, что под руку всегда попадает — это unittest, встроенный, мать его, модуль. Типа наш родной, советский аналог этого вашего JUnit. Работает, как танк Т-34 — надёжно, но не без косяков. Для модульных и интеграционных проверок сойдёт, если не придираться.
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 1, 2)
Видишь этот овердохуища boilerplate код? Весь в классах да в методах. Но зато из коробки, ёпта, ничего ставить не надо.
А потом народ опомнился и сказал: «Да похуй на эти церемонии!» — и сделал pytest. Вот это, сука, действительно народный выбор. Синтаксис — чих-пых, и готово. Никаких этих наследований от ебучих TestCase. Фикстуры — вообще магия, блядь.
def test_add():
assert 1 + 1 == 2
Всё! Красота, да? Запустил — и сидишь, довольный как слон. Сейчас его все и используют, кто не совсем ещё консервативный пидарас шерстяной.
Дальше идёт doctest — этакая хитрая жопа. Тесты прямо в документации пишешь, в docstring. Выглядит как безобидный пример, а на самом деле это ловушка для будущих ебланов, которые твою функцию сломают.
def add(a, b):
"""
>>> add(1, 1)
2
"""
return a + b
Удобно для мелких примеров, но если начнёшь туда сложную логику пихать — сам потом охренеешь, когда оно падать начнёт из-за пробела лишнего.
А вот mock (он же unittest.mock) — это вообще отдельная песня. Когда нужно отгородиться от всего мира и протестировать кусочек кода в вакууме. Создаёшь муляжи, подсовываешь их вместо реальных объектов и наблюдаешь, как твоя функция не падает, хотя вокруг пиздец. Без него в современном мире — никуда, доверия ебать ноль ко всему внешнему.
Hypothesis — это уже для продвинутых шизофреников, property-based тестирование. Ты не примеры даёшь, а свойства описываешь: «Вот, функция должна вот это вот соблюдать всегда». А библиотека сама тебе овердохуища разных входных данных нагенерирует и проверит. Иногда такие краевые случаи вылавливает, что сам от себя охуеешь.
Tox — это когда тебе мало одного окружения и хочется проверить, как твой код поведёт себя на всех версиях Питона и со всеми зависимостями. Настраиваешь этот концерт — и он сам всё запускает в изолированных средах. Удобно, но иногда чувствуешь себя садомазохистом.
Ну и selenium — это уже тяжёлая артиллерия, когда надо веб-интерфейс потрогать. Автоматизированный браузер, который ты заставляешь кнопки жать и формы заполнять. Медленно, ненадёжно, но когда нужно — альтернатив просто нет, блядь.
Короче, если начинаешь с нуля — бери pytest и не мучайся. Unittest — для легаси, где уже всё на нём завязано. Остальное — по мере возникновения ебучих потребностей. Главное — тестируй, а то потом вылезет такой баг, что чих-пых тебя в сраку.