Что такое атомарные тесты и как их правильно писать

Ответ

Атомарный (или изолированный) тест проверяет одну, и только одну, единицу функциональности и не зависит от состояния, созданного другими тестами. Его результат не должен меняться от порядка запуска.

Ключевые принципы:

  1. Изоляция (Isolation): Каждый тест должен работать в собственном, предсказуемом окружении. Данные, созданные в одном тесте, не должны быть доступны в другом. Для этого используются фикстуры (pytest) или методы setUp/tearDown (unittest).
  2. Независимость (Independence): Тест не должен полагаться на успешное выполнение другого теста. Его можно запустить отдельно, и он должен работать.
  3. Одна проверка (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+ 🔞

А, ну вот, опять про эти атомарные тесты, блядь! Слушай, это ж как в армии: каждый солдат должен сам по себе уметь отжиматься, а не ждать, пока сосед ему жопу подопрёт, понимаешь?

Суть-то, ёпта, простая:

  1. Изоляция, блядь (Isolation): Каждый тест — это как отдельная камера в тюрьме. Один сидит, хуйню творит, другому по барабану. Никаких общих тапочек в сортире! Для этого и придумали фикстуры (pytest) или эти setUp/tearDown (unittest).
  2. Независимость (Independence): Тест должен быть как тот самый мудак-одиночка. Запусти его хоть первым, хоть последним — он должен отработать и не охуеть от того, что до него что-то там накодили.
  3. Одна проверка (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  # И опять один вопрос.

Когда так пишешь, тесты становятся надёжными, как швейцарские часы, отлаживать их — одно удовольствие, и быстрыми, как удар током, потому что их можно гонять пачкой, параллельно. В общем, красота, а не жизнь!