Отчет об объеме 4.1.6 и Selenium не показывают последний результат теста

Я работаю над проектом на основе Selenium / testng / java / gradle с подходом ThreadLocal для объектов webdriver и extensiontest. Всякий раз, когда мой тестовый набор терпит неудачу, я использую RetryListener для повторного запуска неудачного тестового случая еще один раз. Если он проходит второй раз, мои результаты по-прежнему отображаются как «Сбой в отчете об экстенте» (примечание: все итерации регистрируются в одном тестовом узле в html-отчете). В stackoverflow есть много дискуссий по этому поводу (все они немного старые). Хотя оттуда я попробовал кое-что из логики. Но это не помогло.

Я создал слушателя, который расширяет TestListenerAdapter, и написал логику в методе onFinish для удаления повторяющихся сбоев.

Мой класс слушателя:

import java.util.Iterator;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;


public class TestListener  extends TestListenerAdapter {
    private static ExtentReports extent;
    public ExtentTest test;
    public TestListener() {
        
        this.test = CustomExtentTest.getInstance().getExtentTest();
        
    }
    
    @Override
    public void onFinish(ITestContext context) {
        Iterator<ITestResult> skippedTestCases = context.getSkippedTests().getAllResults().iterator();
        while (skippedTestCases.hasNext()) {
            ITestResult skippedTestCase = skippedTestCases.next();
            ITestNGMethod method = skippedTestCase.getMethod();
            if (context.getSkippedTests().getResults(method).size() > 0) {
                System.out.println("Removing:" + skippedTestCase.getTestClass().toString());
                skippedTestCases.remove();
                extent.removeTest(test);
            }
        }
    }

    public void onTestStart(ITestResult result) { 
        
        
    }

    public void onTestSuccess(ITestResult result) { 
        
        
    }

    public void onTestFailure(ITestResult result) {  
        

        
    }

    public void onTestSkipped(ITestResult result) {
        
    }

    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {   }

    public void onStart(ITestContext context) {
        
    }

}

Мой курс репортера:

public abstract class Reporter{

        public RemoteWebDriver driver;
        public static ExtentReports extent;
        public  ExtentTest test;
        public String testcaseName, testcaseDec, author ; 
        public String category;
        private Logger log=Logger.getLogger(Reporter.class);
        
        @BeforeSuite (alwaysRun = true)
        public void startReport(ITestContext c) throws IOException 
        {
            String timeStamp = new SimpleDateFormat("MM.dd.yyyy.HH.mm.ss").format(new Date());
            System.setProperty("org.freemarker.loggerLibrary", "none");
            try {
                Properties prop=new Properties();
                prop.load(new FileInputStream("./Resources/log4j.properties"));
                PropertyConfigurator.configure(prop);
                } catch (Exception e) {
                log.error(e);
            }
            log.debug("Configuring Extent Report...");
            ExtentSparkReporter reporter;
            String extentreportpath;
            String reportName=this.getClass().getName().substring(29, 33).toUpperCase() +" - Test Report";
            String suiteName = c.getCurrentXmlTest().getSuite().getName()+"-Test Report";
            if (suiteName.contains("Default suite")||suiteName.contains("Failed suite"))
            {
                suiteName =reportName;
            }
            extentreportpath="./reports/"+suiteName+"_"+timeStamp+".html";
            reporter = new ExtentSparkReporter(extentreportpath);
            extent   = new ExtentReports(); 
            extent.attachReporter(reporter);
            extent.setSystemInfo("URL", ReadPropertyFile.getInstance().getPropertyValue("URL"));
            reporter.loadXMLConfig("./Resources/extent-config.xml");
            reporter.config().setTheme(Theme.DARK);
            reporter.config().setReportName(suiteName);
            log.info("Extent Report Configured Successfully");
        }

        @Parameters({"browser"})
        @BeforeClass(alwaysRun = true)
        public ExtentTest report(@Optional("browser") String browser)  
        {
            if(ReadPropertyFile.getInstance().getPropertyValue("RunMode").equalsIgnoreCase("STANDALONE"))
            {
                if(browser.equals("browser")) {
                    browser = ReadPropertyFile.getInstance().getPropertyValue("Browser");
                }
            }
            test = extent.createTest(testcaseName, testcaseDec +" <br /><br />Browser Name: "+browser+" <br /><br />Category: "+category);
            test.assignAuthor(author);
            CustomExtentTest extenttst = CustomExtentTest.getInstance();
            extenttst.setExtentTest(test);
            return test;  
        }



        public abstract long takeSnap();
        
        public void reportStep(String desc,String status,boolean bSnap)
        {
            MediaEntityModelProvider img=null;
            if(bSnap && !status.equalsIgnoreCase("INFO"))
            {
                long snapNumber=100000L;
                snapNumber=takeSnap();
                try
                {
                    img=MediaEntityBuilder.createScreenCaptureFromPath("images/"+snapNumber+".jpg").build();
                }
                catch(IOException e)
                {
                    log.error(e);
                }
            }
            if(status.equalsIgnoreCase("pass"))
            {
                test.log(Status.PASS, desc, img);
            }
            else if(status.equalsIgnoreCase("fail"))
            {
                test.log(Status.FAIL, desc, img);
            }
            else if(status.equalsIgnoreCase("INFO"))
            {
                test.log(Status.INFO, desc,img);
            }
        }

        public void reportStep(String desc,String status)
        {

            reportStep(desc,status,true);
        }


        @AfterSuite (alwaysRun=true )
        public void stopReport() 
        {
            log.debug("Stopping and preparing the report...");
            extent.flush();
            log.info("Report prepared successfully");
        }
    }

Класс ThreadLocal для теста экстента:

public class CustomExtentTest {
    
    private CustomExtentTest() {        
    }
    
    private static final ThreadLocal<CustomExtentTest> _localStorage = new ThreadLocal<CustomExtentTest>(){
        protected CustomExtentTest initialValue() {
          return new CustomExtentTest();
       }
      };
    
    public static CustomExtentTest getInstance() {
        
        return _localStorage.get();
    }
    
    ExtentTest testextent;

    public ExtentTest getExtentTest() {
        return this.testextent;
    }

    public void setExtentTest(ExtentTest testextent) {
        this.testextent = testextent;
    }

}

Я только что обнаружил, что всегда получаю размер неудавшегося теста как 1 от тестового слушателя. Итак, невозможно продолжить удаление повторяющихся тестов.

  • Отчет об объеме - 4.1.6
  • Селен - 3,141,59
  • Testng - 7.1.0

Пожалуйста, поделитесь своим мнением о вышеизложенном.


person Sangeetha    schedule 10.06.2020    source источник


Ответы (1)


При повторном запуске скрипта селена для получения отчетов необходимо удалить предыдущие отчеты.

person Justin Lambert    schedule 15.06.2020
comment
также обновляйте обновления google guava через файл pom (добавить зависимость) - person Justin Lambert; 15.06.2020
comment
Подскажите пожалуйста, как удалить предыдущие отчеты только при повторном запуске? - person Sangeetha; 22.06.2020
comment
Перейдите в местоположение своего отчета и удалите вручную перед повторным запуском, это единственный способ - person Justin Lambert; 22.06.2020
comment
Повторы объединяются в один тестовый прогон. Мы не можем удалить вручную, как вы сказали, во время выполнения теста. Более того, удаление вручную - неправильный подход. - person Sangeetha; 22.06.2020
comment
Решение здесь: github.com/extent-framework / extensionreports-testng-adapter / tree /. Примечание: это возможно только в том случае, если вы используете ExtentReports v5.0 в качестве зависимости, которая находится в фазе SNAPSHOT на момент этого комментария. - person foursyth; 07.07.2020