Repository: maven-surefire Updated Branches: refs/heads/SUREFIRE-1452 [created] 946bf1eb8
[SUREFIRE-1452] Support filtering of tests from Base Class (TestNG) Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/946bf1eb Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/946bf1eb Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/946bf1eb Branch: refs/heads/SUREFIRE-1452 Commit: 946bf1eb8d5b56dcd10ec44c463d2f6014d01a95 Parents: cb5173d Author: Krishnan Mahadevan <krishnan.mahadevan1...@gmail.com> Authored: Mon Oct 9 09:35:11 2017 +0530 Committer: Tibor17 <tibordig...@apache.org> Committed: Wed Dec 13 00:34:12 2017 +0100 ---------------------------------------------------------------------- .../surefire/testng/utils/MethodSelector.java | 23 +- .../test/java/testng/utils/BaseClassSample.java | 28 ++ .../java/testng/utils/ChildClassSample.java | 25 ++ .../java/testng/utils/MethodSelectorTest.java | 390 +++++++++++++++++++ 4 files changed, 459 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/946bf1eb/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java b/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java index 2cd2f48..5b70ece 100644 --- a/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java +++ b/surefire-providers/surefire-testng-utils/src/main/java/org/apache/maven/surefire/testng/utils/MethodSelector.java @@ -33,7 +33,7 @@ import org.testng.ITestNGMethod; * @since 2.7.3 */ public class MethodSelector - implements IMethodSelector + implements IMethodSelector { private static volatile TestListResolver testListResolver = null; @@ -46,11 +46,11 @@ public class MethodSelector public boolean includeMethod( IMethodSelectorContext context, ITestNGMethod testngMethod, boolean isTestMethod ) { return testngMethod.isBeforeClassConfiguration() || testngMethod.isBeforeGroupsConfiguration() - || testngMethod.isBeforeMethodConfiguration() || testngMethod.isBeforeSuiteConfiguration() - || testngMethod.isBeforeTestConfiguration() || testngMethod.isAfterClassConfiguration() - || testngMethod.isAfterGroupsConfiguration() || testngMethod.isAfterMethodConfiguration() - || testngMethod.isAfterSuiteConfiguration() || testngMethod.isAfterTestConfiguration() - || shouldRun( testngMethod ); + || testngMethod.isBeforeMethodConfiguration() || testngMethod.isBeforeSuiteConfiguration() + || testngMethod.isBeforeTestConfiguration() || testngMethod.isAfterClassConfiguration() + || testngMethod.isAfterGroupsConfiguration() || testngMethod.isAfterMethodConfiguration() + || testngMethod.isAfterSuiteConfiguration() || testngMethod.isAfterTestConfiguration() + || shouldRun( testngMethod ); } public static void setTestListResolver( TestListResolver testListResolver ) @@ -62,6 +62,15 @@ public class MethodSelector { TestListResolver resolver = testListResolver; boolean hasTestResolver = resolver != null && !resolver.isEmpty(); - return hasTestResolver && resolver.shouldRun( test.getRealClass(), test.getMethodName() ); + if ( hasTestResolver ) + { + boolean resolved = false; + for ( Class<?> clazz = test.getRealClass(); clazz != null && !resolved; clazz = clazz.getSuperclass() ) + { + resolved = resolver.shouldRun( clazz, test.getMethodName() ); + } + return resolved; + } + return false; } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/946bf1eb/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/BaseClassSample.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/BaseClassSample.java b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/BaseClassSample.java new file mode 100644 index 0000000..f8b748e --- /dev/null +++ b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/BaseClassSample.java @@ -0,0 +1,28 @@ +package testng.utils; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +public abstract class BaseClassSample +{ + public void baseClassMethodToBeIncluded() + { + + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/946bf1eb/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/ChildClassSample.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/ChildClassSample.java b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/ChildClassSample.java new file mode 100644 index 0000000..0449a82 --- /dev/null +++ b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/ChildClassSample.java @@ -0,0 +1,25 @@ +package testng.utils; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +public class ChildClassSample + extends BaseClassSample +{ +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/946bf1eb/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/MethodSelectorTest.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/MethodSelectorTest.java b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/MethodSelectorTest.java new file mode 100644 index 0000000..c4bc9cf --- /dev/null +++ b/surefire-providers/surefire-testng-utils/src/test/java/testng/utils/MethodSelectorTest.java @@ -0,0 +1,390 @@ +package testng.utils; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 junit.framework.TestCase; +import org.apache.maven.surefire.testng.utils.MethodSelector; +import org.apache.maven.surefire.testset.TestListResolver; +import org.testng.IClass; +import org.testng.IRetryAnalyzer; +import org.testng.ITestClass; +import org.testng.ITestNGMethod; +import org.testng.internal.DefaultMethodSelectorContext; + +import java.lang.reflect.Method; + +public class MethodSelectorTest + extends TestCase +{ + public void testInclusionOfMethodFromBaseClass() + { + MethodSelector selector = new MethodSelector(); + DefaultMethodSelectorContext context = new DefaultMethodSelectorContext(); + ITestNGMethod testngMethod = new FakeTestNGMethod( ChildClassSample.class, "baseClassMethodToBeIncluded" ); + TestListResolver resolver = + new TestListResolver( BaseClassSample.class.getName() + "#baseClassMethodToBeIncluded" ); + MethodSelector.setTestListResolver( resolver ); + boolean include = selector.includeMethod( context, testngMethod, true ); + assertTrue( include ); + } + + public void testNoInclusionOfMethodFromBaseClass() + { + MethodSelector selector = new MethodSelector(); + DefaultMethodSelectorContext context = new DefaultMethodSelectorContext(); + ITestNGMethod testngMethod = new FakeTestNGMethod( ChildClassSample.class, "baseClassMethodToBeIncluded" ); + TestListResolver resolver = new TestListResolver( BaseClassSample.class.getName() + "#nonExistedMethod" ); + MethodSelector.setTestListResolver( resolver ); + boolean include = selector.includeMethod( context, testngMethod, true ); + assertFalse( include ); + } + + private static class FakeTestNGMethod + implements ITestNGMethod + { + private final Class<?> clazz; + private final String methodName; + + FakeTestNGMethod( Class<?> clazz, String methodName ) + { + this.clazz = clazz; + this.methodName = methodName; + } + + @Override + public Class getRealClass() + { + return clazz; + } + + @Override + public ITestClass getTestClass() + { + return null; + } + + @Override + public void setTestClass( ITestClass iTestClass ) + { + + } + + @Override + public Method getMethod() + { + return null; + } + + @Override + public String getMethodName() + { + return methodName; + } + + @Override + public Object[] getInstances() + { + return new Object[0]; + } + + @Override + public long[] getInstanceHashCodes() + { + return new long[0]; + } + + @Override + public String[] getGroups() + { + return new String[0]; + } + + @Override + public String[] getGroupsDependedUpon() + { + return new String[0]; + } + + @Override + public String getMissingGroup() + { + return null; + } + + @Override + public void setMissingGroup( String s ) + { + + } + + @Override + public String[] getBeforeGroups() + { + return new String[0]; + } + + @Override + public String[] getAfterGroups() + { + return new String[0]; + } + + @Override + public String[] getMethodsDependedUpon() + { + return new String[0]; + } + + @Override + public void addMethodDependedUpon( String s ) + { + + } + + @Override + public boolean isTest() + { + return false; + } + + @Override + public boolean isBeforeMethodConfiguration() + { + return false; + } + + @Override + public boolean isAfterMethodConfiguration() + { + return false; + } + + @Override + public boolean isBeforeClassConfiguration() + { + return false; + } + + @Override + public boolean isAfterClassConfiguration() + { + return false; + } + + @Override + public boolean isBeforeSuiteConfiguration() + { + return false; + } + + @Override + public boolean isAfterSuiteConfiguration() + { + return false; + } + + @Override + public boolean isBeforeTestConfiguration() + { + return false; + } + + @Override + public boolean isAfterTestConfiguration() + { + return false; + } + + @Override + public boolean isBeforeGroupsConfiguration() + { + return false; + } + + @Override + public boolean isAfterGroupsConfiguration() + { + return false; + } + + @Override + public long getTimeOut() + { + return 0; + } + + @Override + public int getInvocationCount() + { + return 0; + } + + @Override + public void setInvocationCount( int i ) + { + + } + + @Override + public int getSuccessPercentage() + { + return 0; + } + + @Override + public String getId() + { + return null; + } + + @Override + public void setId( String s ) + { + + } + + @Override + public long getDate() + { + return 0; + } + + @Override + public void setDate( long l ) + { + + } + + @Override + public boolean canRunFromClass( IClass iClass ) + { + return false; + } + + @Override + public boolean isAlwaysRun() + { + return false; + } + + @Override + public int getThreadPoolSize() + { + return 0; + } + + @Override + public void setThreadPoolSize( int i ) + { + + } + + @Override + public String getDescription() + { + return null; + } + + @Override + public void incrementCurrentInvocationCount() + { + + } + + @Override + public int getCurrentInvocationCount() + { + return 0; + } + + @Override + public void setParameterInvocationCount( int i ) + { + + } + + @Override + public int getParameterInvocationCount() + { + return 0; + } + + @Override + public ITestNGMethod clone() + { + try + { + return ( ITestNGMethod ) super.clone(); + } + catch ( CloneNotSupportedException e ) + { + throw new RuntimeException( e ); + } + } + + @Override + public IRetryAnalyzer getRetryAnalyzer() + { + return null; + } + + @Override + public void setRetryAnalyzer( IRetryAnalyzer iRetryAnalyzer ) + { + + } + + @Override + public boolean skipFailedInvocations() + { + return false; + } + + @Override + public void setSkipFailedInvocations( boolean b ) + { + + } + + @Override + public long getInvocationTimeOut() + { + return 0; + } + + @Override + public boolean ignoreMissingDependencies() + { + return false; + } + + @Override + public void setIgnoreMissingDependencies( boolean b ) + { + + } + + @Override + public int compareTo( Object o ) + { + return 0; + } + } +}