我正在从事一个基于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。因此,无法继续删除重复测试。
请提供上述想法。
当您重新运行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在回答这个问题时链接到的这本指南。 我们还研究了有关堆栈溢出的各种问题,但到目前为止还没有发现任何问题。 以