Обнаружение ошибки теста в testng @AfterMethod
Я хочу снять скриншот, если тест завершился неудачно. Вместо того, чтобы обертывать все методы тестирования с помощью блоков try/catch, я хотел бы добавить эту логику к @AfterMethod.
Как я могу обнаружить в @AfterMethod, если текущий тест не прошел?
Ответы
Ответ 1
Если ваш @AfterMethod принимает параметр ITestResult, тогда TestNG автоматически вводит результат теста. (источник: Документация TestNG, раздел 5.18.1)
Это должно выполнить задание:
@AfterMethod
public void tearDown(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
//your screenshooting code goes here
}
}
Ответ 2
Хорошим вариантом является использование ITestListener вместо обработки отчетов об ошибках в @AfterMethod. Функция тестового прослушивателя onTestFailed() будет вызвана после запуска вашего тестового метода, но до запуска метода @AfterMethod. (Обратите внимание, что в слушателе нет функции onTestFinished(), эта роль выполняется @AfterMethod.)
Чтобы облегчить вам задачу, вы можете использовать TestListenerAdapter, который будет реализовывать все другие функции, которые вы специально не используете @Override.
В итоге вы получите:
public class MyTestListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result){
yourTakeScreenShotFunctionHere();
}
}
Затем вы присоединяете слушателя к вашему тестовому классу с помощью
@Listeners({MyTestListener.class})
public class MyTestClass(){etc}
ITestResult является ссылкой на ваш объект тестового класса, поэтому вы можете использовать отражение для захвата данных из него, таких как экземпляр Selenium WebDriver и т.д.
У вас может быть так много разных слушателей, как вы хотите, чтобы делать такие вещи, как очистка или сохранение журналов ошибок, скриншоты, запуск других функций отчетности, отправка электронных писем или все, что вы хотите.
Ответ 3
Было бы хорошо, если бы вы могли реализовать слушатель IInvokedMethodListener и реализовать метод afterInvocation. Это дает вам доступ к объекту результата вашего метода. Вы можете поставить свой код на скриншот здесь.
Ответ 4
Вариант предыдущих ответов:
Поскольку вы уже знаете, что хотите сделать снимок экрана только в случае сбоя, вы можете использовать метод onTestFailure из TestListenerAdapter:
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class LFailure extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult tr) {
System.out.println("Failure");
// your screenshot code
}
}
PS: не забудьте добавить Listener в свой testng.xml или непосредственно в код:
@Listeners({ LFailure.class })
(желательно в базовом классе, из которого все ваши тесты наследуются)