当前位置: 首页 > 知识库问答 >
问题:

范围报告4.1.6

邢凯歌
2023-03-14

我正在从事一个基于Selenium/testng/java/gradle的项目,该项目采用了针对webdriver和extenttest对象的ThreadLocal方法。每当我的测试用例失败时,我都会使用RetryListener再次运行失败的测试用例1次。若它是第二次通过,我的结果仍然在扩展报告中显示为“失败”(注意,所有迭代都记录在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

请提供上述想法。

共有1个答案

金理
2023-03-14

当您重新运行selenium脚本以获取报告时,您应该删除以前的报告

 类似资料:
  • 我们在我的项目中使用范围报告。我想访问运行时存储的值。例如,在测试用例的catch块中,我有一行。 在最后一个块中,我试图创建一个函数,如果测试用例失败,我将需要使用日志函数的值并将其存储用于某种目的。 有可能吗?我正在POM框架中使用java和selenium。

  • 当我尝试使用Cucumber最新版本4.7.1(即“io.cucumber”)时,使用范围报告3.0不会生成报告。我尝试了不同版本的范围报告,但仍然正确生成输出。 我尝试了Cucumber和Extent Report之间的不同组合版本,但仍然没有输出。有人可以在这里发光来提高输出。 代码: 慰问: oader.java:362NoClassDefFoundError: gherkin/format

  • 我的sonarqube服务器版本8.3.1启用了cobertura插件来显示cobertura覆盖报告。现在我想报告Jacoco XML覆盖数据(使用gradle Jacoco插件生成),但它不起作用。cobertura和Jacoco之间是否存在任何已知问题?或者两种机制都应该在一个sonarqube上工作?

  • 我从Cucumber 1.2.5升级到Cucumber 5.6.0。升级进行得很顺利,但是我的扩展报告坏了。我尝试升级它们并使用Cucumber 4适配器。文件很稀少,我无法让它工作。所以我去下载了示例实现。我能够编译和运行它,并获得报告。我将示例项目升级到Cucumber 4.8.1,将Extent Reporter升级到4,然后运行,但没有创建报告。我不知所措,我的谷歌搜索没有找到任何信息。

  • 我在visual studio C #中使用selenium处理ExtentReports,我运行了案例测试,但是报告文件。我在解决方案资源管理器中创建的报表文件夹中没有生成html。不知道问题出在哪里,我改了报告文件的路径去查,还是不生成。以下是我的代码: 和extent-config.xml:

  • 一个Github回购与用于这个问题的代码可以在这里找到:https://github.com/thenewmr/UnitTestCoverageExample 我们在试图通过Jacoco正确生成代码覆盖率报告时遇到了严重问题。 我们遵循了互联网上的各种指南,包括Patrick McLaren在回答这个问题时链接到的这本指南。 我们还研究了有关堆栈溢出的各种问题,但到目前为止还没有发现任何问题。 以