You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Alex Chen <pd...@gmail.com> on 2013/04/07 14:32:42 UTC
'Running a Single Test' feature does not work as expected (for testng provider)
Feature link
http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html
Issue description: Method with @AfterTest annotation are never been called
if use the 'Running a Single Test' feature for testng.
I created a very simple project to reproduce this issue.
https://github.com/pdckxd/test-run-single-case.git
There are two classes in it.
BaseTest # only has one method cleanUp with @AfterTest. it just prints
out a string 'clean up'
MyTest # inherit from BaseTest (cases: testPlus, testSubtract,
testMultiplication)
1).Cmd: mvn test
Result:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Configuring TestNG with: TestNG652Configurator
clean up <==================================== Right @AfterClass method
outputs
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.322 sec
Results :
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]
------------------------------------------------------------------------
[INFO] Total time: 1.662s
[INFO] Finished at: Sun Apr 07 20:21:41 CST 2013
[INFO] Final Memory: 7M/244M
[INFO]
------------------------------------------------------------------------
2).Cmd: mvn test -Dtest=MyTest#testPlus
Result:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running MyTest
Configuring TestNG with: TestNG652Configurator
<==================================== where is 'clean up'
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.292 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]
------------------------------------------------------------------------
[INFO] Total time: 1.641s
[INFO] Finished at: Sun Apr 07 20:25:22 CST 2013
[INFO] Final Memory: 7M/244M
[INFO]
------------------------------------------------------------------------
I find a workaround to resolve this problem. But I don't know how to file
this issue to JIRA issue tracking system so I just attach the patch here.
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 3c06bca..c324744 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
@@ -19,12 +19,14 @@
* under the License.
*/
+import java.lang.reflect.Field;
import java.util.List;
import org.apache.maven.shared.utils.io.SelectorUtils;
import org.testng.IMethodSelector;
import org.testng.IMethodSelectorContext;
import org.testng.ITestNGMethod;
+import org.testng.internal.BaseTestMethod;
/**
* For internal use only
@@ -58,8 +60,29 @@ public boolean includeMethod( IMethodSelectorContext
context, ITestNGMethod test
{
return true;
}
-
- return SelectorUtils.match( METHOD_NAME,
testngMethod.getMethodName() );
+
+ boolean result = SelectorUtils.match( METHOD_NAME,
testngMethod.getMethodName() );
+
+ // fix that methods with @afterClass annotation are never be
invoked if running
+ // specific test cases using the feature of 'run a single test' of
maven-surefire-plugin
+ // mvn -Dtest=TestCircle#mytest test
+
+ if(!result)
+ {
+ Class<BaseTestMethod> clazz = BaseTestMethod.class;
+
+ Field field = null;
+ try {
+ field = clazz.getDeclaredField("m_enabled");
+ field.setAccessible(true);
+ field.set(testngMethod, false);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ field.setAccessible(false);
+ }
+
+ return result;
}
public static void setMethodName( String methodName )
Thanks
Best regards
Alex Chen
Re: 'Running a Single Test' feature does not work as expected (for
testng provider)
Posted by Kristian Rosenvold <kr...@gmail.com>.
Please file an issue at https://jira.codehaus.org/browse/SUREFIRE and
attach your test project and fix there.
Kristian
2013/4/7 Alex Chen <pd...@gmail.com>:
> Feature link
> http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html
>
> Issue description: Method with @AfterTest annotation are never been called
> if use the 'Running a Single Test' feature for testng.
>
> I created a very simple project to reproduce this issue.
> https://github.com/pdckxd/test-run-single-case.git
>
> There are two classes in it.
> BaseTest # only has one method cleanUp with @AfterTest. it just prints
> out a string 'clean up'
> MyTest # inherit from BaseTest (cases: testPlus, testSubtract,
> testMultiplication)
>
> 1).Cmd: mvn test
> Result:
> -------------------------------------------------------
> T E S T S
> -------------------------------------------------------
> Running TestSuite
> Configuring TestNG with: TestNG652Configurator
> clean up <==================================== Right @AfterClass method
> outputs
> Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.322 sec
>
> Results :
>
> Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
>
> [INFO]
> ------------------------------------------------------------------------
> [INFO] BUILD SUCCESS
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Total time: 1.662s
> [INFO] Finished at: Sun Apr 07 20:21:41 CST 2013
> [INFO] Final Memory: 7M/244M
> [INFO]
> ------------------------------------------------------------------------
>
>
> 2).Cmd: mvn test -Dtest=MyTest#testPlus
> Result:
> -------------------------------------------------------
> T E S T S
> -------------------------------------------------------
> Running MyTest
> Configuring TestNG with: TestNG652Configurator
> <==================================== where is 'clean up'
> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.292 sec
>
> Results :
>
> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
>
> [INFO]
> ------------------------------------------------------------------------
> [INFO] BUILD SUCCESS
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Total time: 1.641s
> [INFO] Finished at: Sun Apr 07 20:25:22 CST 2013
> [INFO] Final Memory: 7M/244M
> [INFO]
> ------------------------------------------------------------------------
>
> I find a workaround to resolve this problem. But I don't know how to file
> this issue to JIRA issue tracking system so I just attach the patch here.
>
> 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 3c06bca..c324744 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
> @@ -19,12 +19,14 @@
> * under the License.
> */
>
> +import java.lang.reflect.Field;
> import java.util.List;
> import org.apache.maven.shared.utils.io.SelectorUtils;
>
> import org.testng.IMethodSelector;
> import org.testng.IMethodSelectorContext;
> import org.testng.ITestNGMethod;
> +import org.testng.internal.BaseTestMethod;
>
> /**
> * For internal use only
> @@ -58,8 +60,29 @@ public boolean includeMethod( IMethodSelectorContext
> context, ITestNGMethod test
> {
> return true;
> }
> -
> - return SelectorUtils.match( METHOD_NAME,
> testngMethod.getMethodName() );
> +
> + boolean result = SelectorUtils.match( METHOD_NAME,
> testngMethod.getMethodName() );
> +
> + // fix that methods with @afterClass annotation are never be
> invoked if running
> + // specific test cases using the feature of 'run a single test' of
> maven-surefire-plugin
> + // mvn -Dtest=TestCircle#mytest test
> +
> + if(!result)
> + {
> + Class<BaseTestMethod> clazz = BaseTestMethod.class;
> +
> + Field field = null;
> + try {
> + field = clazz.getDeclaredField("m_enabled");
> + field.setAccessible(true);
> + field.set(testngMethod, false);
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> + field.setAccessible(false);
> + }
> +
> + return result;
> }
>
> public static void setMethodName( String methodName )
>
>
> Thanks
> Best regards
> Alex Chen
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org