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