← Назад к вопросам
В чём разница между pytest и unittest в Python?
1.3 Junior🔥 181 комментариев
#Python Core#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между pytest и unittest в Python
unittest — встроенный фреймворк из стандартной библиотеки Python, основанный на концепции xUnit. pytest — третий фреймворк, ставший де-факто стандартом в сообществе. Оба используются для написания и запуска тестов, но имеют существенные различия.
Синтаксис и структура
unittest требует классов:
import unittest
class TestCalculator(unittest.TestCase):
def test_addition(self):
self.assertEqual(2 + 2, 4)
def test_subtraction(self):
self.assertEqual(5 - 3, 2)
if __name__ == '__main__':
unittest.main()
pytest использует обычные функции:
def test_addition():
assert 2 + 2 == 4
def test_subtraction():
assert 5 - 3 == 2
Преимущества pytest
1. Меньше кода:
- Не нужны классы и наследование
- Простое имя test_ вместо self.assertEqual
2. Встроенные fixtures (зависимости):
import pytest
@pytest.fixture
def database():
db = create_db()
yield db
db.close()
def test_query(database):
result = database.query('SELECT * FROM users')
assert len(result) > 0
3. Параметризация тестов:
@pytest.mark.parametrize('input,expected', [
(2, 4),
(3, 9),
(4, 16),
])
def test_square(input, expected):
assert input ** 2 == expected
4. Мощные плагины:
- pytest-cov для покрытия
- pytest-mock для мокирования
- pytest-asyncio для async тестов
- pytest-django для Django
Преимущества unittest
1. Встроен в стандартную библиотеку:
- Не нужно устанавливать зависимости
- Всегда доступен
2. Привычен для Java программистов:
- Похож на JUnit
- Логика наследования и классов
3. Полностью поддержан IDE:
- PyCharm, VS Code
- Запуск и дебаг из UI
Сравнение ассертов
unittest:
self.assertEqual(a, b)
self.assertIn(a, b)
self.assertTrue(a)
self.assertRaises(Exception, func)
self.assertIsNone(a)
pytest:
assert a == b
assert a in b
assert a
with pytest.raises(Exception):
func()
assert a is None
Fixtures vs setUp/tearDown
unittest — жёсткая структура:
def setUp(self):
self.db = create_db()
def tearDown(self):
self.db.close()
pytest — гибкие fixtures:
@pytest.fixture(scope='module')
def db():
db = create_db()
yield db
db.close()
Мой выбор
pytest — это стандарт в 2025 году. Большинство новых проектов используют его благодаря простоте и мощности.