Cách chạy nhiều trường hợp kiểm thử trong TestNG Suite

⚡ Tóm tắt thông minh

Chạy nhiều trường hợp thử nghiệm với TestNG Phòng trong Selenium Cho phép bạn kích hoạt nhiều lớp, gói hoặc bộ kiểm thử con từ một tệp testng.xml duy nhất. Hướng dẫn này bao gồm các luồng song song, hệ thống phân cấp bộ kiểm thử, báo cáo và hỗ trợ AI cho các công cụ kiểm thử hiện đại. TestNG Các dự án 7.x.

  • 🧵 Ren song song: Đặt thread-count và parallel=”tests” để giảm đáng kể thời gian chạy tổng thể trên các trình duyệt và gói.
  • 🗂️ Cấu trúc phân cấp của bộ sản phẩm: Tệp testng.xml cha có thể liệt kê các mục suite-file con để xâu chuỗi nhiều bộ kiểm thử trong một trình kích hoạt duy nhất.
  • ⚙️ TestNG 7.x Sẵn sàng: Các ví dụ phù hợp với TestNG 7.10 và Selenium 4 trình điều khiển W3C, thay thế các trình điều khiển cũ. FirefoxDây dẫn điều khiển.
  • 📊 Báo cáo thông minh: Các mức độ chi tiết từ 1 đến 10 và báo cáo HTML có thể gửi qua email giúp chẩn đoán nhanh chóng các luồng song song bị lỗi.
  • 🤖 Điều phối bằng AI: Các hệ thống lập lịch dựa trên trí tuệ nhân tạo sẽ sắp xếp lại, thử lại và phân chia các bộ tác vụ dựa trên dữ liệu về thời gian và độ trễ trong quá khứ.

Chạy nhiều trường hợp thử nghiệm với TestNG Phòng trong Selenium

TestNG Cho phép bạn chạy các phương thức kiểm thử, lớp và toàn bộ bộ kiểm thử song song trong cùng một dự án. Việc thực thi song song giúp giảm tổng thời gian chạy vì các luồng bắt đầu các bài kiểm thử đồng thời thay vì lần lượt từng luồng một. Hướng dẫn này giải thích cách chạy nhiều lớp (các bộ kiểm thử khác nhau) bằng cách sử dụng TestNG 7.x với Selenium WebDriver.

Bước 1) Tạo một TestNGTệp .xml để thực hiện các bài kiểm tra

Để tạo cấu hình, hãy làm theo các bước bên dưới.

  1. Tạo một dự án mới trong Eclipse.
  2. Tạo hai gói trong dự án (đặt tên cho chúng là...). com.suite1com.suite2).
  3. Tạo một lớp trong mỗi gói (đặt tên cho chúng). Flipkart.javaSnapdeal.java) và sao chép đoạn mã bên dưới vào các lớp tương ứng.
  4. Tạo một tệp mới trong dự án của bạn và đặt tên cho nó. testng.xml. Hãy đảm bảo rằng TestNG Plugin đã được cài đặt (hướng dẫn có sẵn). đâyTệp testng.xml chứa tất cả các cấu hình như tên lớp, tên bài kiểm tra và tên bộ kiểm tra.

Flipkart.java

package com.suite1;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Flipkart {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";

    // This method navigates to the Flipkart URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.flipkart.com");
    }

    // Log in to Flipkart
    @Test
    public void login() {
        driver.findElement(By.partialLinkText("Login")).click();
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-email")).sendKeys(username);
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-pwd")).sendKeys(password);
        driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click();
    }

    // Search for a product
    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3");
        driver.findElement(By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")).click();
        String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.cssSelector(".btn-express-checkout.btn-big.current")).click();
        driver.findElement(By.cssSelector(".remove.fk-inline-block")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.partialLinkText(username));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

    @AfterClass
    public void quit() {
        driver.close();
    }
}

SnapDeal.java

package com.suite2;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SnapDeal {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";
    String pinCode = "";

    // This method navigates to the Snapdeal URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.snapdeal.com");
    }

    @Test
    public void login() {
        driver.findElement(By.xpath("//button[text()='Login']")).click();
        driver.switchTo().frame("loginIframe");
        driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")).click();
        driver.findElement(By.id("j_username")).sendKeys(username);
        driver.findElement(By.id("j_password_login")).sendKeys(password);
        driver.findElement(By.id("signin_submit")).click();
        driver.switchTo().defaultContent();
    }

    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")).sendKeys("iphone 6s");
        driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click();
        String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click();
        driver.findElement(By.id("pincode-check")).sendKeys(pinCode);
        driver.findElement(By.id("buy-button-id")).click();
        driver.findElement(By.cssSelector("i[title='Delete Item']")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        driver.findElement(By.linkText("START SHOPPING NOW")).click();
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user"));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

    @AfterClass
    public void quit() {
        driver.close();
    }
}

TestNG. Xml

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

<suite thread-count="2" verbose="1" name="Gmail Suite" parallel="tests">

  <test name="flipkart">
    <classes>
      <class name="com.suite1.Flipkart"/>
    </classes>
  </test>

  <test name="Myntra">
    <classes>
      <class name="com.suite2.SnapDeal"/>
    </classes>
  </test>
</suite>

Cấu trúc dự án cuối cùng sẽ trông giống như ví dụ bên dưới.

Tạo ra một TestNGTệp .xml để thực hiện kiểm tra

Bước 2) Thực hiện song song trong TestNG

Sau khi lưu tệp XML ở trên, bước tiếp theo là chạy các bài kiểm tra song song. Mã lệnh được hiển thị bên dưới.

Thực thi song song trong TestNG

1) số lượng luồng: Xác định số lượng luồng TestNG Có thể tăng số lượng tiến trình để thực thi song song. Giá trị càng cao thì càng chạy được nhiều bài kiểm tra cùng lúc, tối đa đến giới hạn CPU.

2) dài dòng: Ghi lại chi tiết quá trình thực thi vào bảng điều khiển. Giá trị cho phép nằm trong khoảng từ 1 đến 10. Giá trị càng cao thì nhật ký càng chi tiết và đầy đủ hơn.

3) tên: Tên của phòng suite. Đây là tên phòng:Gmail "Phòng suite".

4) song songKể TestNG Những gì cần chạy đồng thời. Các giá trị hợp lệ là tests, classes, methods hoặc instances. Giá trị mặc định là không ai.

Nhấp chuột phải vào tệp testng.xml và chọn Chạy với quyền > TestNG SuiteSau khi quá trình hoàn tất, bạn sẽ thấy kết quả tổng hợp.

Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau.

Đầu ra:

Thực thi song song trong TestNG

1) Tên của bộ kiểm thử được định nghĩa trong testng.xml.

Thực thi song song trong TestNG

2) Tên của bài kiểm tra được định nghĩa trong testng.xml.

Thực thi song song trong TestNG

3) Tên của lớp được khai báo trong testng.xml.

Thực thi song song trong TestNG

4) Tên phương thức được chú thích bằng @Test trong tệp .java.

Thực thi song song trong TestNG

Quy trình tương tự cũng được áp dụng cho bài kiểm tra SnapDeal, vì vậy cả hai lớp đều được thực thi song song.

Bước 3) Chạy nhiều bộ kiểm thử từ một tệp testng.xml gốc

Một yêu cầu phổ biến trong các dự án lớn là kết nối nhiều tệp testng.xml thành một trình kích hoạt duy nhất. TestNG Phiên bản 7.x hỗ trợ một bộ cha tham chiếu đến các bộ con. tệp bộ các mục, để mỗi tiến trình con có thể giữ số luồng, trình lắng nghe và tham số riêng của mình. Lưu mỗi bộ con riêng biệt, sau đó trỏ tiến trình cha đến đường dẫn của nó. Chỉ chạy tệp của tiến trình cha từ Eclipse, Maven, hoặc dòng lệnh.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Parent Suite" parallel="tests" thread-count="4">
  <suite-files>
    <suite-file path="./flipkart-suite.xml"/>
    <suite-file path="./snapdeal-suite.xml"/>
  </suite-files>
</suite>

Mẫu này giúp tách biệt các bộ kiểm thử hồi quy, kiểm thử khói và kiểm thử cơ bản nhưng vẫn có thể tái sử dụng. Bạn cũng có thể kích hoạt tệp cha từ Maven Surefire bằng cách thiết lập <suiteXmlFile>parent-suite.xml</suiteXmlFile> Bên trong cấu hình plugin, điều này giúp cho bố cục song song tương tự hoạt động trong các quy trình tích hợp liên tục.

Bước 4) Các phương pháp tốt nhất cho xử lý song song TestNG chạy

  • Pin TestNG 7.x: Sử dụng TestNG 7.10 trở lên với Selenium 4. Vì vậy, các trình điều khiển tuân thủ tiêu chuẩn W3C hoạt động nhất quán trên các luồng khác nhau.
  • Tránh chia sẻ trạng thái: Di chuyển webdriver chuyển trường này thành một ThreadLocal để mỗi luồng có phiên làm việc riêng của mình.
  • Điều chỉnh số lượng sợi chỉ: Hãy bắt đầu bằng việc đếm số lõi CPU, sau đó theo dõi báo cáo HTML có thể gửi qua email và tốc độ tải của lưới trước khi tăng số lõi.
  • Phân lập dữ liệu thử nghiệm: Hãy sử dụng tên người dùng, giỏ hàng và mã PIN riêng biệt cho mỗi luồng để tránh xung đột khi đăng nhập.
  • Chụp ảnh màn hình khi xảy ra lỗi: Gắn chúng lại với nhau bằng một ITestListener Để gỡ lỗi các lần chạy song song không ổn định nhanh hơn.
  • Sử dụng trợ lý AI: Công cụ như Testim, mabl và CodiumAI có thể gắn cờ các bài kiểm tra không ổn định và đề xuất các bộ chọn ổn định trước lần chạy tiếp theo.

Kết luận

Ví dụ trên minh họa cách sử dụng TestNG để thực hiện các bài kiểm tra song song. TestNG Phiên bản 7.x cung cấp cho bạn một tệp XML duy nhất để khởi chạy nhiều lớp kiểm thử, liên kết nhiều bộ kiểm thử con và điều chỉnh các luồng song song, do đó, các tệp lớn có kích thước lớn. Selenium Các dự án hoàn thành nhanh hơn nhiều.

Câu Hỏi Thường Gặp

Đặt mỗi lớp vào một phòng riêng. Thêm thẻ `<test>` vào bên trong tệp `testng.xml`, sau đó đặt `parallel=”tests”` và số luồng (thread-count) tối thiểu là 2. TestNG Cả hai bài kiểm tra đều được thực thi trên các luồng riêng biệt, do đó các lớp được thực thi đồng thời chứ không phải tuần tự.

Đúng vậy. Hãy xây dựng một bộ thư mục cha liệt kê các tệp con bên trong. Mỗi đường dẫn tệp bộ phần mềm con chạy cấu hình riêng của nó. Mô hình này hoạt động trong... Eclipse, Maven Surefire, và Gradlevà được hỗ trợ từ TestNG Từ phiên bản 6 trở đi, bao gồm cả phiên bản 7.x hiện tại.

Thuộc tính song song chấp nhận các bài kiểm tra, lớp, phương thức, thể hiện hoặc không có gì. Chọn các bài kiểm tra khi mỗi Thẻ `<tag>` tự chứa, các lớp `<class>` dùng để cách ly toàn bộ lớp, và các phương thức `@Test` khi các phương thức `@Test` riêng lẻ là an toàn cho đa luồng. Giá trị mặc định là `none`, nghĩa là mọi thứ sẽ chạy tuần tự.

Sử dụng ThreadLocal hoặc khởi tạo trình điều khiển bên trong khối `@BeforeMethod` thay vì dưới dạng trường tĩnh. Mỗi luồng sau đó sẽ sở hữu phiên trình duyệt riêng, loại bỏ các điều kiện tranh chấp gây ra lỗi song song. TestNG chạy trên Selenium Lưới.

Các hệ thống điều phối AI nghiên cứu dữ liệu chạy trước đó để dự đoán lỗi, cách ly các bài kiểm tra không ổn định và sắp xếp lại thứ tự các bài kiểm tra chậm. Các nền tảng như Launchable, Testimvà cắm mabl vào TestNG Vì vậy, các bộ kiểm thử có khả năng gặp lỗi cao nhất sẽ được chạy trước, giúp rút ngắn chu kỳ phản hồi trên các máy chủ tích hợp liên tục.

Đúng vậy. Các bộ lập lịch dựa trên AI trong Launchable và BuildPulse đo lường thời lượng thực thi và tỷ lệ lỗi của mỗi bài kiểm tra trong quá khứ, sau đó chia tệp testng.xml thành các phân vùng cân bằng. Mỗi phân vùng chạy trên một tác nhân riêng biệt, do đó tổng thời gian thực thi giảm xuống trong khi mức độ sử dụng song song vẫn cao.

Tóm tắt bài viết này với: