TestNG: Писать в лог Exception не оборачивая тест в try-catch

Добрый вечер. Вопрос возник следующего характера.

Я использую lo4j2 для протоколирования тестов.
Заюзал листенеры - IInvokedMethodListener, ITestListener
Все вроде бы отлично, но как мне писать в лог Exception которые могут возникать, не оборачивая тестовый метод в try-catch ?

Не делая так

@Trest
public void testMethod() {
 try{ ...}
  catch(Exception e) {
  LOG.error(e);
  }
}

А что у вас try / catch в самом тесте делает? Почему не хэндлите exception на более низком уровне? Или вам вообще его хэндлить не надо?

Или вам нужен универсальный handler для всего, что вдруг не обработалось?

2 лайка

Присоединяюсь к @ArtOfLife. Достаточно странное желание. Exception - это исключительное поведение программы. Если вы его не обрабатываете - значит вы не до конца контролируете флоу ваших тестов, тем более если вы собираетесь catched exception обрабатывать.
Ну и catch(Exception e) - не есть хорошая практика.

2 лайка

сделал вот так в листенере, чтобы писать в лог все возможные исключения в тесте

@Override
public void onTestFailure(ITestResult iTestResult) {
LOG.error("<< тест-кейс FAIL " + "'" +   iTestResult.getMethod().getDescription() + "'");
StringWriter sw = new StringWriter();
iTestResult.getThrowable().printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
LOG.error(stacktrace);
}

Кажется, вы не до конца поняли идею…

Если вы дошли до того, чтобы помещать try / catch в тест, значит, как намекнул @sidelnikovmike, вы потеряли контроль над собственным фреймворком.

Все exceptions у webdirver'a достаточно предсказуемы, чтобы корректно хэндлить их на уровне какой-нибудь BasePage. Если нужно уронить тест, то именно вы сами целенаправленно и должны это делать, чтобы как минимум иметь возможность корректно завершить все остальные процессы.

В случае с SoftAsserts, необработанные эксепшены могут вообще привести к потере verification results.

Основной посыл в том, что чем ниже вы обработаете исключения, тем меньше дублирующих try / catch придется создавать в итоге на уровне пейджей и тестов. Ваши высокоуровневые тесты вообще не должны бросать ничего кроме AssertionError, либо кастомных Exception с целью принудительного завершения без последствий.

П.С. А если нужно заинжектить логгер в методы без глобального рефакторинга, посмотрите в сторону AspectJ. Пример можно найти даже в исходниках Allure - перехват вызовов методов с аннотацией Step.

1 лайк

спасибо большое