Как использовать `assert` для проверки условий в тестах?

Используйте assert для проверки, что условие истинно. Если условие ложно, assert вызовет исключение AssertionError, что приведет к провалу теста. Например:
assert 2 + 2 == 4, "Сложение работает неправильно"
Сообщение после запятой ("Сложение работает неправильно") необязательно, но полезно для понимания, какое именно условие не выполнилось.

Использование assert в Python для проверки условий в тестах - это ключевая практика написания эффективных и надежных тестов. assert - это встроенная инструкция (statement), которая проверяет истинность некоторого условия. Если условие истинно, ничего не происходит, и выполнение программы продолжается. Если условие ложно, возникает исключение AssertionError, которое, как правило, останавливает выполнение теста и сообщает о неудаче.

Основные способы использования assert:

  • Проверка равенства: Самый распространенный случай. Проверяет, что значение равно ожидаемому.
    assert result == expected_value, "Сообщение об ошибке, если проверка не прошла"
    Если result не равно expected_value, будет выброшено AssertionError с указанным сообщением.
  • Проверка неравенства: Проверяет, что значение не равно ожидаемому.
    assert result != unexpected_value, "Сообщение об ошибке"
  • Проверка истинности/ложности: Проверяет, что значение является True или False.
    assert condition is True, "Сообщение об ошибке"
    assert condition is False, "Сообщение об ошибке"
  • Проверка принадлежности: Проверяет, что элемент присутствует в коллекции (список, множество, строка и т.д.).
    assert item in my_list, "Сообщение об ошибке"
    assert item not in my_list, "Сообщение об ошибке"
  • Проверка типа данных: Проверяет, что переменная имеет определенный тип.
    assert isinstance(my_variable, int), "Сообщение об ошибке"
  • Проверка наличия исключения: Используется с контекстным менеджером pytest.raises (или аналогичным в других фреймворках) для проверки, что определенная функция выбрасывает ожидаемое исключение. Пример (с использованием pytest, так как чистый `assert` сам по себе не может проверить возникновение исключения напрямую):
    import pytest
    
    def my_function(x):
        if x < 0:
            raise ValueError("x must be non-negative")
        return x
    
    def test_my_function_raises_value_error():
        with pytest.raises(ValueError) as excinfo:
            my_function(-1)
        assert "x must be non-negative" in str(excinfo.value)

Важные моменты:

  • Сообщение об ошибке: Всегда добавляйте сообщение об ошибке после условия assert. Это сообщение поможет понять, что именно пошло не так, когда тест провалится.
  • Отладка: Когда тест проваливается, интерпретатор выводит сообщение об ошибке, но не показывает значения переменных. Для более глубокой отладки используйте отладчик (например, pdb или встроенный отладчик IDE). Альтернативно, можно временно добавить print statements для вывода значений переменных.
  • Не для обработки ошибок в продакшене: assert не предназначены для обработки ошибок в production-коде. Их не следует использовать вместо try...except блоков. assert можно отключить глобально, передав флаг -O (оптимизация) интерпретатору Python, поэтому они не являются надежным способом предотвратить ошибки в production.
  • Использование с фреймворками для тестирования: assert прекрасно работает с фреймворками для тестирования, такими как pytest и unittest. Фреймворки предоставляют дополнительные возможности, такие как обнаружение тестов, запуск тестов, сбор статистики и генерация отчетов. Они также часто предоставляют альтернативные методы проверки, которые могут быть более выразительными или предоставлять более подробную информацию об ошибках.
  • Примеры в контексте pytest:
    # pytest example
    def test_addition():
      assert 2 + 2 == 4
      assert 2 + 2 != 5, "Addition is broken!"
    
    def test_string_contains():
        my_string = "hello world"
        assert "world" in my_string
    
    def test_list_length():
        my_list = [1, 2, 3]
        assert len(my_list) == 3
    
    def test_type():
        value = 10
        assert isinstance(value, int)
        assert not isinstance(value, str)
    

В заключение, assert - это простой, но мощный инструмент для проверки условий в тестах Python. Используйте их для обеспечения корректности вашего кода и для быстрого выявления ошибок.

0