NỘI DUNG BÀI HỌC
✅ Khởi chạy Browser tùy chọn (multi browser) với Parameter trong TestNG
1. Parameters trong TestNG
Mọi người có thể đều biết Parameterization (tham số) trong các hàm auto đã học đã viết trong keyword. Nó cho phép chúng ta tự động chạy một trường hợp thử nghiệm nhiều lần với các giá trị đầu vào và xác nhận khác nhau.
TestNG cho chúng ta một tính năng thú vị khác được gọi là TestNG Parameters. TestNG cho phép bạn chuyển các thông số trực tiếp đến các phương pháp kiểm tra bằng testng.xml của bạn. (file Suite đấy)
Làm thế nào để sử dụng Parameter?
- Đầu tiên là mình khai báo theo cú pháp Parameter của TestNG:
Syntax:
@Parameters ({"paramName1", "paramName2", ...})
Chúng ta đặt nó trên đầu mỗi phương thức cần truyền tham số. Ví dụ:
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class Params
{
@Test
@Parameters({"val1", "val2"})
public void Sum(int v1, int v2) {
int finalSum = v1 + v2;
System.out.println("Kết quả là: " + finalsum);
}
}
Số lượng tham số khai báo trong @Parameters
như nào thì trong mỗi phương thức cần khai báo đủ y vậy.
Lưu ý: Tham số TestNG được chạy qua tệp XML TestNG (file Suite) chứ không phải trực tiếp từ tệp trường hợp thử nghiệm (class).
Khai báo các tham số trong XML TestNG ở cấp độ Test
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNG Parameters Suite">
<test name="Params">
<parameter name="val1" value="2" />
<parameter name="val2" value="3" />
<classes>
<class name="Params" />
</classes>
</test>
</suite>
- name: Tên của biến mà bạn đã khai báo trong tệp trường hợp thử nghiệm như val1 và val2 trong ví dụ trên.
- value: Giá trị của biến bạn muốn chèn.
Kết quả là: 5
Khai báo các tham số trong XML TestNG ở cấp độ Suite
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNG Parameters Suite">
<parameter name="val1" value="3" />
<parameter name="val2" value="50" />
<test name="Params">
<classes>
<class name="Params" />
</classes>
</test>
</suite>
Kết quả là: 53
Và nếu như kết hợp cả 2 thì sao??
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNG Parameters Suite">
<parameter name="val1" value="3" />
<parameter name="val2" value="50" />
<test name="Params">
<parameter name="val1" value="13" />
<parameter name="val2" value="5" />
<classes>
<class name="Params" />
</classes>
</test>
</suite>
Kết quả là: 18
Câu trả lời là TestNG ưu tiên cho các Tham số được xác định ở cấp thử nghiệm (Test) hơn các tham số được đặt ở cấp bộ (Suite).
@Optional trong TestNG
Cái ghi chú này dùng để khai báo giá trị mặc định cho các Parameter nếu như tham số đó không được truyền vào.
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class Params
{
@Test
@Parameters({"val1", "val2"})
public void Sum(@Optional("10") int v1, int v2) {
int finalSum = v1 + v2;
System.out.println("Kết quả là: " + finalsum);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNG Parameters Suite">
<test name="Params">
<parameter name="val2" value="3" />
<classes>
<class name="Params" />
</classes>
</test>
</suite>
Rõ ràng là mình thiếu cái biến "val1" thì nó sẽ hiểu giá trị trong @Optional là 10
Kết quả là: 13
Note: nếu như vừa có @Optional vừa có khai báo tham số bên XML thì nó sẽ ưu tiên hiểu giá trị của Parameter bên XML
2. Thiết kế Multi Browser với Parameter
BaseTest.class
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.*;
public class BaseTest {
public WebDriver driver;
@BeforeMethod
@Parameters({"browser"})
public void createDriver(@Optional("chrome") String browser) {
setupDriver(browser);
}
public WebDriver setupDriver(String browserName) {
switch (browserName.trim().toLowerCase()) {
case "chrome":
driver = initChromeDriver();
break;
case "firefox":
driver = initFirefoxDriver();
break;
case "edge":
driver = initEdgeDriver();
break;
default:
System.out.println("Browser: " + browserName + " is invalid, Launching Chrome as browser of choice...");
driver = initChromeDriver();
}
return driver;
}
private WebDriver initChromeDriver() {
System.out.println("Launching Chrome browser...");
driver = new ChromeDriver();
driver.manage().window().maximize();
return driver;
}
private WebDriver initEdgeDriver() {
System.out.println("Launching Edge browser...");
driver = new EdgeDriver();
driver.manage().window().maximize();
return driver;
}
private WebDriver initFirefoxDriver() {
System.out.println("Launching Firefox browser...");
driver = new FirefoxDriver();
driver.manage().window().maximize();
return driver;
}
@AfterMethod
public void closeDriver() {
if(driver != null) {
driver.quit();
}
}
}
Khai báo bên file Suite XML
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite All" verbose="1">
<test name="Regression Test All">
<parameter name="browser" value="edge"></parameter>
<classes>
<class name="anhtester.com.Bai20_21_ThucHanhPOMPart_1_2.testcases.LoginTest" />
<class name="anhtester.com.Bai20_21_ThucHanhPOMPart_1_2.testcases.DashboardTest" />
</classes>
</test>
</suite>
Nếu chúng ta muốn chạy 2 browser khác nhau cho từng Test trong XML thì như này:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite All" verbose="1">
<test name="Regression Test All">
<parameter name="browser" value="edge"></parameter>
<classes>
<class name="anhtester.com.Bai20_21_ThucHanhPOMPart_1_2.testcases.LoginTest" />
</classes>
</test>
<test name="Regression Test All">
<parameter name="browser" value="chrome"></parameter>
<classes>
<class name="anhtester.com.Bai20_21_ThucHanhPOMPart_1_2.testcases.DashboardTest" />
</classes>
</test>
</suite>