You are viewing a plain text version of this content. The canonical link for it is here.
Posted to surefire-commits@maven.apache.org by df...@apache.org on 2008/01/24 23:35:20 UTC

svn commit: r615068 - in /maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report: ReportTestCase.java ReportTestSuite.java SurefireReportParser.java TestSuiteXmlParser.java

Author: dfabulich
Date: Thu Jan 24 14:35:17 2008
New Revision: 615068

URL: http://svn.apache.org/viewvc?rev=615068&view=rev
Log:
[SUREFIRE-433] (not finished) support XML files containing test methods from multiple classes.  Regardless on what we should emit, sometimes Ant or TestNG will emit files like this, so we should be able to parse/handle them.

Modified:
    maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestCase.java
    maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestSuite.java
    maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java
    maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/TestSuiteXmlParser.java

Modified: maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestCase.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestCase.java?rev=615068&r1=615067&r2=615068&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestCase.java (original)
+++ maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestCase.java Thu Jan 24 14:35:17 2008
@@ -97,4 +97,9 @@
         failure.put( "message", message );
         failure.put( "type", type );
     }
+    
+    public String toString()
+    {
+        return fullName;
+    }
 }

Modified: maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestSuite.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestSuite.java?rev=615068&r1=615067&r2=615068&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestSuite.java (original)
+++ maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/ReportTestSuite.java Thu Jan 24 14:35:17 2008
@@ -19,11 +19,12 @@
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ReportTestSuite
 {
-    private List testCases;
+    private List testCases = new ArrayList();
 
     private int numberOfErrors;
 
@@ -31,7 +32,7 @@
 
     private int numberOfSkipped;
 
-    private int numberOfTests;
+    private Integer numberOfTests;
 
     private String name;
 
@@ -78,12 +79,14 @@
 
     public int getNumberOfTests()
     {
-        return numberOfTests;
+        if ( numberOfTests != null ) return numberOfTests.intValue();
+        if ( testCases != null ) return testCases.size();
+        return 0;
     }
 
     public void setNumberOfTests( int numberOfTests )
     {
-        this.numberOfTests = numberOfTests;
+        this.numberOfTests = new Integer( numberOfTests );
     }
 
     public String getName()
@@ -104,6 +107,19 @@
     public void setFullClassName( String fullClassName )
     {
         this.fullClassName = fullClassName;
+        int lastDotPosition = fullClassName.lastIndexOf( "." );
+        
+        name = fullClassName.substring( lastDotPosition + 1, fullClassName.length() );
+        
+        if ( lastDotPosition < 0 )
+        {
+            /* no package name */
+            packageName = "";
+        }
+        else
+        {
+            packageName = fullClassName.substring( 0, lastDotPosition );
+        }
     }
 
     public String getPackageName()
@@ -129,5 +145,10 @@
     public void setTestCases( List testCases )
     {
         this.testCases = testCases;
+    }
+    
+    public String toString()
+    {
+        return fullClassName + " ["+getNumberOfTests()+"/"+getNumberOfFailures()+"/"+getNumberOfErrors()+"/"+getNumberOfSkipped()+"]";
     }
 }

Modified: maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java?rev=615068&r1=615067&r2=615068&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java (original)
+++ maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java Thu Jan 24 14:35:17 2008
@@ -23,6 +23,7 @@
 import java.io.IOException;
 import java.text.NumberFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
@@ -77,13 +78,13 @@
         TestSuiteXmlParser parser = new TestSuiteXmlParser();
         for ( int index = 0; index < xmlReportFileList.size(); index++ )
         {
-            ReportTestSuite testSuite;
+            Collection suites;
 
             File currentReport = (File) xmlReportFileList.get( index );
 
             try
             {
-                testSuite = parser.parse( currentReport.getAbsolutePath() );
+                suites = parser.parse( currentReport.getAbsolutePath() );
             }
             catch ( ParserConfigurationException e )
             {
@@ -98,7 +99,7 @@
                 throw new MavenReportException( "Error reading JUnit XML report " + currentReport, e );
             }
 
-            testSuites.add( testSuite );
+            testSuites.addAll( suites );
         }
 
         return testSuites;

Modified: maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/TestSuiteXmlParser.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/TestSuiteXmlParser.java?rev=615068&r1=615067&r2=615068&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/TestSuiteXmlParser.java (original)
+++ maven/surefire/trunk/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/TestSuiteXmlParser.java Thu Jan 24 14:35:17 2008
@@ -24,6 +24,8 @@
 import java.text.NumberFormat;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -39,7 +41,9 @@
 public class TestSuiteXmlParser
     extends DefaultHandler
 {
-    private ReportTestSuite suite;
+    private ReportTestSuite defaultSuite;
+    private ReportTestSuite currentSuite;
+    private Map classesToSuites;
     private NumberFormat numberFormat = NumberFormat.getInstance();
 
     /**
@@ -49,28 +53,23 @@
 
     private ReportTestCase testCase;
 
-    public ReportTestSuite parse( String xmlPath )
+    public Collection parse( String xmlPath )
         throws ParserConfigurationException, SAXException, IOException
     {
         SAXParserFactory factory = SAXParserFactory.newInstance();
 
         SAXParser saxParser = factory.newSAXParser();
+        
+        classesToSuites = new HashMap();
 
         saxParser.parse( new File( xmlPath ), this );
         
-        return suite;
-    }
-
-
-    private int getAttributeAsInt( Attributes attributes, String name )
-    {
-        // may or may not exist
-        String valueAsString = attributes.getValue( name );
-        if ( valueAsString != null )
+        if ( defaultSuite.getNumberOfTests() == 0 )
         {
-            return Integer.parseInt( valueAsString );
+            classesToSuites.remove( defaultSuite.getFullClassName() );
         }
-        return 0;
+        
+        return classesToSuites.values();
     }
 
     public void startElement( String uri, String localName, String qName, Attributes attributes )
@@ -80,60 +79,52 @@
         {
             if ( "testsuite".equals( qName ) )
             {
-                suite = new ReportTestSuite();
-                suite.setNumberOfErrors( getAttributeAsInt( attributes, "errors" ) );
-                suite.setNumberOfFailures( getAttributeAsInt( attributes, "failures" ) );
-                suite.setNumberOfSkipped( getAttributeAsInt( attributes, "skipped" ) );
-                suite.setNumberOfTests( getAttributeAsInt( attributes, "tests" ) );
+                currentSuite = defaultSuite = new ReportTestSuite();
 
                 Number time = numberFormat.parse( attributes.getValue( "time" ) );
 
-                suite.setTimeElapsed( time.floatValue() );
+                defaultSuite.setTimeElapsed( time.floatValue() );
 
                 //check if group attribute is existing
                 if ( attributes.getValue( "group" ) != null && !"".equals( attributes.getValue( "group" ) ) )
                 {
                     String packageName = attributes.getValue( "group" );
-                    suite.setPackageName( packageName );
-
                     String name = attributes.getValue( "name" );
-                    suite.setName( name );
 
-                    suite.setFullClassName( packageName + "." + name );
+                    defaultSuite.setFullClassName( packageName + "." + name );
                 }
                 else
                 {
                     String fullClassName = attributes.getValue( "name" );
-                    suite.setFullClassName( fullClassName );
-
-                    int lastDotPosition = fullClassName.lastIndexOf( "." );
-                    
-                    suite.setName( fullClassName.substring( lastDotPosition + 1, fullClassName.length() ) );
-                    
-                    if ( lastDotPosition < 0 )
-                    {
-                        /* no package name */
-                        suite.setPackageName( "" );
-                    }
-                    else
-                    {
-                        suite.setPackageName( fullClassName.substring( 0, lastDotPosition ) );
-                    }
+                    defaultSuite.setFullClassName( fullClassName );
                 }
 
-                suite.setTestCases( new ArrayList() );
+                classesToSuites.put( defaultSuite.getFullClassName(), defaultSuite );
             }
             else if ( "testcase".equals( qName ) )
             {
                 currentElement = new StringBuffer();
 
                 testCase = new ReportTestCase();
-
-                testCase.setFullClassName( suite.getFullClassName() );
-
+                
                 testCase.setName( attributes.getValue( "name" ) );
-
-                testCase.setClassName( suite.getName() );
+                
+                String fullClassName = attributes.getValue( "classname" );
+                
+                if ( fullClassName != null )
+                {
+                    currentSuite = (ReportTestSuite) classesToSuites.get( fullClassName );
+                    if ( currentSuite == null )
+                    {
+                        currentSuite = new ReportTestSuite();
+                        currentSuite.setFullClassName( fullClassName );
+                        classesToSuites.put( fullClassName, currentSuite );
+                    }
+                }
+                
+                testCase.setFullClassName( currentSuite.getFullClassName() );
+                testCase.setClassName( currentSuite.getName() );
+                testCase.setFullName( currentSuite.getFullClassName() + "." + testCase.getName() );
 
                 String timeAsString = attributes.getValue( "time" );
 
@@ -146,19 +137,24 @@
 
                 testCase.setTime( time.floatValue() );
 
-                testCase.setFullName( suite.getFullClassName() + "." + testCase.getName() );
+                if ( currentSuite != defaultSuite ) {
+                    currentSuite.setTimeElapsed( time.floatValue() + currentSuite.getTimeElapsed() );
+                }
             }
             else if ( "failure".equals( qName ) )
             {
                 testCase.addFailure( attributes.getValue( "message" ), attributes.getValue( "type" ) );
+                currentSuite.setNumberOfFailures( 1 + currentSuite.getNumberOfFailures() );
             }
             else if ( "error".equals( qName ) )
             {
                 testCase.addFailure( attributes.getValue( "message" ), attributes.getValue( "type" ) );
+                currentSuite.setNumberOfErrors( 1 + currentSuite.getNumberOfErrors() );
             }
             else if ( "skipped".equals( qName ) )
             {
                 testCase.addFailure( "skipped", "skipped" ); // TODO extract real reasons
+                currentSuite.setNumberOfSkipped( 1 + currentSuite.getNumberOfSkipped() );
             }
         }
         catch ( ParseException e )
@@ -167,12 +163,13 @@
         }
     }
 
+
     public void endElement( String uri, String localName, String qName )
         throws SAXException
     {
         if ( "testcase".equals( qName ) )
         {
-            suite.getTestCases().add( testCase );
+            currentSuite.getTestCases().add( testCase );
         }
         else if ( "failure".equals( qName ) )
         {
@@ -186,6 +183,7 @@
 
             error.put( "detail", parseCause( currentElement.toString() ) );
         }
+        // TODO extract real skipped reasons
     }
 
     public void characters( char[] ch, int start, int length )