'Skip tests or classes in TestNG

I want to Skip (so I will see at the report that the tests / classes were skipped) with ITestListener, what I did is the listener class like so:

    @Override
public void onStart(ITestContext context) {
    String deviceName = context.getCurrentXmlTest().getParameter("deviceName");
    System.out.println("device name : "+deviceName);
    String className = context.getClass().getSimpleName();
    System.out.println("class name : "+className);
    if(!deviceName.contains("Galaxy S8")) {
        System.out.println("Skipping class name : "+className);
        throw new SkipException("Skipping class: " + className);
    }
}

and I have test class :

@Test(priority = 1)
public void installAndDenyPhoneAccess() {
    onePlus6ProInstallProcess.denyPhoneAccess();
}

at the testng.xml I added the listener:

    <?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite"  parallel = "tests" 
configfailurepolicy="continue">

<listeners>
    <listener class-name="com.qa.listeners.TestListener" />
</listeners>

<test name="Samsung Note 10 - 5G">
    <listeners>
        <listener class-name="com.qa.listeners.TestListener" />
    </listeners>
    <parameter name="emulator" value="false" />
    <parameter name="platformName" value="Android" />
    <parameter name="udid" value="RPM" />
    <parameter name="deviceName" value="Note 10 - 5G" />
    <parameter name="systemPort" value="10000" />
    <parameter name="chromeDriverPort" value="11000" />
    <classes>
        <class name="note5.Installation"/>
    </classes>
</test>

<test name="Redmi 6A">
    <listeners>
        <listener class-name="com.qa.listeners.TestListener" />
    </listeners>
    <parameter name="emulator" value="false" />
    <parameter name="platformName" value="Android" />
    <parameter name="udid" value="192b" />
    <parameter name="deviceName" value="Redmi 6A" />
    <parameter name="systemPort" value="10000" />
    <parameter name="chromeDriverPort" value="11000" />
    <classes>
        <class name="redmi6A.Installation"/>
    </classes>
</test>

<test name="OnePlus 6 Pro">
    <parameter name="emulator" value="false" />
    <parameter name="platformName" value="Android" />
    <parameter name="udid" value="73" />
    <parameter name="deviceName" value="onePlus 6Pro" />
    <parameter name="systemPort" value="10000" />
    <parameter name="chromeDriverPort" value="11000" />
    <classes>
        <class name="onePlus6Pro.Installation"/>
    </classes>
</test>

<test name="Galaxy S8">
    <parameter name="emulator" value="false" />
    <parameter name="platformName" value="Android" />
    <parameter name="udid" value="ce3cb10c" />
    <parameter name="deviceName" value="Galaxy S8" />
    <parameter name="systemPort" value="10000" />
    <parameter name="chromeDriverPort" value="11000" />
    <classes>
        <class name="galaxyS8.Installation"/>
    </classes>
</test>

<test name="Samsung A21s">
    <listeners>
        <listener class-name="com.qa.listeners.TestListener" />
    </listeners>
    <parameter name="emulator" value="false" />
    <parameter name="platformName" value="Android" />
    <parameter name="udid" value="RdM" />
    <parameter name="deviceName" value="Samsung A21s" />
    <parameter name="systemPort" value="10000" />
    <parameter name="chromeDriverPort" value="11000" />
    <classes>
        <class name="a21S.Installation"/>
    </classes>
</test>

now the tests are not skipped and anyhow not all of them when runing together, only when run two. So how to skip it? and also how to skip the all class if it can?



Solution 1:[1]

IAnnotationTransformer is used to modify the @Test annotation. And there is no option to skip a method using the @Test annotation. In order to forcefully skip it, you need to throw a SkipException.

From the code, it seems that you need to skip the test based on the class name alone and method names are not relevant. So I would suggest the use of ITestListener by overriding the onTestStart method as below:

public class MyTestListener implements ITestListener {
    @Override
    public void onTestStart(ITestResult result) {
        String className = result.getTestClass().getName();
        if(className.contains("abc") || className.contains("xyz")) {
            throw new SkipException("Skipping class: " + className);
        }
    }
}

If you want to do this at the method level, you could use IInvokedMethodListener:

public class MyListener implements IInvokedMethodListener {
    @Override
    public void beforeInvocation(IInvokedMethod method, ITestResult result) {
        Map<String, String> paramMap = method.getTestMethod()
                                             .findMethodParameters(result.getTestContext().getCurrentXmlTest());
        String className = method.getTestMethod().getTestClass().getName();
        if(className.contains(paramMap.get("deviceName"))) {
            throw new SkipException("Skipping class: " + className);
        }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1