NỘI DUNG BÀI HỌC

Khởi chạy Browser tùy chọn (multi browser) với Parameters 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

package anhtester.com.common;

import io.github.bonigarcia.wdm.WebDriverManager;
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 static WebDriver driver;

    @BeforeMethod
    @Parameters({"browser"})
    public static void createDriver(@Optional("chrome") String browser) {
        setupDriver(browser);
    }

    public static 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 static WebDriver initChromeDriver() {
        System.out.println("Launching Chrome browser...");
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        return driver;
    }

    private static WebDriver initEdgeDriver() {
        System.out.println("Launching Edge browser...");
        WebDriverManager.edgedriver().setup();
        driver = new EdgeDriver();
        driver.manage().window().maximize();
        return driver;
    }

    private static WebDriver initFirefoxDriver() {
        System.out.println("Launching Firefox browser...");
        WebDriverManager.firefoxdriver().setup();
        driver = new FirefoxDriver();
        driver.manage().window().maximize();
        return driver;
    }

    @AfterMethod
    public static void closeDriver() {
        //driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(0)); //Reset timeout
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        if(driver != null) {
            driver.quit();
        }
    }

}


Khai báo bên 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>


Gọi lại ở nơi khác trong class nào đó

driver = BaseTest.setupDriver("edge");

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học