ExtentReports: метод detachReporter ()

Я использую файл набора с несколькими наборами внутри файла testng.xml следующим образом:

<suite-files>
        <suite-file path="suite1"></suite-file>
        <suite-file path="suite2"></suite-file>
</suite-files>

Я инициализирую ExtentReport в BeforeSuite.

private static void initializeExtentReport(Configuration config) {
        if (extent == null) {
            extent = new ExtentReports();
            htmlReporter = new ExtentHtmlReporter("reportLocation");
            ClassLoader classLoader = ExtentReportService.class.getClassLoader();
            File extentConfigFile = new File(classLoader.getResource("extent-config.xml").getFile());
            htmlReporter.loadXMLConfig(extentConfigFile);
            extent.attachReporter(htmlReporter);
            extent.setSystemInfo("Environment", config.getAutomationServer());
        }
    }

В AfterSuite я звоню flush().

Итак, в основном проблема в том, что когда предыдущий набор вызывается для второго набора, проверка (extent==null), становится ложной. Я также просмотрел JavaDocs для ExtentReports и нашел там метод detachReporter(). Но я не могу получить доступ через свою IDE. Пробовал много вариантов, но безуспешно.

РЕДАКТИРОВАТЬ:

На самом деле сейчас я использую собственные имена для отчетов, так что нет двух одинаковых имен отчетов. И, когда я использовал одно и то же имя, результаты были бы перезаписаны в том же файле для наборов.


person Sagar Jani    schedule 28.08.2018    source источник
comment
Зачем нужно проверять условие (степень == null)?   -  person Ishita Shah    schedule 28.08.2018
comment
Я использую это условие, чтобы каждый раз при запуске любого пакета создавался новый экземпляр.   -  person Sagar Jani    schedule 28.08.2018
comment
Нет необходимости проверять экземпляр для отчета по экстенту. Как только вы определите инициализацию для отчета экстента, он может создать два отчета одним методом. Значит, тебе это не нужно.   -  person Ishita Shah    schedule 28.08.2018
comment
Пробовал, но вызов flush () не выполняется, т.е. он не генерирует никаких исключений после выполнения.   -  person Sagar Jani    schedule 28.08.2018


Ответы (1)


Лучшим подходом здесь является использование синглтона следующим образом:

public class Extent 
    implements Serializable {

    private static final long serialVersionUID = 1L;

    private static class ExtentReportsLoader {

        private static final ExtentReports INSTANCE = new ExtentReports();

        static {
        }
    }

    public static synchronized ExtentReports getInstance() {
        return ExtentReportsLoader.INSTANCE;
    }

    @SuppressWarnings("unused")
    private ExtentReports readResolve() {
        return ExtentReportsLoader.INSTANCE;
    }

}

Использование:

ExtentReports extent = Extent.getInstance();

Итак, ваш код становится:

private static void initializeExtentReport(Configuration config) {
    extent = Extent.getInstance();
    if (extent.getStartedReporters().isEmpty()) {
        htmlReporter = new ExtentHtmlReporter("reportLocation");
        ClassLoader classLoader = ExtentReportService.class.getClassLoader();
        File extentConfigFile = new File(classLoader.getResource("extent-config.xml").getFile());
        htmlReporter.loadXMLConfig(extentConfigFile);
        extent.attachReporter(htmlReporter);
        extent.setSystemInfo("Environment", config.getAutomationServer());
    }
}

Я бы также рекомендовал избавиться от всех общих переменных для extension / htmlReporter и напрямую использовать Singleton

person foursyth    schedule 29.08.2018
comment
У меня есть другой вопрос, когда мы инициализируем значение экстента, которое является статическим, для первого набора, будет ли оно удалено после выполнения набора? Кроме того, новый отчет не создается при вызове экземпляра htmlReporter. - person Sagar Jani; 29.08.2018