Написание первых тестов pytest
Разберитесь в обнаружении тестов, операторах assert и структуре тестов.
«Написание первых тестов pytest» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Установка pytest
Установите pytest с помощью pip. Обязательная конфигурация не требуется — он автоматически обнаруживает тесты.
# pip install pytest
# Run all tests
# pytest
# Run a specific file
# pytest test_math.pyПростая функция тестирования
pytest собирает любую функцию, имя которой начинается с test_. Используйте обычные операторы assert — pytest преобразует их, чтобы выводить подробные сведения.
# test_math.py
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
def test_add_negative():
assert add(-1, 1) == 0Файлы тестов и обнаружение
pytest обнаруживает файлы тестов с именами test_*.py или *_test.py, а также собирает функции с именами test_* и классы с именами Test*.
tests/
test_utils.py
test_models.py
conftest.py # shared fixturesГруппировка тестов в классах
Группируйте связанные тесты в классе с префиксом Test. unittest.TestCase не требуется.
class TestCalculator:
def test_add(self):
assert 1 + 1 == 2
def test_multiply(self):
assert 3 * 4 == 12Тестирование исключений
Используйте pytest.raises как менеджер контекста, чтобы проверить вызов определённых исключений.
import pytest
def divide(a, b):
if b == 0:
raise ZeroDivisionError("cannot divide by zero")
return a / b
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError, match="cannot divide"):
divide(10, 0)Флаг -v
Запускайте pytest с -v (подробный режим), чтобы видеть имя каждого теста и его статус: пройден или не пройден.
# pytest -v
# test_math.py::test_add PASSED
# test_math.py::test_add_negative PASSED
# Show print output too:
# pytest -v -sПропуск тестов
Используйте @pytest.mark.skip или @pytest.mark.skipif, чтобы условно пропускать тесты.
import pytest, sys
@pytest.mark.skip(reason="not implemented yet")
def test_future_feature():
assert False
@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_only():
assert TrueПометка тестов как ожидаемо неуспешных
@pytest.mark.xfail отмечает тест, который, как ожидается, завершится неудачей. Если он завершается неудачей, тест считается пройденным; если неожиданно проходит, pytest выдаёт предупреждение.
import pytest
@pytest.mark.xfail(reason="known bug #42")
def test_buggy():
assert 1 == 2 # will fail, but that's expectedПреобразование assert
pytest преобразует операторы assert, чтобы показать значения, вызвавшие сбой, — это гораздо полезнее, чем обычный AssertionError.
def test_list_equal():
result = [1, 2, 4]
expected = [1, 2, 3]
assert result == expected
# AssertionError:
# assert [1, 2, 4] == [1, 2, 3]
# At index 2 diff: 4 != 3conftest.py
pytest автоматически загружает conftest.py. Помещайте сюда общие фикстуры и плагины, не импортируя их явно.
# conftest.py
import pytest
@pytest.fixture
def sample_data():
return {"key": "value"}
# Any test file in the same dir can use sample_data as a parameterЗапуск отдельных наборов тестов
Используйте -k, чтобы запускать тесты, соответствующие ключевому выражению.
# Run tests containing "add"
# pytest -k "add"
# Run tests NOT containing "slow"
# pytest -k "not slow"
# Run a specific test
# pytest test_math.py::test_addБыстрая проверка
С какого префикса должно начинаться имя функции теста pytest, чтобы она была обнаружена автоматически?
Повторение
pytest не требует шаблонного кода: называйте файлы test_*.py, функции — test_* и используйте обычный assert. Применяйте pytest.raises для исключений, -v для подробного вывода и conftest.py для общих фикстур.
Часто задаваемые вопросы
Урок «Написание первых тестов pytest» бесплатный?
Да — полный текст урока «Написание первых тестов pytest» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Написание первых тестов pytest»?
Разберитесь в обнаружении тестов, операторах assert и структуре тестов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Написание первых тестов pytest»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание первых тестов pytest
- Фикстуры и настройка/очистка
- Параметризация и покрытие тестами
- Имитация с помощью unittest.mock