суббота, 10 августа 2013 г.

TestNG Custom Listener

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()));
        }
    }

Думаю это поможет,всем спасибо.