Question

I am using TestNG and Maven with surefire plugin to run tests. I have:

@Test(groups={"groupA"})
TestA{}

@Test
TestB

I would like to have possibility to run:

mvn test 

should invoke all test without any group

mvn test -Dgroups=groupA

should invoke only groupA tests ( this works by default but just added here to have it working with previous option )

I tried to configure surefire like:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.16</version>
 <configuration>
   <excludedGroups>groupA</excludedGroups>
 </configuration>
</plugin>

mvn test works as expected, but after
mvn test -Dgroups=groupA no tests are executed

Edit

I found solution here: https://labs.consol.de/blog/maven/citrus-and-testng-groups/

<!-- TestNG groups -->
<testGroups></testGroups>
<testGroupsExcluded>groupA</testGroupsExcluded>
<!-- /TestNG groups-->
...
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.16</version>
  <configuration>
    <groups>${testGroups}</groups>
    <excludedGroups>${testGroupsExcluded}</excludedGroups>
  </configuration>
</plugin>
...

<profiles>
  <profile>
    <id>a-testes</id>
    <properties>
      <testGroups>a</testGroups>
      <testGroupsExcluded></testGroupsExcluded>
    </properties>
  </profile>
</profiles>

But there is one problem with this solution. It works fine when we want run just always one groups of tests, for example mvn test -P a-tests, but when we will add another group, let's say b-tests, then after mvn test -P a-tests, b-tests only one group will be executed because last defined profile will overide properties... Any ideas how to combine testGroupsExcluded, testGroups properties from multiple profiles?

Edit 2

I just ended with solution

 <properties>
   <testGroups>unit</testGroups>
 </properties>
 ...
 <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.16</version>
   <configuration>
     <groups>${testGroups}</groups>
   </configuration>
 </plugin>

But I had to assign all my tests explicitly to groups (all unassigned tests now are 'unit'), but now I can call:

mvn test To invoke all tests marked as unit

mvn test -DtestGroups=groupA, groupB To invoke any group tests...

Was it helpful?

Solution

Dude, have you checked http://testng.org/doc/documentation-main.html#beanshell ?

In surefire plugin attach testng suit config:

<configuration>
    <suiteXmlFiles>
        <suiteXmlFile>testng.xml</suiteXmlFile>
    </suiteXmlFiles>
...

in testng.xml

<suite name="Emap test suite">
<test name="Emap tests">
    <method-selectors>
        <method-selector>
            <script language="beanshell"><![CDATA[        
            addClassPath("target/test-classes" );      
            return com.yourpackage.shouldExecuteTest(groups, System.getProperty("groups"));         
            ]]>

In static Java method shouldExecuteTest you can implement any rule you want!

Accoriding to doc, you can use those vars:

java.lang.reflect.Method method:  the current test method.
org.testng.ITestNGMethod testngMethod:  the description of the current test method
java.util.Map<String, String> groups:  a map of the groups the current test method belongs to.

System.getProperty("groups") is just -Dgroups=xxx passed from mvn invocation.

Works like a charm!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top