Зачем тесту возвращать значение, если он должен только делать assert
Что проверяют
Вопрос с подвохом: правильный ответ в том, что тест значение возвращать не должен. Интервьюер смотрит, знаете ли вы, как с этим обходятся фреймворки, и понимаете ли изоляцию тестов. Следом спрашивают: а если результат одного теста нужен другому?
Как отвечать
Тест сообщает результат исходом, а не возвратом: прошёл, упал на assert, упал с исключением. Раннер возвращаемое значение не читает, а часто прямо запрещает:
- pytest: с версии 8.4 тест, вернувший не
None, падает, а с 7.2 до этого выдавалось предупреждениеPytestReturnNotNoneWarning; - unittest: с Python 3.11 возврат не
Noneиз тестового метода даётDeprecationWarning; - JUnit 5: метод
@Testобязан бытьvoid. Метод с возвращаемым значением не запускается, свежие версии хотя бы сообщают об этом как о проблеме обнаружения; - TestNG: такие методы по умолчанию игнорируются, пока в
testng.xmlне включёнallow-return-values.
Самое опасное здесь тихий пропуск: тест есть в коде, но не выполняется, и отчёт зелёный.
Если значение нужно переиспользовать, для этого есть свои места. Подготовку данных выносят в фикстуру pytest или в @BeforeEach, общие шаги в хелпер, который возвращает значение, а проверяет уже тест. Цепочка «тест A создал заказ, тест B его оплатил» ломает изоляцию: тесты зависят от порядка и падают при параллельном запуске через pytest-xdist.
Одно исключение стоит упомянуть: в Jest и Mocha тест может вернуть промис, и раннер его дождётся. Это не результат, а сигнал об асинхронности.
Где спотыкаются
Придумывают пользу возврата вроде «для отладки» или «чтобы вернуть статус». Для этого есть отчёт раннера, логи и вложения в Allure.
Не знают про тихий пропуск в JUnit и TestNG и не могут объяснить, почему тест пропал из отчёта.
В Jest забывают return или await перед промисом: тест завершается раньше проверки и проходит всегда, даже если expect должен был упасть.