Ответ
Атомарный (или изолированный) тест проверяет одну, и только одну, единицу функциональности и не зависит от состояния, созданного другими тестами. Его результат не должен меняться от порядка запуска.
Ключевые принципы:
- Изоляция (Isolation): Каждый тест должен работать в собственном, предсказуемом окружении. Данные, созданные в одном тесте, не должны быть доступны в другом. Для этого используются фикстуры (
pytest) или методыsetUp/tearDown(unittest). - Независимость (Independence): Тест не должен полагаться на успешное выполнение другого теста. Его можно запустить отдельно, и он должен работать.
- Одна проверка (Single Assertion): В идеале, тест должен содержать одну логическую проверку (
assert), чтобы при падении было сразу понятно, что именно сломалось.
Пример с pytest и фикстурами для изоляции:
import pytest
# Фикстура создает изолированный объект для каждого теста, который ее использует.
# Перед каждым тестом будет новый счет с балансом 100.
@pytest.fixture
def user_account():
"""Создает новый банковский счет с балансом 100."""
return {"balance": 100}
def test_deposit(user_account):
"""Тест проверяет только операцию пополнения."""
user_account["balance"] += 50
assert user_account["balance"] == 150
def test_withdrawal(user_account):
"""Тест проверяет только операцию снятия."""
user_account["balance"] -= 30
assert user_account["balance"] == 70
Такой подход делает тесты надежными, легко отлаживаемыми и быстрыми, так как их можно запускать параллельно.