当执行派生 class 中的测试时,如何执行来自基 class 的 TestNG 注释?
How TestNG annotation from base class is executed when the Test inside the derived class is executed?
在Udemy上学习TestNG时,我遇到了一段我无法理解的代码。讲师创建了一个名为“TestBase”的class,他在其中定义了@BeforeMethod/@aftermethod.Later,他创建了另一个名为“LoginTest”的class,他在其中使用@test 编写了实际测试。他在 loginTest 中扩展了 TestBase class 以获取在 TestBase class 中初始化的变量。当他 运行 loginTest 然后 @BeforeMethod/@aftermethod 也用这个 运行。当这两种方法 运行 和 @test 在不同的 class 中时,它们是如何工作的。这是两个代码:
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/");
}
}
如果你读到这一行:
public class LoginTest extends TestBase
这清楚地表明,LoginTest
是 TestBase
的 child class。
所以 TestBase
获得更多优先权。
现在让我们了解什么是@BeforeMethod
。
@BeforeMethod
The annotated method will be run before each test method.
所以这是默认情况下 Testng
架构到 运行 @BeforeMethod
在每个 @Test
测试套件之前。
您的程序执行应按以下顺序进行:-
@BeforeMethod
然后
@Test
然后
@AfterMethod
如果您有多个@Test
,顺序应该相同。
你可以参考here,以上参考来自TestNG
官方文档
因此 @beforeMethod
和 @AfterMethod
将 运行 在您的实际测试之前和之后,这就是 TESTNG
生命周期的工作方式。
您可以找到更多详细信息here
在Udemy上学习TestNG时,我遇到了一段我无法理解的代码。讲师创建了一个名为“TestBase”的class,他在其中定义了@BeforeMethod/@aftermethod.Later,他创建了另一个名为“LoginTest”的class,他在其中使用@test 编写了实际测试。他在 loginTest 中扩展了 TestBase class 以获取在 TestBase class 中初始化的变量。当他 运行 loginTest 然后 @BeforeMethod/@aftermethod 也用这个 运行。当这两种方法 运行 和 @test 在不同的 class 中时,它们是如何工作的。这是两个代码:
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/");
}
}
如果你读到这一行:
public class LoginTest extends TestBase
这清楚地表明,LoginTest
是 TestBase
的 child class。
所以 TestBase
获得更多优先权。
现在让我们了解什么是@BeforeMethod
。
@BeforeMethod
The annotated method will be run before each test method.
所以这是默认情况下 Testng
架构到 运行 @BeforeMethod
在每个 @Test
测试套件之前。
您的程序执行应按以下顺序进行:-
@BeforeMethod
然后
@Test
然后
@AfterMethod
如果您有多个@Test
,顺序应该相同。
你可以参考here,以上参考来自TestNG
官方文档
因此 @beforeMethod
和 @AfterMethod
将 运行 在您的实际测试之前和之后,这就是 TESTNG
生命周期的工作方式。
您可以找到更多详细信息here