Перейти к основному содержимому

Два способа упасть

Тест может сообщить о проблеме двумя способами, и разница в том, что происходит дальше:

Неудачный assert вызывает AssertionError, и это останавливает тест, в котором он находится — проверки, написанные после него, никогда не выполняются. Это поведение «быстрого падения» (fail-fast), и именно его вы получаете по умолчанию.

Чтобы сообщить о проблеме и продолжить проверку, поместите каждую проверку в отдельную функцию test_. Тесты независимы: один упавший тест не останавливает следующий, поэтому за один запуск можно увидеть сразу несколько проблем.

У assert также может быть сообщение: assert got == want, "explanation". Этот текст показывается над сравниваемыми значениями, когда проверка не проходит.


Отдельные тесты: сообщить и продолжить

Когда нужно проверить несколько случаев подряд, дайте каждому случаю собственную тестовую функцию. О сломанном случае будет сообщено, а случаи после него всё равно будут проверены.

Так один запуск pytest покажет вам весь ущерб — а не только первый сломанный случай.

Все сломанные случаи сразу

Эта функция add игнорирует b, поэтому все три проверки не проходят. Так как каждая проверка — это отдельный тест, все три блока с падениями появляются за один запуск, а итог говорит 3 failed. Если бы это были три assert внутри одного теста, было бы сообщено только о первом.

Prompt
Напиши тестовый файл на Python, в котором в функции add есть ошибка (она возвращает только a, игнорируя b), а три отдельные тестовые функции проверяют три разные суммы, так что сообщается о каждом сломанном случае. Покажи вывод pytest -v со всеми тремя падениями за один запуск.
Вывод: полная программа на Python

Неудачный assert останавливает тест

Иногда неудачная проверка означает, что остальная часть теста работать не сможет. Типичный случай: тест сначала подготавливает значение, а затем проверяет его. Если подготовка уже пошла не так, проверка была бы бесполезной или даже привела бы к сбою.

Здесь «быстро падающий» assert — именно то, что нужно. Он завершает тест прямо в этом месте, и проверки после него никогда не выполняются — в этом и смысл.

Остановиться до бесполезных проверок

В split_words есть ошибка (она разделяет строку по неправильному символу), поэтому возвращается 1 часть вместо 3. Первый assert падает с сообщением получено частей: 1, ожидалось 3 - проверить их нельзя и останавливает тест — до проверки первой части ниже выполнение так и не доходит.

Prompt
Напиши тестовый файл на Python, в котором функция split_words должна разделять строку, разделённую запятыми, но содержит ошибку (разделяет по неправильному символу). Тест сначала проверяет через assert количество частей с сообщением, а затем проверяет первую часть. Покажи вывод pytest -v, в котором упавший первый assert останавливает тест до второй проверки.
Вывод: полная программа на Python
Stop before the useless checks

Сообщения в логических проверках

Для простого ответа «да» или «нет» нет пары получено и ожидалось — вы проверяете через assert само значение: assert is_even(4) падает, когда вызов возвращает False.

Сообщение после запятой необязательно, но в голой логической проверке его стоит написать: без него при падении видно только вызов, который вернул False, а с ним при падении также сказано, что это значит.

Простые сообщения

Две простые логические проверки с простыми сообщениями, обе в одном тесте. Здесь обе проходят, поэтому сообщения не выводятся, а запуск печатает 1 passed.

Prompt
Напиши тестовый файл на Python с функцией is_even и одним тестом, который проверяет через assert, что is_even(4) истинно, а is_even(3) ложно, причём у каждого assert есть простое текстовое сообщение. Покажи вывод pytest -v с пройденным тестом.
Вывод: полная программа на Python
Plain messages