001package org.w3.ldp.testsuite.reporter; 002 003import java.util.Arrays; 004 005import org.apache.commons.lang3.text.WordUtils; 006import org.testng.ITestContext; 007import org.testng.ITestResult; 008import org.testng.TestListenerAdapter; 009import org.testng.internal.Utils; 010 011public class LdpTestListener extends TestListenerAdapter { 012 013 private static final String FAIL = "Failed"; 014 private static final String SKIP = "Skipped"; 015 private static final String PASSED = "Passed"; 016 017 private long startTime; 018 private StringBuffer errors; 019 020 @Override 021 public void onStart(ITestContext testContext) { 022 startTime = System.currentTimeMillis(); 023 errors = new StringBuffer(); 024 } 025 026 @Override 027 public void onFinish(ITestContext testContext) { 028 long now = System.currentTimeMillis(); 029 double timeInSeconds = (double) (now - startTime) / 1000; 030 System.out.printf("%nTotal Time: %.2fs%n", timeInSeconds); 031 032 if (errors.length() != 0) { 033 System.err.println(errors); 034 } 035 } 036 037 @Override 038 public void onTestFailure(ITestResult tr) { 039 log(tr, FAIL); 040 printErrorDetails(tr); 041 } 042 043 protected void printErrorDetails(ITestResult tr) { 044 errors.append("\n[FAILURE] "); 045 errors.append(tr.getTestClass().getRealClass().getSimpleName()); 046 errors.append("."); 047 errors.append(tr.getName()); 048 errors.append("\n"); 049 050 String description = tr.getMethod().getDescription(); 051 if (description != null) { 052 errors.append("\n"); 053 errors.append(WordUtils.wrap(description, 78)); 054 errors.append("\n"); 055 } 056 057 Throwable thrown = tr.getThrowable(); 058 if (thrown != null) { 059 errors.append("\n"); 060 errors.append(Utils.stackTrace(thrown, false)[0]); 061 errors.append("\n"); 062 } 063 } 064 065 @Override 066 public void onTestSkipped(ITestResult tr) { 067 log(tr, SKIP); 068 } 069 070 @Override 071 public void onTestSuccess(ITestResult tr) { 072 log(tr, PASSED); 073 } 074 075 private void log(ITestResult tr, String status) { 076 System.out.printf( 077 "%-50s %-17s %-8s %-15s %8s%n", 078 tr.getName(), 079 tr.getTestClass().getRealClass().getSimpleName() 080 .replaceAll("Test", ""), status, 081 Arrays.toString(tr.getMethod().getGroups()), 082 (tr.getEndMillis() - tr.getStartMillis()) + "ms"); 083 } 084}