如何在 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 的屏幕截图 [关闭]