Custom TestNG Listener
Иногда стоит задача,формировать test suite, не в xml а programmatically, например это может быть нужно,когда мы хотим формировать тесты в зависимости от конфигов. Это сделает их гибче и проще настраиваемыми.
Чтобы просто создать и запустить testNG suite нам потребуется всего пара строчек(которые кстати хорошо описаны в документации testNG)
TestNG tng = new TestNG();
TestListenerAdapter tla = new TestListenerAdapter();
List suites = new ArrayList();
tng.addListener(tla);
XmlSuite suite = new XmlSuite();
XmlTest testXml = new XmlTest(suite);
List excludeGroup = new ArrayList ();
excludeGroup.add(test.getExcludedGroups());
testXml.setXmlClasses(test.getClassToRun());
testXml.setExcludedGroups(excludeGroup);
suites.add(suite);
tng.setXmlSuites(suites);
tng.run();
testsNg.run();
Проблема такого подхода,только в том,что сейчас ошибки которые могу быть в тестах совершенно не наглядны,и во время выполнения большого сьюта их никак не увидеть.Значит нужно добавить свои средства:
TestNG tng = new TestNG();
TestListenerAdapter tla = new TestListenerAdapter();
List suites = new ArrayList();
tng.addListener(tla);
XmlSuite suite = new XmlSuite();
XmlTest testXml = new XmlTest(suite);
List excludeGroup = new ArrayList ();
excludeGroup.add(test.getExcludedGroups());
testXml.setXmlClasses(test.getClassToRun());
testXml.setExcludedGroups(excludeGroup);
suites.add(suite);
tng.setXmlSuites(suites);
tng.run();
List failedTests = Lists.newArrayList();
failedTests.addAll(tla.getFailedTests());
failedTests.addAll(tla.getConfigurationFailures());
if (!failedTests.isEmpty()) {
String header = String.format("Combined Messages (Total:%d)", failedTests.size());
List errorMessages = Lists.newArrayList();
errorMessages.add(header);
errorMessages.addAll(Lists.transform(failedTests, new Function() {
int i = 1;
@Override
public String apply(ITestResult testResult) {
String stackTraceString = Throwables.getStackTraceAsString(testResult.getThrowable());
String template = "Message-%d: %n %s";
return String.format(template, i++, stackTraceString);
}
}));
String message = Joiner.on(LINE_SEPARATOR).join(errorMessages);
throw new AssertionError(message);
}
С добавлением такого кода,после сьюта выведется вся информация об ошибках со stacktraceом.
Если же нам нужна информация еще во время его прохождения,чтобы не тратить наше драгоценное время на ожидание,то нужно добавить
@AfterMethod
public void tearDown2(ITestResult result) {
if (!result.isSuccess()) {
makeScreenshot(result.getName());
log.error("Test FAILED! Method:" + result.getName() + ". StackTrace is "+ Throwables.getStackTraceAsString(result.getThrowable()));
}
}
Думаю это поможет,всем спасибо.
Очень помогло, большое спасибо!
ОтветитьУдалить