← Назад к вопросам

В чём разница между 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 году. Большинство новых проектов используют его благодаря простоте и мощности.

В чём разница между pytest и unittest в Python? | PrepBro