NỘI DUNG BÀI HỌC

✅ Chạy test cases song song với Parallel Execution trong TestNG

1. Thử nghiệm song song là gì và Tại sao nó lại quan trọng?

Thử nghiệm song song hoặc thực thi song song (Parallel Execution) là một quá trình khởi chạy trường hợp thử nghiệm một cách song song chứ không phải chạy tuần tự từng test caseTrong thử nghiệm song song, nhiều phần ( hoặc mô-đun ) của chương trình thực thi cùng nhau, tiết kiệm rất nhiều thời gian và công sức cho người thử nghiệm.

Các chức năng của hệ điều hành thực hiện điều này, nhưng với tư cách là người dùng, chúng ta cần kích hoạt thực thi song song thông qua TestNG.
Ví dụ: bạn có thể nghĩ đến việc có phần mềm với hai phiên bản khác nhau và chạy chúng song song với sự trợ giúp của TestNG. Thực hiện song song sẽ cho chúng ta ý tưởng chính xác về sự ổn định và hiệu suất của phần mềm nhanh hơn nhiều so với chạy nối tiếp.

Thử nghiệm song song được sử dụng nhiều với Selenium vì tầm quan trọng của thử nghiệm trên nhiều trình duyệt trên thị trường ngày nay. Nếu chúng ta có quá nhiều trình duyệt với một phiên bản khác nhau, chúng ta có thể tạo ma trận trình duyệt và chạy thử nghiệm song song, tiết kiệm rất nhiều tài nguyên chẳng hạn như thời gian.

 

✅ Ưu điểm của Thử nghiệm Song song

Nếu chúng ta nhìn vào bức tranh lớn hơn (tổng quát, bao phủ) thì thử nghiệm song song có những ưu điểm sau:

  • Giảm thời gian: Chạy các bài kiểm tra song song làm giảm thời gian thực hiện tổng thể .
  • Cho phép kiểm tra đa luồng: Sử dụng thực thi song song trong TestNG, chúng ta có thể cho phép nhiều luồng chạy đồng thời trên trường hợp thử nghiệm, cung cấp sự độc lập trong việc thực thi các thành phần khác nhau của phần mềm. Nghĩa là chúng ta chạy 2 module lớn trong hệ thống song song nhau nếu nó độc lập không liên quan ràng buộc nhau nhiều.

❌ Nhược điểm của Thử nghiệm Song song

Với 2 ưu điểm chính như trên thì thử nghiệm song song trong TestNG cũng có một số nhược điểm như sau:

  • Lỗi trên mô-đun phụ thuộc: Kiểm tra song song cho phép chạy đồng thời các mô-đun độc lập. Do đó, chúng ta không thể tiếp tục với các mô-đun phụ thuộc vào nhau và điều này xảy ra khá thường xuyên trong khi thử nghiệm. Vì vậy, chúng ta chạy nối tiếp hoặc tuần tự, điều này tốn thêm thời gian và công sức.
  • Kiến thức về Luồng chương trình: Người thử nghiệm phải thông thạo luồng chương trình để tạo các mô-đun thử nghiệm song song. Một chút phụ thuộc lẫn nhau có thể làm giảm toàn bộ quá trình thực thi trường hợp thử nghiệm. Người kiểm tra cũng nên biết mô-đun nào sẽ chạy trong nhiều luồng và mô-đun nào chạy trong cùng một luồng, v.v.

Thử nghiệm song song trong TestNG bằng cách sử dụng Selenium giúp chúng ta cung cấp các dự án với tốc độ nhanh hơn trong môi trường làm việc phân phối nhanh và liên tục.

Trước khi xem xét quy trình cách thực hiện song song các bài kiểm tra trong TestNG, chúng ta hãy xem các khu vực khác nhau bên trong mã mà chúng ta có thể song song hóa trong TestNG là gì.

 

2. Chúng ta có thể áp dụng thực thi Thử nghiệm song song trong TestNG ở những vị trí nào?

Trước khi bắt tay vào code thì chúng ta hãy tìm hiểu xem "Chúng ta có thể áp dụng thử nghiệm song song trong TestNG ở đnhững vị trí nào? ". TestNG cũng có các quy tắc của nó. Mặc dù khi nghe qua mình có thể hiểu rằng là thử nghiệm song song phải được sử dụng với các phương pháp trường hợp thử nghiệm (@Test) đúng không. Yeah đúng vậy nhưng còn hơn thế nữa, để chạy chúng song song TestNG cung cấp thêm ba vị trí mà chúng ta có thể chạy thử nghiệm song song:

[Selenium Java] Bài 25: Chạy test case song song với Parallel Execution trong TestNG | Anh Tester

  • Tests: chạy song song tất cả các thẻ <test> trong <suite> chỉ định đó. Chổ này thì các bạn chú ý là suite chứa test vì thế muốn chạy song song thẻ test phải để từ khoá "parallel" ở trên thẻ suite nhé. Chứ mình muốn chạy song song các thẻ test mà lại chỉ định ở 1 thẻ test cụ thể thì lấy gì nó hiểu ở các thẻ test khác đúng không. Cho nên để ở thẻ suite.
  • Classes: chạy song song các class chỉ định hoặc nằm trong package chỉ định. Khi đó mình sẽ chỉ định nhiều class hoặc 1 package chứa nhiều class để nó mới hiểu các class trong đó chứ nếu chỉ định 1 class cụ thể thì lấy gì chạy song song nhiều class được đúng ko =))
  • Methods: nó sẽ chạy các bài kiểm tra song song trên tất cả các @Test trong class chỉ định bên trong file Suite.xml.
  • Instances: Giá trị này sẽ chạy song song tất cả các trường hợp thử nghiệm bên trong cùng một trường hợp. (cái này ít dùng hoặc không dùng)


Từ khoá "parallel" là gì thì xuống dưới tới liền. An thị phạm cho các bạn rõ hơn 👌

Ok chúng ta hiện đã sẵn sàng chạy song song trường hợp thử nghiệm đầu tiên của mình trong TestNG bằng cách sử dụng Selenium Maven project nhé.

 

3. Làm thế nào để thực hiện Song song trong TestNG?

Thực hiện kiểm tra song song trong TestNG thì chúng ta sẽ chạy ở file Suite XML với sự trợ giúp của từ khóa "parallel". Trong từ khoá này, chúng ta có thể gán bất kỳ giá trị nào trong số 4 giá trị được thảo luận ở trên. Chúng ta sẽ xem xét từng cái một trong phần này.

Chú ý: chúng ta có thể đặt từ khoá "parallel" đó ở thẻ suite hoặc thẻ test tuỳ vào mong muốn của mình khi nắm được ý nghĩa của nó. Và ý nghĩa của từng chổ đặt hay từng giá trị thì tiếp phần bên dưới An chia ra nè.

 

✅ Chạy song song các phương thức kiểm tra trong TestNG (Methods)

Đoạn mã sau sẽ khởi tạo song song các @Test bên trong class chỉ định trong file Suite XML.

Chổ này bạn tạo 1 class để chạy test tên ParallelTest (tên gì cũng được) và khởi tạo 2 @Test của TestNG. Nội dung là khởi chạy 2 loại trình duyệt thủ công.

package anhtester.com.LearnParallel;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
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.Test;

import java.time.Duration;

public class ParallelTest {

    @Test
    public void FirefoxTest() throws InterruptedException {
        WebDriverManager.firefoxdriver().setup();
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("https://anhtester.com");
        Thread.sleep(2000);
        driver.findElement(By.xpath("//h3[normalize-space()='Website Testing']")).click();
        driver.quit();
    }

    @Test
    public void EdgeTest() throws InterruptedException {
        WebDriverManager.edgedriver().setup();
        WebDriver driver = new EdgeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("https://anhtester.com");
        Thread.sleep(2000);
        driver.findElement(By.xpath("//h3[normalize-space()='Website Testing']")).click();
        driver.quit();
    }

    @Test
    public void ChromeTest() throws InterruptedException {
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get("https://anhtester.com");
        Thread.sleep(2000);
        driver.findElement(By.xpath("//h3[normalize-space()='API Testing']")).click();
        driver.quit();
    }
}


Tiếp theo bên phần file Suite XML chúng ta tạo 1 file XML có tên gì cũng được. Ví dụ là ParallelSuite như mẫu. Nhớ chèn package path cho đúng khi có tạo package trung gian gì đó. An thì tạo package là anhtester.com.LearnParallel

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Parallel Suite All" verbose="1">

    <test name="Regression Test Parallel" parallel="methods">
        <classes>
            <class name="anhtester.com.LearnParallel.ParallelTest"/>
        </classes>
    </test>

</suite>


Rồi các chú ý như lý thuyết mình nói là từ khoá "parallel" mình để trong thẻ <test> hoặc thẻ <suite> . Và mình chọn giá trị là "methods" thì nó sẽ hiểu là chạy song song tất cả các phương thức test trong class chỉ định hay hiểu nôm na là song song các @Test đó.

🔆 Chú ý:
- Nếu các bạn để từ khoá parallel ở thẻ suite thì nó sẽ hiểu là song song cho tất cả các thẻ test
- Còn nếu để từ khoá parallel trong thẻ test cụ thể thì nó sẽ hiểu chỉ song song cho chính nội dung trong thẻ test đó thôi

Từ đó suy ra chúng ta sẽ thiết kế cách chạy tuỳ ý như mong muốn. Yeah An sẽ làm mẫu tiếp tất cả các dạng để các bạn nắm rõ hơn.

Kết quả cho lần chạy như sau:

[Selenium Java] Bài 25: Chạy test case song song với Parallel Execution trong TestNG | Anh Tester

Nó khởi chạy song song các @Test trong class ParallelTest như chỉ định. Thấy rõ ràng là nó sẽ mở 2 loại trình duyệt 1 lượt nhen. Không như vậy là sai rồi đó =))


✅ Chạy song song các lớp kiểm tra trong TestNG (Class)

Như An đã đề cập, chúng ta cũng có thể chạy các phương thức của các lớp khác nhau và thực hiện một cách song song các class chứ không phải tuần tự từng class.

Để làm mẫu chúng ta sẽ khai báo hai lớp là ChromeTest.java và EdgeTest.java như mẫu bên dưới.

🔆 Class ChromeTest thiết kế mẫu như sau:

package anhtester.com.LearnParallel;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.time.Duration;

public class ChromeTest {

    private WebDriver driver;

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("Initilizing the Google Chrome Driver");
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
    }

    @Test
    public void ChromeTestMethod() {
        //Initialize the chrome driver
        System.out.println("The thread ID for Chrome is " + Thread.currentThread().getId());
        driver.get("https://anhtester.com");
        driver.findElement(By.xpath("//h3[normalize-space()='Website Testing']")).click();
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("Quit the browser ");
        driver.quit();
    }
}


🔆 Class EdgeTest thiết kế mẫu như sau:

package anhtester.com.LearnParallel;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.time.Duration;

public class EdgeTest {

    private WebDriver driver;

    @BeforeMethod
    public void beforeMethod() {
        System.out.println("Initilizing the Microsoft Edge driver");
        WebDriverManager.edgedriver().setup();
        driver = new EdgeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
    }

    @Test
    public void EdgeTestMethod() {
        //Initialize the Edge driver
        System.out.println("The thread ID for Edge is " + Thread.currentThread().getId());
        driver.get("https://anhtester.com");
        driver.findElement(By.xpath("//h3[normalize-space()='API Testing']")).click();
    }

    @AfterMethod
    public void afterMethod() {
        System.out.println("Quit the browser ");
        driver.quit();
    }

}


🔆 Thiết kế lại file Suite XML như sau:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Parallel Suite All" verbose="1">

    <test name="Parallel class" parallel="classes">
        <classes>
            <class name="anhtester.com.LearnParallel.ChromeTest"/>
            <class name="anhtester.com.LearnParallel.EdgeTest"/>
        </classes>
    </test>

</suite>


🔆 Kết quả sau khi chạy:

[Selenium Java] Bài 25: Chạy test case song song với Parallel Execution trong TestNG | Anh Tester

Chổ này thì các bạn chú ý từ khoá parallel="classes" chứ không phải "methods" như trên nữa. Đó là mấu chốt đó.

Rồi để nhìn thấy được song song class thì ít nhất chúng ta cần có từ 2 class trở lên chứ chỉ 1 class thì sao thấy được đúng ko =))

Để ý thêm là nó chỉ chạy tuần tự @Test bên trong các Class chạy song song đó chứ không phải chạy song song luôn cả @Test bên trong. Chú ý đó nhen.

Muốn chạy được cả song song Class rồi song song @Test bên trong luôn thì xuống dưới An chỉ tiếp cho hehe.

À cái chổ Thread ID thì An in ra để các bạn thấy được là máy nó quản lý các luồng chạy như thế nào. Nghĩa là nó sẽ có mã định danh không bị trùng nhau. Để phân biệt phiên làm việc cho từng session của driver khi mà mình khởi tạo. Chứ không làm rõ là nó đụng độ driver thì đâu biết được đâuu là Chrome đâu là Edge đúng không.

✅ Chạy song song module thử nghiệm trong Suite XML TestNG (thẻ test trong XML)

Với giá trị của tham số song song được thay đổi thành parallel="tests", chúng ta có thể chạy song song tất cả các kiểm tra có sẵn bên trong Suite. Nhưng hãy nhớ đặt name không trùng nhau để hệ thống nó tạo luồng không bị trùng, trùng name báo lỗi á nhen.

Chúng ta sử dụng lại 2 class ChromeTestEdgeTest nhen

🔆 Thiết kế lại Suite XML như sau:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Parallel Suite All" verbose="1" parallel="tests">

    <test name="Parallel test Chrome">
        <classes>
            <class name="anhtester.com.LearnParallel.ChromeTest"/>
        </classes>
    </test>

    <test name="Parallel test Edge">
        <classes>
            <class name="anhtester.com.LearnParallel.EdgeTest"/>
        </classes>
    </test>

</suite>


Các bạn chú ý lúc bấy giờ chúng ta để từ khoá parallel="tests" trên thẻ suite chứ không đặt dưới thẻ test nữa. Vì chúng ta cần song song thẻ test nên nếu đặt chính thẻ test thì nó không còn đúng ý nghĩa 😜

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