While learning TestNG on Udemy, I come across a code that I am unable to understand. The instructor has created a class named “TestBase” where he defined @BeforeMethod/@aftermethod.Later he created another class named “LoginTest” where he wrote the actual test with @test. He extended TestBase class in loginTest to get variable initiated in TestBase class. When he ran loginTest then @BeforeMethod/@aftermethod also ran with this. How did these two methods ran along with @test when these methods are in different classes. here are both codes:
public class TestBase { public static String getURL() { String URL = null; switch (GetProperties.getPropertyValueByKey("env")) { case "qa": URL = GetProperties.getPropertyValueByKey("qaUrl"); break; case "dev": URL = GetProperties.getPropertyValueByKey("devUrl"); break; case "uat": URL = GetProperties.getPropertyValueByKey("uatUrl"); break; case "prod": URL = GetProperties.getPropertyValueByKey("prodUrl"); break; default: LogFactory.info("No env has been set in Properties file"); } return URL; } @BeforeMethod public void setup() { //ToDo: Pass browser value from config.properties WebDriver driver = BrowserFactory.create(GetProperties.getPropertyValueByKey("browser")); DriverFactory.setDriver(driver); driver.manage().window().maximize(); driver.manage().deleteAllCookies(); driver.get(getURL()); driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(Constants.PAGE_LOAD_TIMEOUT)); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(Constants.IMPLICIT_WAIT)); } @AfterMethod public void tearDown() { if (null != DriverFactory.getDriver()) { try { DriverFactory.getDriver().quit(); // quit WebDriver session gracefully DriverFactory.removeDriver(); } catch (Exception e) { System.out.println(e.getMessage()); } } } public class LoginTest extends TestBase { /** * Below Login Test case has hardcoded data being passed from test method itself **/ @Test(description = "Verify agent login with valid credentials") public void loginWithValidCredentials() { LoginPage loginPage = new LoginPage(); DashboardPage dashboardPage = new DashboardPage(); loginPage.loginWithValidUser("xyx@yopmail.com", "Hello1136"); try { Thread.sleep(10000); // Added just for now will remove this in future and will implement proper selenium waits ! } catch (InterruptedException e) { e.printStackTrace(); } Assert.assertEquals(dashboardPage.getDashboardPageURL(), Constants.URL + "/dashboard/"); } }
Advertisement
Answer
If you read this line :
public class LoginTest extends TestBase
this clearly tells that, LoginTest
is a child class of TestBase
.
so TestBase
gets more precedence.
Now let’s understand what is @BeforeMethod
.
@BeforeMethod
The annotated method will be run before each test method.
so this is by default Testng
architecture to run @BeforeMethod
before each @Test
in your test suite.
Your program execution should be in this order :-
@BeforeMethod
then
@Test
then
@AfterMethod
if you have more than one @Test
, the order should be same.
You can refer here and the above reference has been taken from TestNG
official docs.