2012-04-18 51 views
1

我试图实现org.testng IReporter接口。我的Java并不好,基于我在网上找到的一些例子,我可以创建一个Reporter类。我遇到的问题是如何使用它,以及我在哪里调用它以及如何以及将哪些参数传递给它?创建自定义TestNG报告 - WebDriver

公共类记者实现IReporter {

public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory){ 
     ISuiteResult results =suites.get(0).getResults().get("Sanity Suite"); 
     ITestContext context = results.getTestContext(); 

     IResultMap passedTests = context.getPassedTests(); 
     IResultMap failedTests = context.getFailedTests(); 

     // Print all test exceptions... 
     for(ITestResult r: failedTests.getAllResults()) { 
      System.out.println(r.getThrowable()); 
     } 
} 

}

例如,我有这个webdriver的硒TestNG的测试:

公共类VerifyTest扩展TestBase {

@Test 
public void test1() { 
    verifyTrue(false); 
    verifyEquals("pass", "fail"); 
    verifyFalse(true); 
} 

@Test 
public void test2() { 
    verifyTrue(false); 
    assertEquals("pass", "fail"); 
    verifyFalse(true); 
} 

如何我是否会使用我的记者在t处获得自定义报告他结束了运行?

谢谢!

回答

0

只是扩大你的骨骼之上产生的结果,你想他们,.xml或.html,文本文件,等...

+0

谢谢塞德里克,你可以是一个虽然更具体一些?我如何在Reporter和我的测试之间建立联系? – 2012-04-19 03:37:23

+0

传递给您的generateReport()方法的参数包含测试套件的整个结果,所以一切都在那里。如果您感到困惑,请查看现有记者(查看实施IReporter的所有课程)并查看他们如何检索他们的结果。 – 2012-04-19 19:19:32

1

大卫,你可以在你的情况下,记者自定义添加到您的testng.xml你在套件部分通过xml调用你的测试。

<listeners> 
<listener class-name="yourpackage.Reporter"/> </listeners> 

如果你是编程调用这些,那么你就需要通过您的代码,将其添加为记录@Running TestNG programmatically

如果要调用的命令行你的测试,是指this

记者将在TestNG的所有运行结束时被调用,如果您以上述任一方式指定的话。

+0

谢谢你,这是非常有帮助的,但即使做了这项工作,我也没有得到我所需要的东西。我试图完成的是将基于我的代码的参数传递给记者,所以它会在报告中说我需要什么。例如,我有一个简单的测试用例,它检查主页上的链接,如果一个链接失败,那么测试停止,如果我更改了代码并且它运行低谷,我在最后得到PASS。有什么建议么? – 2012-04-19 20:43:09

+1

所有测试用例的结果在调用listener的generateReport方法时由TestNG传递。所以你的结果变量包含你的套件的所有传递失败信息。如果您想在失败时设置自定义数据,那么您需要使用setAttribute函数将其显式设置为afterInvocation方法中的TestResult对象。 – 2012-04-20 05:34:59

+0

当你说你改变你的代码时,你是否改变断言来验证?断言在失败的地方停止执行,而验证是一个软断言,因为它不会暂停执行,但它仍然将该情况标记为通过。您可能想看看:http://seleniumexamples.com/blog/guide/using-soft-assertions-in-testng/以了解处理这些问题的方法.. – 2012-04-20 05:35:07

1

I created a project that is an example of generating a customized report

基本思想是创建一个Listener类并在testing.xml文件中引用它。

<listeners> 
    <listener class-name="qa.hs.framework.CustomReportListener"/> 
    </listeners> 

,然后创建类:

public class CustomReportListener implements IReporter { 

    @Override 
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, 
      String outputDirectory) { 
     System.out.println(); 
     //Iterating over each suite included in the test 
     for (ISuite suite : suites) { 
     //Following code gets the suite name 
     String suiteName = suite.getName(); 
     //Getting the results for the said suite 
     Map<String, ISuiteResult> suiteResults = suite.getResults(); 
     for (ISuiteResult sr : suiteResults.values()) { 
      ITestContext tc = sr.getTestContext(); 
      System.out.println("Passed tests for suite '" + suiteName + "' is:" + 
       tc.getPassedTests().getAllResults().size()); 
     } 
     CustomReport cr = new CustomReport(); 
     cr.generateReport(xmlSuites, suites, outputDirectory); 
     ... 

然后,从监听器类,你可以创建一个用于创建使用类似这样的任意HTML输出“报表编辑器”类:

public class CustomReport extends CustomReportListener 
{ 
     private static final Logger LOG = Logger.getLogger(CustomReport.class); 
     private static final SimpleDateFormat dateFormatter = new SimpleDateFormat(" MMM d 'at' hh:mm a"); 

     private String reportFileName = Constants.reportFileName; 
     private PrintWriter m_out; 
     private int m_row; 
     private Integer m_testIndex; 
     private int m_methodIndex; 
     private Scanner scanner; 

     @Override 
     public void generateReport(List<XmlSuite> xml, List<ISuite> suites, String outdir) { 
       try { 
         m_out = createWriter(outdir); 
       } 
       catch (IOException e) { 
         LOG.error("output file", e); 
         return; 
       } 
       startHtml(m_out); 
       generateSuiteSummaryReport(suites); 
       generateMethodSummaryReport(suites); 
       generateMethodDetailReport(suites); 
       endHtml(m_out); 
       m_out.flush(); 
       m_out.close(); 
     } 

最后,从该“CustomReport”类中,您的“生成报告”方法都可以访问报告中的所有数据,例如:

testContext.getPassedTests() 
Map<String, ISuiteResult> r = suite.getResults() 
method.getDescription() 
method.getTestClass().getName() 
ITestResult.SUCCESS 
tests.getAllMethods() 
overview.getStartDate().getTime() 
overview.getIncludedGroups() 
etc. 
+0

请注意,[仅限链接答案是不鼓励的],所以答案应该是搜索解决方案的终点(而不是另一个引用的中途停留时间,往往会随着时间的推移变得陈旧)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2014-01-21 09:37:55

+0

感谢您的帖子。我从git项目中找到了我需要的东西。我想知道的是如何获得有关每种方法运行时间的信息。 – PHPGuru 2014-12-24 00:34:55

+0

有关每种方法运行多少时间的信息已在默认报告中。看到这里的截图:https://github.com/djangofan/testng-custom-report-example – djangofan 2014-12-24 17:29:14

0

您可以使用

@Listeners(ReporterClassName.class) 

例如: @Listeners(记者。类)

公共类VerifyTest可能使用实时报告插件扩展TestBase

0

美丽的报告与任何运行试验的实时报告。非常容易使用,并没有在现有的代码需要的,细节的修改,请访问此github上的url RealTimeReport

你可以找到详细的实现不同TestNG的报告的intrfaces

enter image description here