Ответ
В Python для написания тестов в основном используются два фреймворка: встроенный модуль unittest и более современная и популярная сторонняя библиотека pytest.
1. unittest
Стандартный, встроенный в Python фреймворк, основанный на концепции xUnit. Требует более явного, объектно-ориентированного синтаксиса.
Ключевые особенности:
- Тесты организуются в классы, наследуемые от
unittest.TestCase. - Тестовые методы должны начинаться с префикса
test_. - Используются специальные
assertметоды:self.assertEqual(),self.assertTrue(),self.assertRaises().
Пример:
import unittest
def add(a, b):
return a + b
class TestMathFunctions(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertEqual(add(-1, 1), 0)
if __name__ == '__main__':
unittest.main()
2. pytest
Популярный фреймворк, известный своим лаконичным синтаксисом, мощной системой фикстур и большим количеством плагинов.
Ключевые особенности:
- Тесты — это обычные функции с префиксом
test_. - Использует стандартный оператор
assert, что делает код более читаемым и коротким. - Мощная система фикстур для подготовки и очистки тестового окружения (например, подключение к БД).
- Автоматическое обнаружение тестов.
Пример:
# test_math.py
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
# Запуск из командной строки: pytest
Основные принципы тестирования:
- Изоляция: Тесты не должны зависеть друг от друга.
- Воспроизводимость: Тест должен давать одинаковый результат при каждом запуске.
- Использование моков (mocks): Для изоляции от внешних систем (БД, API) используются мок-объекты (например, с помощью
unittest.mock).
Ответ 18+ 🔞
А, ну вот, опять про эти ваши тесты, блядь. Сидят, как мартышлюшки, пишут код, а потом орут: "А чё не работает-то, ёпта?". Так, слушай сюда, я тебе сейчас на пальцах объясню, как не облажаться.
В Питоне, если ты не совсем пидарас шерстяной, есть два основных способа себя проверить. Первый — это встроенный unittest, старый, как говно мамонта. Второй — pytest, который все сейчас любят, потому что он как хитрая жопа — всё делает красиво и с минимальными усилиями.
1. unittest — классика жанра, или "О, блядь, опять эти классы"
Этот фреймворк, сука, любит всё по полочкам разложить. Надо создавать классы, наследоваться от какого-то TestCase и методы называть с test_. А ещё там свои особые команды для проверки, типа self.assertEqual(). Не assert, как нормальные люди, а вот эта хуйня.
import unittest
def сложить(a, b):
return a + b
class ТестМатематики(unittest.TestCase):
def test_сложение(self):
self.assertEqual(сложить(2, 3), 5) # Должно сработать
self.assertEqual(сложить(-1, 1), 0) # И это тоже
if __name__ == '__main__':
unittest.main()
Видишь? Объектно-ориентированно, блядь. Как будто на собеседовании. Но работает, чёрт возьми.
2. pytest — "Да похуй, главное, чтобы работало"
А вот это, дружок, уже ближе к народу. Тут тесты — это просто функции, которые начинаются на test_. И проверяешь ты обычным assert, как в жизни. Запустил pytest в консоли — и он сам всё найдёт, как собака сука. Ещё у него есть фикстуры — это такая магия, чтобы перед тестом что-то подготовить (базу данных там, или ещё какую хуйню), а потом убрать. Овердохуища удобно.
# test_математика.py
def сложить(a, b):
return a + b
def test_сложение():
assert сложить(2, 3) == 5 # Всё, проверка готова
assert сложить(-1, 1) == 0 # Никаких self.бла-бла-бла
# Запускаешь в терминале: pytest test_математика.py
Чувствуешь разницу? Второй вариант — это как надеть тапки вместо лабутенов. И там, и там дойдёшь, но в тапках комфортнее, ёпта.
А теперь, блядь, главные правила, чтобы не быть мудаком:
- Изоляция: Каждый тест должен жить своей жизнью, как кот сука собака. Один не должен влиять на другого, иначе потом пиздец, и не поймёшь, где ошибка.
- Воспроизводимость: Запустил раз, запустил сто — результат должен быть один и тот же. Если сегодня работает, а завтра нет — это не тест, а лотерея, нахуй.
- Моки (или "Да отъебись от базы, я тестирую логику!"): Используй
unittest.mockили аналоги. Твоя функция не должна реально лезть в интернет или в базу данных во время теста. Подсунул ей фейковый объект, который делает вид, что он база, — и всё, ты молодец. Иначе один сбой на сервере — и все твои тесты накрылись медным тазом.
Вот и вся наука. Выбирай, что тебе ближе: строгий unittest или вольный pytest. Главное — пиши их, эти тесты, а то потом будешь как Герасим, который немой, и объяснить не может, что сломалось. Только у тебя не Муму утонет, а твой продакшн, на котором клиенты орут.