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(); Listsuites = 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())); } }
Думаю это поможет,всем спасибо.