Два способа упасть
Тест может сообщить о проблеме двумя способами, и разница в том, что происходит дальше:
Неудачный assert вызывает AssertionError, и это останавливает тест, в котором он находится — проверки, написанные после него, никогда не выполняются. Это поведение «быстрого падения» (fail-fast), и именно его вы получаете по умолчанию.
Чтобы сообщить о проблеме и продолжить проверку, поместите каждую проверку в отдельную функцию test_. Тесты независимы: один упавший тест не останавливает следующий, поэтому за один запуск можно увидеть сразу несколько проблем.
У assert также может быть сообщение: assert got == want, "explanation". Этот текст показывается над сравниваемыми значениями, когда проверка не проходит.
Отдельные тесты: сообщить и продолжить
Когда нужно проверить несколько случаев подряд, дайте каждому случаю собственную тестовую функцию. О сломанном случае будет сообщено, а случаи после него всё равно будут проверены.
Так один запуск pytest покажет вам весь ущерб — а не только первый сломанный случай.
Все сломанные случаи сразу
Эта функция add игнорирует b, поэтому все три проверки не проходят. Так как каждая проверка — это отдельный тест, все три блока с падениями появляются за один запуск, а итог говорит 3 failed. Если бы это были три assert внутри одного теста, было бы сообщено только о первом.
Вывод: полная программа на Python
# В add есть ошибка: она игнорирует b.
def add(a, b):
return a
def test_add_two_and_two():
assert add(2, 2) == 4
def test_add_two_and_three():
assert add(2, 3) == 5
def test_add_ten_and_one():
assert add(10, 1) == 11
Неудачный assert останавливает тест
Иногда неудачная проверка означает, что остальная часть теста работать не сможет. Типичный случай: тест сначала подготавливает значение, а затем проверяет его. Если подготовка уже пошла не так, проверка была бы бесполезной или даже привела бы к сбою.
Здесь «быстро падающий» assert — именно то, что нужно. Он завершает тест прямо в этом месте, и проверки после него никогда не выполняются — в этом и смысл.
Остановиться до бесполезных проверок
В split_words есть ошибка (она разделяет строку по неправильному символу), поэтому возвращается 1 часть вместо 3. Первый assert падает с сообщением получено частей: 1, ожидалось 3 - проверить их нельзя и останавливает тест — до проверки первой части ниже выполнение так и не доходит.
Вывод: полная программа на Python
# В split_words есть ошибка: она разделяет по ";" вместо ",".
def split_words(s):
return s.split(";")
def test_split():
parts = split_words("one,two,three")
assert len(parts) == 3, f"получено частей: {len(parts)}, ожидалось 3 - проверить их нельзя"
# Пока ошибка есть, сюда выполнение не доходит.
assert parts[0] == "one"
Сообщения в логических проверках
Для простого ответа «да» или «нет» нет пары получено и ожидалось — вы проверяете через assert само значение: assert is_even(4) падает, когда вызов возвращает False.
Сообщение после запятой необязательно, но в голой логической проверке его стоит написать: без него при падении видно только вызов, который вернул False, а с ним при падении также сказано, что это значит.
Простые сообщения
Две простые логические проверки с простыми сообщениями, обе в одном тесте. Здесь обе проходят, поэтому сообщения не выводятся, а запуск печатает 1 passed.
Вывод: полная программа на Python
def is_even(n):
return n % 2 == 0
def test_is_even():
assert is_even(4), "4 должно быть чётным"
assert not is_even(3), "3 не должно быть чётным"