ArCiGo
ArCiGo

Reputation: 198

@AfterTest TestNG annotation is not called

I'm doing some tests using Java + TestNG, but I noticed that the tests are not executing the @AfterTest method. The browser remains open when the other tests are running (when it runs the first test, CreateNewUserWithValidData(), this one doesn't call the @AfterTest method, causing that the other tests fail). I need that every test call the @AfterTest method.

My testng.xml file has the following structure:


<suite name="Sample Tests" verbose="1" >
    <listeners>
        <listener class-name="Utilities.Listeners.TestListener"></listener>
        <listener class-name="Utilities.Listeners.AnnotationTransformer"></listener>
    </listeners>

    <test name="Regression" >
        <classes>
            <class name="Tests.AutomationPracticesTests">
                <methods>
                    <include name="CreateNewUserWithValidData" />
                    <include name="LoginWithAValidUser" />
                    <include name="LoginWithAnInvalidUser" />
                </methods>
            </class>
        </classes>
    </test>
</suite>

My BaseTest class looks like this.-

public class BaseTest {

    protected String baseURL;
    protected WebDriver driver;
    protected WebDriverWait wait;
    protected APAuthenticationPage apAuthenticationPage;
    protected APCreateAccountPage apCreateAccountPage;
    protected APHomePage apHomePage;
    protected APMyAccountPage apMyAccountPage;
    protected APShoppingCartAddressesPage apShoppingCartAddressesPage;
    protected APShoppingCartOrderConfirmationPage apShoppingCartOrderConfirmationPage;
    protected APShoppingCartOrderSummaryBankwirePage apShoppingCartOrderSummaryBankwirePage;
    protected APShoppingCartPaymentMethodPage apShoppingCartPaymentMethodPage;
    protected APShoppingCartShippingPage apShoppingCartShippingPage;
    protected APShoppingCartSummaryPage apShoppingCartSummaryPage;

    public WebDriver getDriver() {
        return driver;
    }

    @BeforeTest(alwaysRun = true)
    public void setUp() {
        Log.info("I am in Before Method! Test is starting!");

        driver = WebDriverFactory.getDriver(BrowserType.Chrome);
        wait = new WebDriverWait(driver, 10);
        driver.manage().window().maximize();
    }

    @BeforeMethod
    public void initSetup() {
        String propertiesFile = "data.properties";
        PropertyReader propertyReader = new PropertyReader();
        apAuthenticationPage = new APAuthenticationPage(driver);
        apCreateAccountPage = new APCreateAccountPage(driver);
        apHomePage = new APHomePage(driver);
        apMyAccountPage = new APMyAccountPage(driver);
        apShoppingCartAddressesPage = new APShoppingCartAddressesPage(driver);
        apShoppingCartOrderConfirmationPage = new APShoppingCartOrderConfirmationPage(driver);
        apShoppingCartOrderSummaryBankwirePage = new APShoppingCartOrderSummaryBankwirePage(driver);
        apShoppingCartPaymentMethodPage = new APShoppingCartPaymentMethodPage(driver);
        apShoppingCartShippingPage = new APShoppingCartShippingPage(driver);
        apShoppingCartSummaryPage = new APShoppingCartSummaryPage(driver);

        baseURL = propertyReader.getProperty(propertiesFile, "AUTOMATION_PRACTICE_URL");
    }

    @AfterTest(alwaysRun = true)
    public void tearDown() {
        Log.info("I am in After Method! Test is ending!");

        driver.close();
        driver.quit();
    }
}

And my tests are the following ones.-

public class AutomationPracticesTests extends BaseTest {

    // Properties
    private String emailAddress, password;

    // Tests
    @Test(description = "It creates a new user in the store",
            priority = 1)
    public void CreateNewUserWithValidData(Method method) {
        startTest(method.getName(), "It creates a new user in the store");

        emailAddress = Mocks.personalData().get(0).getEmail();
        password = Mocks.personalData().get(0).getPassword();

        apHomePage.goTo(baseURL);
        apHomePage.clickOnSignInButton();

        apAuthenticationPage.fillCreateAccountForm(emailAddress);
        apAuthenticationPage.clickOnCreateAccountButton();

        apCreateAccountPage.fillRegisterForm(Mocks.personalData());
        apCreateAccountPage.clickOnRegisterButton();

        Assert.assertTrue(apMyAccountPage.isLoaded());
    }

    @Test(description = "It logins successfully in the store with a valid user",
            priority = 2)
    public void LoginWithAValidUser(Method method) {
        apHomePage.goTo(baseURL);
        apHomePage.clickOnSignInButton();

        apAuthenticationPage.fillSignInForm(emailAddress, password);
        apAuthenticationPage.clickOnSignInButton();

        Assert.assertTrue(apMyAccountPage.isLoaded());
    }

    @Test(description = "It throws an error when the user attempts to login with an invalid user",
            priority = 3)
    public void LoginWithAnInvalidUser(Method method) {
        apHomePage.goTo(baseURL);
        apHomePage.clickOnSignInButton();

        apAuthenticationPage.fillSignInForm(Mocks.invalidPersonalData().getEmail(), Mocks.invalidPersonalData().getPassword());
        apAuthenticationPage.clickOnSignInButton();

        Assert.assertEquals("Authentication failed.", apAuthenticationPage.IsErrorBannerDisplayed());
    }
}

I'm suspecting that's something related to the testng.xml file (but, tbh, there are some things that I don't understand about how to configure correctly this file).

I'll appreciate any help to solve my problem. Thanks in advance!

Upvotes: 0

Views: 608

Answers (1)

lucas-nguyen-17
lucas-nguyen-17

Reputation: 5917

It's not a bug. It work as expected.

BeforeTest
BeforeMethod
Method 1: CreateNewUserWithValidData
BeforeMethod
Method 2: LoginWithAValidUser
BeforeMethod
Method 3: LoginWithAnInvalidUser
AfterTest

If you want to close the browser before method 2, then you need to change AfterTest --> AfterMethod, and initialize browser in BeforeMethod

If you just want to change the testng.xml

<test name="test1">
    <classes>
        <class name="Tests.AutomationPracticesTests">
            <methods>
                <include name="CreateNewUserWithValidData"/>
            </methods>
        </class>
    </classes>
</test>
<test name="test2">
    <classes>
        <class name="Tests.AutomationPracticesTests">
            <methods>
                <include name="LoginWithAValidUser"/>
            </methods>
        </class>
    </classes>
</test>
<test name="test3">
    <classes>
        <class name="Tests.AutomationPracticesTests">
            <methods>
                <include name="LoginWithAnInvalidUser"/>
            </methods>
        </class>
    </classes>
</test> 

Upvotes: 1

Related Questions