1 17 18 19 package org.apache.geronimo.mavenplugins.testsuite.report; 20 21 import org.apache.maven.reporting.MavenReportException; 22 import org.codehaus.plexus.util.DirectoryScanner; 23 import org.codehaus.plexus.util.StringUtils; 24 import org.xml.sax.SAXException ; 25 26 import javax.xml.parsers.ParserConfigurationException ; 27 import java.io.File ; 28 import java.io.IOException ; 29 import java.text.NumberFormat ; 30 import java.util.ArrayList ; 31 import java.util.HashMap ; 32 import java.util.List ; 33 import java.util.ListIterator ; 34 import java.util.Locale ; 35 import java.util.Map ; 36 37 public class SurefireReportParser 38 { 39 private NumberFormat numberFormat = NumberFormat.getInstance(); 40 41 private File reportsDirectory; 42 43 private List testSuites = new ArrayList (); 44 45 private Locale locale; 46 47 private static final int PCENT = 100; 48 49 public SurefireReportParser() 50 { 51 } 52 53 public SurefireReportParser( File reportsDirectory, Locale locale ) 54 { 55 this.reportsDirectory = reportsDirectory; 56 57 setLocale( locale ); 58 } 59 60 public List parseXMLReportFiles() 61 throws MavenReportException 62 { 63 if ( reportsDirectory.exists() ) 64 { 65 String [] xmlReportFiles = getIncludedFiles( reportsDirectory, "*.xml", "*.txt" ); 66 67 for ( int index = 0; index < xmlReportFiles.length; index++ ) 68 { 69 ReportTestSuite testSuite = new ReportTestSuite(); 70 71 String currentReport = xmlReportFiles[index]; 72 73 try 74 { 75 testSuite.parse( reportsDirectory + "/" + currentReport ); 76 } 77 catch ( ParserConfigurationException e ) 78 { 79 throw new MavenReportException( "Error setting up parser for JUnit XML report", e ); 80 } 81 catch ( SAXException e ) 82 { 83 throw new MavenReportException( "Error parsing JUnit XML report " + currentReport, e ); 84 } 85 catch ( IOException e ) 86 { 87 throw new MavenReportException( "Error reading JUnit XML report " + currentReport, e ); 88 } 89 90 testSuites.add( testSuite ); 91 } 92 } 93 94 return testSuites; 95 } 96 97 protected String parseTestSuiteName( String lineString ) 98 { 99 return lineString.substring( lineString.lastIndexOf( "." ) + 1, lineString.length() ); 100 } 101 102 protected String parseTestSuitePackageName( String lineString ) 103 { 104 return lineString.substring( lineString.indexOf( ":" ) + 2, lineString.lastIndexOf( "." ) ); 105 } 106 107 protected String parseTestCaseName( String lineString ) 108 { 109 return lineString.substring( 0, lineString.indexOf( "(" ) ); 110 } 111 112 public Map getSummary( List suites ) 113 { 114 Map totalSummary = new HashMap (); 115 116 ListIterator iter = suites.listIterator(); 117 118 int totalNumberOfTests = 0; 119 120 int totalNumberOfErrors = 0; 121 122 int totalNumberOfFailures = 0; 123 124 int totalNumberOfSkipped = 0; 125 126 float totalElapsedTime = 0.0f; 127 128 while ( iter.hasNext() ) 129 { 130 ReportTestSuite suite = (ReportTestSuite) iter.next(); 131 132 totalNumberOfTests += suite.getNumberOfTests(); 133 134 totalNumberOfErrors += suite.getNumberOfErrors(); 135 136 totalNumberOfFailures += suite.getNumberOfFailures(); 137 138 totalNumberOfSkipped += suite.getNumberOfSkipped(); 139 140 totalElapsedTime += suite.getTimeElapsed(); 141 } 142 143 String totalPercentage = computePercentage( totalNumberOfTests, totalNumberOfErrors, totalNumberOfFailures, 144 totalNumberOfSkipped ); 145 146 totalSummary.put( "totalTests", Integer.toString( totalNumberOfTests ) ); 147 148 totalSummary.put( "totalErrors", Integer.toString( totalNumberOfErrors ) ); 149 150 totalSummary.put( "totalFailures", Integer.toString( totalNumberOfFailures ) ); 151 152 totalSummary.put( "totalSkipped", Integer.toString( totalNumberOfSkipped ) ); 153 154 totalSummary.put( "totalElapsedTime", numberFormat.format( totalElapsedTime ) ); 155 156 totalSummary.put( "totalPercentage", totalPercentage ); 157 158 return totalSummary; 159 } 160 161 public void setReportsDirectory( File reportsDirectory ) 162 { 163 this.reportsDirectory = reportsDirectory; 164 } 165 166 public File getReportsDirectory() 167 { 168 return this.reportsDirectory; 169 } 170 171 public final void setLocale( Locale locale ) 172 { 173 this.locale = locale; 174 numberFormat = NumberFormat.getInstance( locale ); 175 } 176 177 public Locale getLocale() 178 { 179 return this.locale; 180 } 181 182 public void setNumberFormat( NumberFormat numberFormat ) 183 { 184 this.numberFormat = numberFormat; 185 } 186 187 public NumberFormat getNumberFormat() 188 { 189 return this.numberFormat; 190 } 191 192 public Map getSuitesGroupByPackage( List testSuitesList ) 193 { 194 ListIterator iter = testSuitesList.listIterator(); 195 196 Map suitePackage = new HashMap (); 197 198 while ( iter.hasNext() ) 199 { 200 ReportTestSuite suite = (ReportTestSuite) iter.next(); 201 202 List suiteList = new ArrayList (); 203 204 if ( suitePackage.get( suite.getPackageName() ) != null ) 205 { 206 suiteList = (List ) suitePackage.get( suite.getPackageName() ); 207 } 208 209 suiteList.add( suite ); 210 211 suitePackage.put( suite.getPackageName(), suiteList ); 212 } 213 214 return suitePackage; 215 } 216 217 public String computePercentage( int tests, int errors, int failures, int skipped ) 218 { 219 float percentage; 220 if ( tests == 0 ) 221 { 222 percentage = 0; 223 } 224 else 225 { 226 percentage = ( (float) ( tests - errors - failures - skipped ) / (float) tests ) * PCENT; 227 } 228 229 return numberFormat.format( percentage ); 230 } 231 232 public List getFailureDetails( List testSuitesList ) 233 { 234 ListIterator iter = testSuitesList.listIterator(); 235 236 List failureDetailList = new ArrayList (); 237 238 while ( iter.hasNext() ) 239 { 240 ReportTestSuite suite = (ReportTestSuite) iter.next(); 241 242 List testCaseList = suite.getTestCases(); 243 244 if ( testCaseList != null ) 245 { 246 ListIterator caseIter = testCaseList.listIterator(); 247 248 while ( caseIter.hasNext() ) 249 { 250 ReportTestCase tCase = (ReportTestCase) caseIter.next(); 251 252 if ( tCase.getFailure() != null ) 253 { 254 failureDetailList.add( tCase ); 255 } 256 } 257 } 258 } 259 260 return failureDetailList; 261 } 262 263 private String [] getIncludedFiles( File directory, String includes, String excludes ) 264 { 265 DirectoryScanner scanner = new DirectoryScanner(); 266 267 scanner.setBasedir( directory ); 268 269 scanner.setIncludes( StringUtils.split( includes, "," ) ); 270 271 scanner.setExcludes( StringUtils.split( excludes, "," ) ); 272 273 scanner.scan(); 274 275 return scanner.getIncludedFiles(); 276 } 277 } 278 | Popular Tags |