如何在 testNG 报告中包含失败屏幕截图

Posted

技术标签:

【中文标题】如何在 testNG 报告中包含失败屏幕截图【英文标题】:How can I include a failure screenshot to the testNG report 【发布时间】:2012-02-14 21:30:27 【问题描述】:

目前我正在以这种方式截取测试失败的屏幕截图:

@AfterMethod(alwaysRun=true)
public void catchExceptions(ITestResult result)
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
    String methodName = result.getName();
    if(!result.isSuccess())
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try 
            FileUtils.copyFile(scrFile, new File((String) PathConverter.convert("failure_screenshots/"+methodName+"_"+formater.format(calendar.getTime())+".png")));
         catch (IOException e1) 
            e1.printStackTrace();
        
    

我可以在 TestNG 报告链接或图片中包含我自己的屏幕截图吗?如果是怎么办?

我在网上找到的只是 FEST 框架。但由于我已经在截屏,我不想使用其他框架。

【问题讨论】:

【参考方案1】:

自定义一点 ExtentReport 可以提供非常有用的报告,在测试失败时准确捕获异常+屏幕截图。屏幕截图可以放在异常旁边,用户可以使用它来了解发生错误时网站在做什么。

报告示例 测试

      @Test (enabled=true)                           
        public void verifySearch() 
       extentlogger = extent.createTest("To verify verifySearch");
      //Your other code here.....
        soft.assertEquals("xxx", "xxxx");
        soft.assertAll();
      

后方法

     @AfterMethod
     public void getResult(ITestResult result) throws Exception
      if(result.getStatus() == ITestResult.FAILURE)
     
        extentlogger.log(Status.FAIL, MarkupHelper.createLabel(result.getThrowable() + 
        " - Test Case Failed", ExtentColor.RED));
    
        try 
        // get path of captured screenshot using custom failedTCTakeScreenshot method
        String screenshotPath = failedTCTakeScreenshot( result);
        extentlogger.fail("Test Case Failed Snapshot is below " + 
      extentlogger.addScreenCaptureFromPath(screenshotPath));
        catch (InterruptedException e) 
        e.printStackTrace();
        
      
     

【讨论】:

不回答原来的问题【参考方案2】:

是的,您可以在 testng 报告中包含指向您的屏幕截图的链接。

您需要调用org.testng.Reporter.log 方法来编写指向testng 报告的超链接,方法是使用@Listeners(yourListener.class) 注释您的测试类或所有测试类的父级,或者将侦听器添加到您的@ 987654323@.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="default">
  <listeners>
    <listener class-name="ScreenshotListener" />
  </listeners>
  <test name="Test">
    <packages>
      <package name="someTests.*"/>
    </packages>
  </test>
</suite>

您需要先创建一个 Listener 类并将其添加到 testng。您可以从 testng.org 获取详细信息。搜索监听器。

一旦你创建了那个类,你应该在其中编写一个覆盖ontestfailure 方法的方法。每当 testng 识别出失败时,都会执行此方法中的代码。

您可以调用您的屏幕截图抓取方法并使用Reporter.log 将超链接放置到该屏幕截图。然后您可以在失败的测试用例详细信息下找到此链接。

import java.io.*;
import java.util.*;
import java.text.*;
import org.apache.commons.io.FileUtils;

import org.openqa.selenium.*;

import org.testng.*;

public class ScreenshotListener extends TestListenerAdapter 
    @Override
    public void onTestFailure(ITestResult result) 
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
        String methodName = result.getName();
        if(!result.isSuccess())
            File scrFile = ((TakesScreenshot)SomeStaticWebDriver.driver).getScreenshotAs(OutputType.FILE);
            try 
                String reportDirectory = new File(System.getProperty("user.dir")).getAbsolutePath() + "/target/surefire-reports";
                File destFile = new File((String) reportDirectory+"/failure_screenshots/"+methodName+"_"+formater.format(calendar.getTime())+".png");
                FileUtils.copyFile(scrFile, destFile);
                Reporter.log("<a href='"+ destFile.getAbsolutePath() + "'> <img src='"+ destFile.getAbsolutePath() + "' height='100' width='100'/> </a>");
             catch (IOException e) 
                e.printStackTrace();
            
        
    

【讨论】:

感谢您的回答。是否可以将链接/图片放在结果中?就像在失败的方法名称下一样? 是的。您需要首先创建一个 Listener 类并将其添加到 testng。您可以从 testng.org 获取详细信息。搜索监听器。创建该类后,您应该在其中编写一个覆盖 ontestfailure 方法的方法。每当 testng 识别出失败时,都会执行此方法中的代码。您可以调用您的屏幕截图抓取方法并使用 Reporter.log 将超链接放置到该屏幕截图。然后您可以在失败的测试用例详细信息下找到此链接。 优秀。像魅力一样工作。令人着迷的是,如此简短的描述如何有帮助;)更多细节。扩展TestNG TestListenerAdapter,在上面的问题中实现onTestFailure并在最后添加Reporter.log("screenshot");,注释你的测试类或带有@Listeners(yourListener.class) 的所有测试类的父级。你就完成了。 @Harini 我假设您正在使用 testNG 插件从 Eclipse 运行此测试。您需要转到项目的属性,然后到 testNG 部分并检查选项-使用项目 testng jar。您的问题将得到解决 @Cagy79 如果您的库路径中有 selenium-standalone.jar 和 testng.jar,则需要更改 jar 文件的顺序。我假设 selenium.jar 具有导致这种奇怪行为的旧版本的 testNG。

以上是关于如何在 testNG 报告中包含失败屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

在我的应用程序中包含 iPad/iPhone 的屏幕截图 [关闭]

如何将失败的屏幕截图包含到代码接收报告中

TestNG 中的非静态驱动程序和屏幕截图侦听器

delphi不用getdc如何屏幕截图

Selenium 可以截取 JUnit 测试失败的屏幕截图吗?

将 TestNG 屏幕截图输出到 Jenkins