2012-04-18 95 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