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 br...@apache.org on 2006/03/04 14:09:36 UTC
svn commit: r383108 - in /maven/surefire/branches/surefire-testng:
surefire-api/src/main/java/org/apache/maven/surefire/testset/
surefire-booter/src/main/java/org/apache/maven/surefire/booter/
surefire-providers/surefire-testng/src/main/java/org/apache...
Author: brett
Date: Sat Mar 4 05:09:35 2006
New Revision: 383108
URL: http://svn.apache.org/viewcvs?rev=383108&view=rev
Log:
[MSUREFIRE-23] refactor pojo only methods into pojo test set, and create TestNGXmlTestSuite
Added:
maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java (with props)
Modified:
maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java
maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java
maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java
maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java
Modified: maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java Sat Mar 4 05:09:35 2006
@@ -16,21 +16,12 @@
* limitations under the License.
*/
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Base test class.
*/
public abstract class AbstractTestSet
implements SurefireTestSet
{
- private static final String TEST_METHOD_PREFIX = "test";
-
- protected List testMethods;
-
private Class testClass;
protected AbstractTestSet( Class testClass )
@@ -48,59 +39,8 @@
return testClass.getName();
}
- public int getTestCount()
- throws TestSetFailedException
- {
- discoverTestMethods();
-
- return testMethods.size();
- }
-
public Class getTestClass()
{
return testClass;
- }
-
- protected void discoverTestMethods()
- {
- if ( testMethods == null )
- {
- testMethods = new ArrayList();
-
- Method[] methods = testClass.getMethods();
-
- for ( int i = 0; i < methods.length; ++i )
- {
- Method m = methods[i];
-
- if ( isValidTestMethod( m ) )
- {
- String simpleName = m.getName();
-
- // name must have 5 or more chars
- if ( simpleName.length() > 4 )
- {
- String firstFour = simpleName.substring( 0, 4 );
-
- // name must start with "test"
- if ( firstFour.equals( TEST_METHOD_PREFIX ) )
- {
- testMethods.add( m );
- }
- }
- }
- }
- }
- }
-
- public static boolean isValidTestMethod( Method m )
- {
- boolean isInstanceMethod = !Modifier.isStatic( m.getModifiers() );
-
- boolean returnsVoid = m.getReturnType().equals( void.class );
-
- boolean hasNoParams = m.getParameterTypes().length == 0;
-
- return isInstanceMethod && returnsVoid && hasNoParams;
}
}
Modified: maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java Sat Mar 4 05:09:35 2006
@@ -22,7 +22,10 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
import java.util.ResourceBundle;
public class PojoTestSet
@@ -30,10 +33,14 @@
{
private ResourceBundle bundle = ResourceBundle.getBundle( Surefire.SUREFIRE_BUNDLE_NAME );
+ private static final String TEST_METHOD_PREFIX = "test";
+
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
private Object testObject;
+ protected List testMethods;
+
public PojoTestSet( Class testClass )
throws TestSetFailedException
{
@@ -227,5 +234,56 @@
public void tearDownFixture()
{
+ }
+
+ public int getTestCount()
+ throws TestSetFailedException
+ {
+ discoverTestMethods();
+
+ return testMethods.size();
+ }
+
+ private void discoverTestMethods()
+ {
+ if ( testMethods == null )
+ {
+ testMethods = new ArrayList();
+
+ Method[] methods = getTestClass().getMethods();
+
+ for ( int i = 0; i < methods.length; ++i )
+ {
+ Method m = methods[i];
+
+ if ( isValidTestMethod( m ) )
+ {
+ String simpleName = m.getName();
+
+ // name must have 5 or more chars
+ if ( simpleName.length() > 4 )
+ {
+ String firstFour = simpleName.substring( 0, 4 );
+
+ // name must start with "test"
+ if ( firstFour.equals( TEST_METHOD_PREFIX ) )
+ {
+ testMethods.add( m );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static boolean isValidTestMethod( Method m )
+ {
+ boolean isInstanceMethod = !Modifier.isStatic( m.getModifiers() );
+
+ boolean returnsVoid = m.getReturnType().equals( void.class );
+
+ boolean hasNoParams = m.getParameterTypes().length == 0;
+
+ return isInstanceMethod && returnsVoid && hasNoParams;
}
}
Modified: maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java Sat Mar 4 05:09:35 2006
@@ -140,7 +140,7 @@
//noinspection CatchGenericClass,OverlyBroadCatchBlock
try
{
- // TODO: assertions = true shouldn't be required if we had proper separation (see TestNG)
+ // TODO: assertions = true shouldn't be required for this CL if we had proper separation (see TestNG)
ClassLoader surefireClassLoader =
createClassLoader( surefireClassPathUrls, getClass().getClassLoader(), true );
@@ -153,7 +153,7 @@
Method run = surefireClass.getMethod( "run", new Class[]{List.class, Object[].class, String.class,
ClassLoader.class, ClassLoader.class} );
- ClassLoader oldContextClassLoader = Thread.currentThread() .getContextClassLoader();
+ ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader( testsClassLoader );
Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java Sat Mar 4 05:09:35 2006
@@ -172,7 +172,6 @@
// turn off all TestNG output
testNG.setVerbose( 0 );
- // TODO: check these work, otherwise put them in the xmlTest instances
testNG.setXmlSuites( Collections.singletonList( suite ) );
testNG.setListenerClasses( new ArrayList() );
Added: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java?rev=383108&view=auto
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java (added)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java Sat Mar 4 05:09:35 2006
@@ -0,0 +1,66 @@
+package org.apache.maven.surefire.testng;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.surefire.report.ReporterManager;
+import org.apache.maven.surefire.suite.SurefireTestSuite;
+import org.testng.ISuiteListener;
+import org.testng.ITestListener;
+import org.testng.TestNG;
+import org.testng.xml.XmlSuite;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Contains utility methods for executing TestNG.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class TestNGExecutor
+{
+ private TestNGExecutor()
+ {
+ }
+
+ static void executeTestNG( SurefireTestSuite surefireSuite, String testSourceDirectory, XmlSuite suite,
+ ReporterManager reporterManager )
+ {
+ TestNG testNG = new TestNG();
+ // turn off all TestNG output
+ testNG.setVerbose( 0 );
+
+ testNG.setXmlSuites( Collections.singletonList( suite ) );
+
+ testNG.setListenerClasses( new ArrayList() );
+
+ TestNGReporter reporter = new TestNGReporter( reporterManager, surefireSuite );
+ testNG.addListener( (ITestListener) reporter );
+ testNG.addListener( (ISuiteListener) reporter );
+
+ // Set source path so testng can find javadoc annotations if not in 1.5 jvm
+ if ( testSourceDirectory != null )
+ {
+ testNG.setSourcePath( testSourceDirectory );
+ }
+
+ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader( suite.getClass().getClassLoader() );
+ testNG.runSuitesLocally();
+ Thread.currentThread().setContextClassLoader( oldClassLoader );
+ }
+}
Propchange: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java Sat Mar 4 05:09:35 2006
@@ -18,9 +18,7 @@
import org.apache.maven.surefire.report.ReporterManager;
import org.apache.maven.surefire.testset.AbstractTestSet;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
+import org.apache.maven.surefire.testset.TestSetFailedException;
/**
* Main plugin point for running testng tests within the Surefire runtime
@@ -40,33 +38,11 @@
super( testClass );
}
- protected void discoverTestMethods()
+ public int getTestCount()
+ throws TestSetFailedException
{
- // TODO: This isn't correct. We really need to have TestNG do the counting for us.
- if ( testMethods == null )
- {
- testMethods = new ArrayList();
-
- Class testClass = getTestClass();
- Method[] methods = testClass.getMethods();
-
- for ( int i = 0; i < methods.length; ++i )
- {
- Method m = methods[i];
-
- if ( isValidTestMethod( m ) )
- {
- String simpleName = m.getName();
-
- // TODO: WHY?
- // name must have 5 or more chars
- if ( simpleName.length() > 4 )
- {
- testMethods.add( m );
- }
- }
- }
- }
+ // TODO: need to get this from TestNG somehow
+ return 1;
}
public void execute( ReporterManager reportManager, ClassLoader loader )
Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java Sat Mar 4 05:09:35 2006
@@ -18,19 +18,18 @@
import org.apache.maven.surefire.report.ReporterManager;
import org.apache.maven.surefire.suite.SurefireTestSuite;
-import org.testng.ISuiteListener;
-import org.testng.ITestListener;
-import org.testng.TestNG;
+import org.apache.maven.surefire.testset.TestSetFailedException;
import org.testng.xml.Parser;
import org.testng.xml.XmlSuite;
+import org.testng.xml.XmlTest;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -42,114 +41,118 @@
public class TestNGXmlTestSuite
implements SurefireTestSuite
{
- protected File suiteFile;
+ private File suiteFile;
- protected TestNG testRunner;
+ private String testSourceDirectory;
- protected int m_testCount;
+ private XmlSuite suite;
- protected String m_suiteName = "TestNG XML Suite";
+ private Map testSets;
/**
* Creates a testng testset to be configured by the specified
* xml file.
*/
- public TestNGXmlTestSuite( File suiteFile )
+ public TestNGXmlTestSuite( File suiteFile, String testSourceDirectory )
{
this.suiteFile = suiteFile;
- parseSuite();
- }
- public void execute( ReporterManager reportManager, ClassLoader loader )
- {
- testRunner.runSuitesLocally();
+ this.testSourceDirectory = testSourceDirectory;
}
- public void execute( String testSetName, ReporterManager reporterManager, ClassLoader testsClassLoader )
+ public TestNGXmlTestSuite( File suiteFile )
{
- // TODO: if this can't be implemented here, I should have the booter recognise that and prevent it from getting
- // the pertest treatment
+ this( suiteFile, null );
}
- public int getNumTests()
+ public void execute( ReporterManager reporterManager, ClassLoader classLoader )
{
- // TODO
- return 0; //To change body of implemented methods use File | Settings | File Templates.
- }
+ if ( testSets == null )
+ {
+ throw new IllegalStateException( "You must call locateTestSets before calling execute" );
+ }
- public int getNumTestSets()
- {
- // TODO
- return 0; //To change body of implemented methods use File | Settings | File Templates.
+ TestNGExecutor.executeTestNG( this, testSourceDirectory, suite, reporterManager );
}
- public String getName()
+ public void execute( String testSetName, ReporterManager reporterManager, ClassLoader classLoader )
+ throws TestSetFailedException
{
- return m_suiteName;
- }
+ if ( testSets == null )
+ {
+ throw new IllegalStateException( "You must call locateTestSets before calling execute" );
+ }
+ XmlTest testSet = (XmlTest) testSets.get( testSetName );
- public List getSubBatteries()
- {
- return Collections.EMPTY_LIST;
- }
+ if ( testSet == null )
+ {
+ throw new TestSetFailedException( "Unable to find test set '" + testSetName + "' in suite" );
+ }
- public int getTestCount()
- {
- return m_testCount;
+ List originalTests = new ArrayList( suite.getTests() );
+ for ( Iterator i = suite.getTests().iterator(); i.hasNext(); )
+ {
+ XmlTest test = (XmlTest) i.next();
+ if ( !test.getName().equals( testSetName ) )
+ {
+ i.remove();
+ }
+ }
+ TestNGExecutor.executeTestNG( this, testSourceDirectory, suite, reporterManager );
+
+ suite.getTests().clear();
+ suite.getTests().addAll( originalTests );
}
- public void setOutputDirectory( String reportsDirectory )
+ public int getNumTests()
{
- testRunner.setOutputDirectory( reportsDirectory );
+ // TODO: need to get this from TestNG somehow
+ return 1;
}
- public void setReporter( TestNGReporter reporter )
+ public int getNumTestSets()
{
- testRunner.addListener( (ITestListener) reporter );
- testRunner.addListener( (ISuiteListener) reporter );
+ return suite.getTests().size();
}
- /**
- * Instantiates and partially configures testng suite
- */
- private void parseSuite()
+ public Map locateTestSets( ClassLoader classLoader )
+ throws TestSetFailedException
{
- testRunner = new TestNG();
- List suites = new ArrayList();
-
- try
+ if ( testSets != null )
{
- XmlSuite s = new Parser( suiteFile.getAbsolutePath() ).parse();
- m_suiteName = s.getName();
- m_testCount += s.getTests().size();
- suites.add( s );
+ throw new IllegalStateException( "You can't call locateTestSets twice" );
}
- catch ( FileNotFoundException fne )
+ testSets = new LinkedHashMap();
+
+ try
{
- System.err.println( "File not found: " + suiteFile.getAbsolutePath() + " Ignoring." );
+ suite = new Parser( suiteFile.getAbsolutePath() ).parse();
}
catch ( IOException e )
{
- e.printStackTrace();
+ throw new TestSetFailedException( "Error reading test suite", e );
}
catch ( ParserConfigurationException e )
{
- e.printStackTrace();
+ throw new TestSetFailedException( "Error reading test suite", e );
}
catch ( SAXException e )
{
- e.printStackTrace();
+ throw new TestSetFailedException( "Error reading test suite", e );
}
- testRunner.setXmlSuites( suites );
- // TODO: return when TestNG brings it back
-// testRunner.setReportResults(false);
- }
+ for ( Iterator i = suite.getTests().iterator(); i.hasNext(); )
+ {
+ XmlTest xmlTest = (XmlTest) i.next();
- public Map locateTestSets( ClassLoader classLoader )
- {
- // TODO
- return Collections.EMPTY_MAP;
- }
+ if ( testSets.containsKey( xmlTest.getName() ) )
+ {
+ throw new TestSetFailedException( "Duplicate test set '" + xmlTest.getName() + "'" );
+ }
+ // We don't need to put real test sets in here, the key is the important part
+ testSets.put( xmlTest.getName(), xmlTest );
+ }
+ return testSets;
+ }
}