Ответ
TestNG Listeners — это механизм, основанный на интерфейсах, который позволяет перехватывать и обрабатывать различные события жизненного цикла выполнения тестов. С их помощью можно встраивать пользовательскую логику на ключевых этапах.
Основные встроенные интерфейсы-слушатели:
ITestListener— обрабатывает события на уровне тестовых методов (@Test).ISuiteListener— обрабатывает события на уровне сьютов (<suite>в XML).IReporter— позволяет генерировать кастомные отчёты на основе результатов прогона.IAnnotationTransformer— позволяет динамически изменять аннотации тестов.
Типичные сценарии использования Listeners:
- Логирование: Запись детальной информации о начале, завершении, успехе или падении каждого теста.
- Создание скриншотов: Автоматическое снятие скриншота при падении теста для упрощения отладки.
- Расширенная отчётность: Отправка результатов в внешние системы (Slack, email) или формирование HTML-отчёта особого формата.
- Управление состоянием: Инициализация и очистка ресурсов (БД, соединения) перед набором тестов или после.
Практический пример: ITestListener для логирования и скриншотов:
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import java.io.File;
public class CustomTestListener implements ITestListener {
@Override
public void onTestStart(ITestResult result) {
System.out.println("Запуск теста: " + result.getName());
}
@Override
public void onTestSuccess(ITestResult result) {
System.out.println("Тест УСПЕШЕН: " + result.getName());
}
@Override
public void onTestFailure(ITestResult result) {
System.out.println("Тест ПРОВАЛЕН: " + result.getName());
// Делаем скриншот, если тест использует WebDriver
Object webDriver = result.getTestContext().getAttribute("webDriver");
if (webDriver instanceof TakesScreenshot) {
File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenshot, new File("screenshots/" + result.getName() + ".png"));
} catch (Exception e) { /* обработка ошибки */ }
}
}
}
Подключение Listener-а:
// Способ 1: Аннотация в тестовом классе
@Listeners(CustomTestListener.class)
public class LoginTests { ... }
// Способ 2: Указание в файле testng.xml (глобально для всех тестов)
<suite>
<listeners>
<listener class-name="com.example.CustomTestListener" />
</listeners>
<test> ... </test>
</suite>
Listeners — мощный инструмент для расширения стандартных возможностей TestNG и интеграции фреймворка в процесс CI/CD.