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.