6
votes

I have following testng test methods.

    @Test(groups = {"tsg1.0","smoke"})
public void testLoginWithInvalidCredentials(String usernameValue, String passwordValue){        
    /*Print something*/
}


@Test(groups = {"tsg1.0"})          
public void testLoginWithUserIdOnly(String username) {       
    /*Print something*/
}



@Test(groups = {"tsg1.0"})          
public void testLoginWithPasswordOnly(String password) {         
    /*Print something*/
}

Here is the testng xml used to test the above methods.

<suite name="Suite" thread-count="1" verbose="10"> 
  <test name="Test">
  <groups>
<run>  
 <include name="tsg1.0"/>    
</run>
</groups>
<packages>  
<package name="<test package name>"/>       
 </packages> 
</test>  
</suite>

Is there a way where in I can create one xml which will include tests with Groups "TSG1.0" AND "SMOKE". I want only the first test(testLoginWithInvalidCredentials) to be run in this case.

Please help.

Thanks, Mike.

PS: The following won't work as It will include tsg1.0 or smoke. I want an and condition here...

<run>
<include name="tsg1.0"/>   
<include name="smoke"/>  
</run>
4

4 Answers

5
votes

You can actually do this "semi off the shelf": http://testng.org/doc/documentation-main.html#beanshell

In your particular case, it would be something like this:

<method-selectors>
  <method-selector>
    <script language="beanshell"><![CDATA[
       return groups.containsKey("tsg1.0") && groups.containsKey("smoke");
     ]]></script>
  </method-selector>
</method-selectors>

Just answered a similar question in more detail here: Is it possible to put a condition to TestNG to run the test if that is member of two groups?

3
votes

AFAIK that doesn't come off the shelf in testng. What you can probably do is write your methodinterceptor and return only the list of thsoe methods which fall in both the groups..

You can also get the includedgroups from the testcontext param of the intercept method.

You can refer here for more : http://testng.org/doc/documentation-main.html#methodinterceptors

2
votes

You can have a Group of groups.

Groups can also include other groups. These groups are called "MetaGroups".
For example, you might want to define a group "all" that includes "checkintest" 
and "functest"."functest" itself will contain the groups "windows" and "linux" 
while "checkintest will only contain "windows". 

A property file sample:

<groups>
    <define name="functest">
      <include name="windows"/>
      <include name="linux"/>
    </define>

    <define name="all">
      <include name="functest"/>
      <include name="checkintest"/>
    </define>

    <run>
      <include name="all"/>
    </run>
  </groups>
1
votes

For Multiple TestNG groups execution from cmd you can use following script in your TestNG.xml file.

<method-selectors>
        <method-selector>
            <script language="beanshell"><![CDATA[
            Boolean runTest = false;
            String groupsName = System.getProperty("GROUPS");

            if (groupsName != null && groupsName != ""){
                StringTokenizer groupsTagList = new StringTokenizer(groupsName, ",");
                while (groupsTagList.hasMoreTokens()) {
                    if(groups.containsKey(groupsTagList.nextToken().trim()){
                        runTest = true;
                        break;
                    }
                }
            }else{
                runTest = true;
            } 
            return runTest;
            ]]>
            </script>
        </method-selector>
    </method-selectors>

Execute From Maven:

mvn test -DGROUPS=groups1,groups2,groups3

It will working fine...