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.

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.
- Tạo một dự án mới trong Eclipse.
- Tạo hai gói trong dự án (đặt tên cho chúng là...). com.suite1 và com.suite2).
- Tạo một lớp trong mỗi gói (đặt tên cho chúng). Flipkart.java và Snapdeal.java) và sao chép đoạn mã bên dưới vào các lớp tương ứng.
- 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.
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.
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:
1) Tên của bộ kiểm thử được định nghĩa trong testng.xml.
2) Tên của bài kiểm tra được định nghĩa trong testng.xml.
3) Tên của lớp được khai báo trong testng.xml.
4) Tên phương thức được chú thích bằng @Test trong tệp .java.
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.




