Экстренный отчет Выпуск Параллельное тестирование

У меня есть следующий код сообщения:

public class Reporting {
    private ExtentHtmlReporter extentHtmlReporter;

    private static ThreadLocal<ExtentReports> extentReports = new ThreadLocal<>();
    private static ThreadLocal<ExtentTest> extentTest = new ThreadLocal<>();

    public synchronized ExtentTest createInstanceReport(String testCaseName) {
        System.out.println(extentReports.get());

        new File(Constants.userDir + "/Reports/").mkdirs();

        // To generate report with name
        extentHtmlReporter = new ExtentHtmlReporter(
                Constants.userDir + "/Reports/" +
                        "ExecutionReport_" + new SimpleDateFormat(
                        Constants.date).format(new Date()) + ".html");

        // Setting Document Title
        extentHtmlReporter.config().setDocumentTitle("Demo");
        // Setting Report Name
        extentHtmlReporter.config().setReportName("Demo Automation");
        // Setting Theme
        extentHtmlReporter.config().setTheme(Theme.STANDARD);
        // Setting Chart location
        extentHtmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
        // Setting Chart visibility
        extentHtmlReporter.config().setChartVisibilityOnOpen(false);
        // Setting Time stamp
        extentHtmlReporter.config().setTimeStampFormat("yyyy-MM-dd HH:mm:ss");
        // Setting append exist as true
        extentHtmlReporter.setAppendExisting(true);
        ExtentReports extentReports = new ExtentReports();
        extentReports.attachReporter(extentHtmlReporter);

        // Setting system info
        extentReports.setSystemInfo("Name",
                BaseTest.prop.getProperty(Constants.testerName));
        extentReports.setSystemInfo("Environment",
                BaseTest.prop.getProperty(Constants.environment));
        extentReports.setSystemInfo("Browser",
                BaseTest.prop.getProperty(Constants.browser));
        Reporting.extentReports.set(extentReports); // Instead of using here extentReport thread like this, Can anyone suggest to use it directly

        // Add test case name in report
        ExtentTest extentTest = Reporting.extentTest.get();
        extentTest = Reporting.extentReports.get().createTest(testCaseName);
        Reporting.extentTest.set(extentTest);

        // Assigning categories
        extentTest.assignCategory(MultiFunction.getProp()
                .getProperty(Constants.browser));

        System.out.println(Reporting.extentReports.get());
        System.out.println(Reporting.extentTest.get());

        return extentTest;
    }

    public synchronized ExtentTest getExtentTest() {
        return extentTest.get();
    }

    public synchronized ExtentReports getInstanceReport() {
        return extentReports.get();
    }

    public synchronized void remove() {
        extentReports.remove();
        extentTest.remove();
    }
}

Я пробовал параллельное тестирование с использованием TestNG (и в будущем мне придется использовать решетку и соус Selenium). Я выполняю 2 теста, после чего в отчет добавляется только один результат теста.

Я выделила extentTest, extentReporter и экземпляры WebDriver, использующие threadPool.

Пробовал ниже с extentHtmlReporter пример:

1) Tried to make it static(no luck)  
2) Tried to make it local (the same behaviour, getting only 1 test case result)
3) Tried as a non-static global variable ( no luck)

Не могли бы вы предложить, как решить вышеуказанную проблему?

Обратите внимание: генерируется только один отчет. Но когда я пытался запустить параллельные тестовые случаи в режиме отладки, отчеты генерировались для обоих тестовых случаев. Я думаю, потому что один тестовый пример преодолевает убийство некоторого экземпляра (при работе в режиме без отладки)

Кроме того, я хочу изменить следующее место в моем коде:

За extentRpeort, Я использую:

Reporting.extentReports.set (extentReports);

Добавить extentReport экземпляр моего extentReport Нить.
Вместо того, чтобы добавлять подобное, я хочу использовать его напрямую, чтобы уменьшить количество строк кода.

3 ответа

Решение

Проблема была связана со сбросом экземпляра отчета по экстентам. Я использовал ThreadLocal для хранения экземпляра отчета экстента и сбрасывал неправильный экземпляр.

Если я правильно понимаю, вы должны сгенерировать отчет по всем выполненным тестам TestNG.

Однако из кода, которым вы поделились, очень хорошо видно, что у вас будут некоторые проблемы с ним. Вы делаете несколько критических ошибок, и результат очевиден:

  • Для создания отчетов с помощью TestNG я предлагаю получить информацию о выполнении теста из прослушивателя TestNG. Что-то вроде:

    public final class TestNGListener extends TestListenerAdapter implements IInvokedMethodListener, ISuiteListener {
    
    @Override
    public void onStart(ITestContext context) {
        Logger.info(buildMessage(Logger.PREFIX_TEST_STARTED, context.getName()));
    }
    
    @Override
    public void onFinish(ITestContext context) {
        Logger.info(buildMessage(Logger.PREFIX_TEST_FINISHED, context.getName()));
    }
    
    @Override
    public void onTestStart(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_STARTED, getMethodName(result)));
    }
    
    @Override
    public void onTestSuccess(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_SUCCESS, getMethodName(result)));
        processTestResult(result);
    }
    
    @Override
    public void onTestFailure(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_FAILED, getMethodName(result)));
    }
    
  • Вы не можете сделать все одним способом! Вы нарушили принцип единой ответственности. Ваш createInstanceReport() выполняет все задания (устанавливает детали отчета, устанавливает системную информацию, прикрепляет выполненный тестовый пример к отчету) в одном месте. Вы должны перепроектировать эту логику для некоторых логических отдельных операций. После изменения вашей проблемы со следующей строкой:

Reporting.extentReports.set (extentReports)

Может успешно исчезнуть.

  • Вы должны рассмотреть случай, почему вы должны использовать именно Extent, Reports Version 3, TestNG имеет протоколы испытаний из коробки. Они бедны, но представлены из коробки. Если вы хотите просто немного его улучшить, вы можете использовать ReportNG вместо TestNG.

Это довольно легко настроить: Настройка ReportNG с TestNG для отчетов HTML.

Это не поддерживается, но делает отчеты TestNG действительно приятными и понятными.

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

Работа с прослушивателем TestNG/jUnit (или другой используемой средой выполнения), вот хороший пример, как это сделать. Не ставьте все в один класс.

https://www.swtestacademy.com/extent-reports-version-3-reporting-testng/

Я уже использую приведенный ниже код в моей среде. Вам нужно написать набор строк в прослушивателях TestNG в методе onTestStart(), часть кода вставлена ​​ниже.

public void onStart(ITestContext context) {
    System.out.println("*** Test Suite " + context.getName() + " started ***");
}

public void onFinish(ITestContext context) {
    System.out.println(("*** Test Suite " + context.getName() + " ending ***"));
    ExtentTestManager.endTest();
    ExtentManager.getInstance().flush();
}

public void onTestStart(ITestResult result) {
    System.out.println(("*** Running test method " + result.getMethod().getMethodName() + "..."));
    ExtentTestManager.startTest(result.getMethod().getMethodName());
}

public void onTestSuccess(ITestResult result) {
    System.out.println("*** Executed " + result.getMethod().getMethodName() + " test successfully...");
}

public void onTestFailure(ITestResult result) {
    System.out.println("*** Test execution " + result.getMethod().getMethodName() + " failed...");
    /*WebDriver driver = (WebDriver) result.getTestContext().getAttribute("driver"); // accessing driver here
    try {
        String screenShot = ExtentManager.captureScreenShot(driver);
        ExtentTestManager.getTest().addScreenCaptureFromPath(screenShot);
    } catch (IOException ex) {
    }
    ExtentTestManager.getTest().log(Status.FAIL, "Test Failed");
    ExtentTestManager.getTest().fail(result.getThrowable());
    driver.quit();*/
}

public void onTestSkipped(ITestResult result) {
    System.out.println("*** Test " + result.getMethod().getMethodName() + " skipped...");
    ExtentTestManager.getTest().log(Status.SKIP, "Test Skipped");
}

public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
    System.out.println("*** Test failed but within percentage % " + result.getMethod().getMethodName());
}

Также вы можете обратиться по ссылке ниже для получения дополнительной информации. https://www.youtube.com/watch?v=8Gi6smxpU8g&list=PLUeDIlio4THEKL1t1tLBsyB6nsWAJMXOp&index=42

Другие вопросы по тегам