Как вы думаете, что делает вот такая конструкция?
@pytest.mark.xfail(strict=True, reason = "будет исправлено в задаче TASK-100")
def test_function():
Она "фэйлит" прогон, если тест пройден)
Зачем это нужно - если из-за частичного рефакторинга некий код перестал работать. И нужно отследить момент починки в следующих релизах.
Т.е. как только чиним код - тест начинает падать, мы снимаем xfail.
Если тест просто "скипнуть" - это можно забыть сделать. Плюс если упала группа тестов - то ее можно пометить одинаковым описанием и убедится, что починились все. Стандартного функционала для этого нет, но можно поиском по проекту.
Видится, что полезно в плане контроля тестов.
Есть конечно радикальный вариант - вообще избегать отключения тестов, но жизнь - сложная штука).
Отдельно про параметр strict.
Если его поставить в false - получаем тест, который не ломает запуск ни при успешном прогоне, ни при падении.
Зачем это может быть нужно?
Для flaky тестов, которые невозможно починить здесь и сейчас.
Тут конечно у меня вопросики, т.к. такое действие - прямой путь к тому, что про flaky тест мы просто забудем.
А в итоге контроль над тестовым набором, наоборот, ухудшится.
Я сразу стал искать - есть ли аналог в Java?
В JUnit из коробки нет, иначе бы этого поста не было)
Но есть в JUnit Pioneer:
@Test
@ExpectedToFail("будет исправлено в задаче TASK-100")
void testFunction() {
Это аналог strict режима. Не strict режима нет, что IMHO к лучшему.
Обе аннотации позволяют задать исключения, с которыми тест должен упасть.
Python вариант также позволяет задать condition:
@pytest.mark.xfail(condition="not config.getvalue('db')")
def test_function(): ...В Python интерпретатор есть в runtime, в отличие от Java (там в runtime только компилятор из байт-кода в нативный), поэтому это проще сделать.
Мой вердикт - штука полезная.
#python #java #python_gems #unit_tests #junit
