Получить сообщение журнала из утверждений - PullRequest
0 голосов
/ 11 января 2019

Я интегрирую html-отчеты в нашу тестовую среду, используя библиотеку Extent Report (версия 4).

Для этого я написал оболочку, которая инкапсулирует наш регистратор TestNG по умолчанию (для вывода на консоль) и регистратор ExtentReport (ExtentTest.log, для сбора данных для html-отчета). Мы используем TestNg в качестве основы тестирования.

Имея проблему с захватом сообщений журнала из ошибочных утверждений (как мягких, так и жестких), чтобы отобразить их в html-отчете, они идут только в журнал консоли. Каково было бы возможное решение для захвата тех сообщений журнала Assert, чтобы показать их в html-отчете?

Я не могу расширять классы Assert (или SoftAssert) и добавлять свою собственную реализацию (добавляя туда экземпляр ExtentTest.log), потому что мне придется заменить все утверждения в десятках тестов.

public class Loggers {
  private static final Loggers instance = new Loggers();
  private static ExtentTest test;
  private static ExtentReports extent;
  private static Logger LOG;
  private static final String REPORT_LOCATION = "test-output/reports.extent.html";

  /**
   * Returns an instance of {@link ExtentReports} object. If it doesn't exist creates a new instance and returns it
   */
  public static ExtentReports getLogger() {
    if ( extent == null ) {
      createInstance();
    }
    return extent;
  }

  /**
   * Create ExtentReport and attaches htmlReporter to it
   */
  public static void createInstance() {
    ExtentHtmlReporter htmlReporter = getHTMLReporter();
    extent = new ExtentReports();
    extent.attachReporter( htmlReporter );
  }

  /**
   * This method creates, configures and returns an instance of ExtentHtmlReporter
   *
   */
  public static ExtentHtmlReporter getHTMLReporter() {
    ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter( REPORT_LOCATION );
     return htmlReporter;
  }

  /**
   * This method logs a message with the INFO level for both instances of TestNG Logger and ExtentTest
   */
  public void info( String message ) {
    LOG.info( message );
    test.log( Status.INFO, message );
  }

Ответы [ 2 ]

0 голосов
/ 12 января 2019

У меня работает нижеприведенный код для отчета об объеме. Попробуйте!

1) Инициализировать отчет об объеме и Logger

public static Logger log = Logger.getLogger("devpinoyLogger");
public ExtentReports rep = ExtentManager.getInstance();
public static ExtentTest test;

2) Используйте файл конфигурации ReportsConfig.xml для отчета по экстентам, который вы можете получить на официальном сайте.

3) Создайте класс ExtentManager, который загружает файл конфигурации и настраивает вывод файла отчета Extent.

   public class ExtentManager {

        private static ExtentReports extent;
        public static ExtentReports getInstance(){

            if(extent==null){
                System.out.println("Path of user DIR"+System.getProperty("user.dir"));
                extent = new ExtentReports(System.getProperty("user.dir")+"\\target\\surefire-reports\\ExecutionReport.html",true,DisplayOrder.OLDEST_FIRST);
                extent.loadConfig(new File(System.getProperty("user.dir")+"\\src\\main\\java\\extentconfig\\ReportsConfig.xml"));       
            }
            return extent;
        }
    }

4) Используйте метод регистрации INFO и ERROR в создаваемом вами методе для отображения журналов в отчете Extent.

public void click(String xpath) {

    try {
        driver.findElement(By.xpath(Variables.OR.getProperty(xpath))).click();
        System.out.println(xpath + "Button clicked");
        test.log(LogStatus.INFO, xpath + " Button clicked");
        Thread.sleep(1000);
    } catch (Exception e) {
        System.err.println("Cannot Click " + e.getMessage());
        test.log(LogStatus.ERROR,"Unable to click on :: " + xpath + " Button");
        throw new AssertionError("Unable to click on ::  " + xpath + " Button", e);
    }
}

5) Использовать пользовательский класс прослушивателя CustomListeners

public class CustomListeners extends TestBase implements ITestListener, ISuiteListener {

public boolean flag;

..implement all methods of CustomListeners class and use logs in onTestSuccess and onTestFailure Methods.

public void onTestSuccess(ITestResult arg0) {

    test.log(LogStatus.PASS, arg0.getName().toUpperCase() + " PASS");
    rep.endTest(test);
    rep.flush();

}


public void onTestFailure(ITestResult arg0) {
    System.out.println(arg0 + " =================Test Case Failed===========================");
    flag = true;
    System.out.println("Flag is inside onTestFailure " + flag);
    System.setProperty("org.uncommons.reportng.escape-output", "false");

    try {
        test.log(LogStatus.FAIL, arg0.getName().toUpperCase() + " Failed with exception : " + arg0.getThrowable());
        rep.endTest(test);
        rep.flush();
    } catch (IOException e) {
        System.err.println("IOException occurs " + e.getMessage());
        e.printStackTrace();
    }

}

}

  • Представление ExtentReport для теста PASS

enter image description here

  • Представление ExtentReport для теста FAIL

enter image description here

0 голосов
/ 11 января 2019

Нашел решение. Опубликуйте здесь, если у кого-то возникнет аналогичная проблема.

Если вы разместите свои регистраторы в классе слушателя, вы можете поместить туда свой регистратор и использовать ITestResult в качестве аргумента, в частности его метод getThrowable (он возвращает метод throwable, который был брошен во время выполнения метода)

 /**
   * Triggered upon the failure of a test
   */
  public void onTestFailure( ITestResult testResult ) {
      LOG.fail( testResult.getThrowable() );
 }

В отчете будет напечатано ошибочное утверждение или сгенерированное исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...