Как реализовать ExtentReports, поддерживающие параллельное выполнение TestSuite и генерирование отчетов с динамическим именем - PullRequest
0 голосов
/ 04 июня 2018

Я создал небольшую тестовую среду, в которой используются Selenium Grid и TestNG, и я хотел бы, чтобы она поддерживала отчеты о параллельном выполнении с помощью ExtentReports 3 и создавала локальный файл с динамическим именем на основе имени TestSuite, который будет запускаться.Последняя идея - запустить TestSuite, содержащий несколько классов, каждый из которых содержит только 1 тест, определенный аннотацией @Test.

<suite>
 <test name="environment1">
  <parameter name="X" value="Y"/>
 <classes>
  <class name="Class containing Test A"/>
  <class name="Class containing Test B"/>
  <class name="Class containing Test C"/>
 </classes>
 </test>
</suite>

Тесты являются тестами пользовательского интерфейса, и весь набор тестов может занять около 2 часов.Когда TestSuite будет завершен, будет создан HTML-отчет ExtentReport, содержащий результаты каждого теста.

Что я хочу сделать, это запустить запуск набора тестов, а затем начать параллельно запускать другой идентичный набор тестов.до первого выполнения, но в другой среде, и когда они закончатся, я хочу иметь 2 разных отчета.В настоящее время, если я попытаюсь сделать это просто, один отчет заменит другой.

Может, кто-нибудь подскажет, как мне достичь этой цели?

Я попытался реализовать примерпоказано здесь: http://extentreports.com/docs/versions/3/java/#extent-testng-report-builder однако Eclipse уведомляет меня, что The method createNode(String) is undefined for the type Object enter image description here

Ниже я предоставляю свой файл конфигурации базового теста:

import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.ITestResult;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;

public class TestSuiteBase {
    protected WebDriver driver;
    protected SearchPageFactory search;
    public static ExtentHtmlReporter htmlreporter;
    public static ExtentReports extent;
    public static ExtentTest test;

    @BeforeSuite
    public void SetUp() {
        htmlreporter = new ExtentHtmlReporter(System.getProperty("user.dir") + "/test-output/MyReport.html");
        System.out.println(System.getProperty("user.dir"));
        extent = new ExtentReports();
        extent.attachReporter(htmlreporter);
    }

    @Parameters({ "platform","browser", "url" })
    @BeforeClass(alwaysRun=true)
    public void setup(String platform, String browser, String url) throws MalformedURLException
    {       
        driver = getDriverInstance(platform, browser, url);
        search = PageFactory.initElements(driver, SearchPageFactory.class);
    }

    public static WebDriver getDriverInstance(String platform, String browser, String url)
            throws MalformedURLException {

        String nodeURL = "http://localhost:4444/wd/hub";
        WebDriver driver = null;
        DesiredCapabilities capabilities = new DesiredCapabilities();

        // Platforms
        if (platform.equalsIgnoreCase("Windows")) {
            capabilities.setPlatform(Platform.WINDOWS);
        }
        if (platform.equalsIgnoreCase("MAC")) {
            capabilities.setPlatform(Platform.MAC);
        }
        // Browsers
        if (browser.equalsIgnoreCase("chrome")) {
            capabilities = DesiredCapabilities.chrome();
        }
        if (browser.equalsIgnoreCase("firefox")) {
            capabilities = DesiredCapabilities.firefox();
        }
        if (browser.equalsIgnoreCase("ie")) {
            capabilities = DesiredCapabilities.internetExplorer();
        }

        driver = new RemoteWebDriver(new URL(nodeURL), capabilities);

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // Open the Application
        driver.get(url);
        return driver;
    }

    @AfterMethod
    public void getResult(ITestResult result) {
        if (result.getStatus()== ITestResult.FAILURE) {
            test.fail(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.RED));
            test.fail(result.getThrowable());
        } else if (result.getStatus()== ITestResult.SUCCESS){
            test.pass(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.GREEN));
        } else {
            test.skip(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.YELLOW));
            test.skip(result.getThrowable());
        }
    }

    @AfterSuite
    public void testDown() {
        extent.flush();
    }

    @AfterClass
    public void afterClass() {
        driver.quit();
    }
}

Я новичок в программировании и в области автоматизации, поэтому любая помощь или предложения по этому вопросу, в частности или в целом, будет принята с благодарностью.Заранее спасибо!

1 Ответ

0 голосов
/ 05 июня 2018

Это может произойти, если у вас есть одно и то же имя отчета для каждого класса, присвойте каждому отчету другое имя в соответствии с функциональностью класса.

Все эти три класса должны содержать уникальное имя отчета,

 <class name="Class containing Test A"/>
 <class name="Class containing Test B"/>
 <class name="Class containing Test C"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...