Ответ
Атомарный (или изолированный) тест проверяет одну, и только одну, единицу функциональности и не зависит от состояния, созданного другими тестами. Его результат не должен меняться от порядка запуска.
Ключевые принципы:
- Изоляция (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
Такой подход делает тесты надежными, легко отлаживаемыми и быстрыми, так как их можно запускать параллельно.
Ответ 18+ 🔞
А, ну вот, опять про эти атомарные тесты, блядь! Слушай, это ж как в армии: каждый солдат должен сам по себе уметь отжиматься, а не ждать, пока сосед ему жопу подопрёт, понимаешь?
Суть-то, ёпта, простая:
- Изоляция, блядь (Isolation): Каждый тест — это как отдельная камера в тюрьме. Один сидит, хуйню творит, другому по барабану. Никаких общих тапочек в сортире! Для этого и придумали фикстуры (
pytest) или этиsetUp/tearDown(unittest). - Независимость (Independence): Тест должен быть как тот самый мудак-одиночка. Запусти его хоть первым, хоть последним — он должен отработать и не охуеть от того, что до него что-то там накодили.
- Одна проверка (Single Assertion): Идеал, блядь! Один тест — один вопрос. Не надо спрашивать «как дела, что нового и почему ты такой мудак?». Только «ты пополнил счёт?». Упал — сразу ясно, где искать пиздец.
Смотри, как это выглядит на практике, с этими вашими фикстурами:
import pytest
# Вот эта штука — как новая чистая миска для каждой собаки.
# Перед каждым тестом — свежий счёт со стольником.
@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 # И опять один вопрос.
Когда так пишешь, тесты становятся надёжными, как швейцарские часы, отлаживать их — одно удовольствие, и быстрыми, как удар током, потому что их можно гонять пачкой, параллельно. В общем, красота, а не жизнь!