【问题标题】:Create Custom TestNG Report - WebDriver创建自定义 TestNG 报告 - WebDriver
【发布时间】:2012-04-18 23:35:24
【问题描述】:

我正在尝试实现 org.testng IReporter 接口。我的 Java 不是那么好,基于我在网上找到的一些示例,我能够创建一个 Reporter 类。我遇到的问题是如何使用它,在哪里调用它以及如何以及传递哪些参数?

公共类 Reporter 实现 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 Selenium 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);
}

如何使用我的 Reporter 在运行结束时获取自定义报告???

谢谢!

【问题讨论】:

    标签: java selenium report webdriver testng


    【解决方案1】:

    只需在上面展开您的骨架以在您想要的位置生成结果,.xml、.html、文本文件等...

    【讨论】:

    • 谢谢 Cedric,你能说得更具体一点吗?如何在 Reporter 和我的测试之间建立连接?
    • 传递给您的 generateReport() 方法的参数包含测试套件的整个结果,所以一切都在那里。如果您感到困惑,请查看现有的报告器(查看所有实现 IReporter 的类)并了解它们如何检索结果。
    【解决方案2】:

    David,您可以将自定义报告器添加到您的 testng.xml 中,以防您通过套件部分中的 xml 调用测试。

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

    如果您以编程方式调用它们,那么您需要通过您的代码添加它,如 @Running TestNG programmatically 所记录的那样

    如果您从命令行调用测试,请参考 this

    如果您以上述任何一种方式指定,TestNG 将在所有运行结束时调用此报告器。

    【讨论】:

    • 谢谢,这很有帮助,但即使我完成了这项工作,我也没有得到我需要的东西。我想要完成的是根据我的代码将参数传递给记者,所以它会在报告中说明我需要什么。例如,我有一个简单的测试用例检查主页上的链接,如果一个链接失败则停止测试,如果我更改代码并且它运行低谷,最后我得到 PASS。有什么建议吗?
    • TestNG调用你的监听器的generateReport方法时,所有测试用例的结果都会被传递。因此,您的结果变量包含套件的所有通过-失败信息。如果您想在失败时设置自定义数据,则需要使用 setAttribute 函数在 afterInvocation 方法中将其显式设置为 TestResult 对象。
    • 当你说你改变你的代码时,你是在改变断言来验证吗?断言在失败时停止执行,而验证是软断言,例如,它不会停止执行,但仍会将案例标记为通过。您可能想看看:seleniumexamples.com/blog/guide/using-soft-assertions-in-testng 以了解处理这些问题的方法..
    【解决方案3】:

    我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 );
            ...
    

    然后,您可以从该 Listener 类创建一个“报告编写器”类,该类可以使用以下方式创建任意 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.
    

    【讨论】:

    • 请注意,link-only answers are discouraged,SO 答案应该是搜索解决方案的终点(相对于另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
    • 感谢您的帖子。我从 git 项目中找到了我需要的东西。我只想知道如何获取有关每个方法运行时间的信息。
    • 关于每种方法运行所需时间的信息已经在默认报告中。在此处查看屏幕截图:github.com/djangofan/testng-custom-report-example
    • 嘿@djangofan 很抱歉让这个死而复生。您可以使用上述方法在测试进行时生成报告,而不是在测试结束时生成报告吗?我想做与上面类似的事情,除了我想生成一个 HTML 监控报告,您可以在其中查看报告以监控测试进度。谢谢。
    • @colin - 那么我想你想使用一个叫做 Extent Reports 的东西。
    【解决方案4】:

    你可以使用

    @Listeners(ReporterClassName.class) 
    

    例如: @Listeners(Reporter.class)

    公共类VerifyTest 扩展TestBase

    【讨论】:

      【解决方案5】:

      使用实时报告插件可以实时报告任何正在运行的测试的美丽报告。非常好用,无需修改现有代码,详情请访问此github urlRealTimeReport

      您可以找到不同 TestNg 报告接口的详细实现

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多