Trình nghe TestNG trong Selenium WebDriver với các ví dụ

Có các giao diện khác nhau được cung cấp bởi Java cho phép bạn sửa đổi hành vi TestNG. Các giao diện này còn được gọi là Trình nghe TestNG trong Selenium WebDriver. Trình nghe TestNG cũng cho phép bạn tùy chỉnh nhật ký kiểm tra hoặc báo cáo theo yêu cầu dự án của bạn. Trình nghe TestNG trong Selenium WebDriver là các mô-đun lắng nghe các sự kiện nhất định và theo dõi quá trình thực thi thử nghiệm trong khi thực hiện một số hành động ở mọi giai đoạn thực thi thử nghiệm.
Đây là hướng dẫn về TestNG, nơi tôi sẽ giúp bạn nhận ra các trình nghe TestNG khác nhau bằng các ví dụ để bạn có thể sử dụng chúng thành thạo trong lần tiếp theo bạn dự định làm việc với TestNG và Selenium.
Trình nghe TestNG trong Selenium WebDriver có thể được triển khai ở hai cấp độ:
- Cấp độ lớp: Trong cách này, bạn triển khai các trình nghe cho từng lớp cụ thể, bất kể nó bao gồm bao nhiêu trường hợp kiểm thử.
- Cấp bộ: Trong cách này, bạn triển khai trình lắng nghe cho một bộ cụ thể bao gồm một số lớp trường hợp thử nghiệm.
Các loại Trình nghe TestNG trong Selenium WebDriver
Có rất nhiều trình nghe TestNG trong Selenium WebDriver, một số trong số chúng được cộng đồng thử nghiệm sử dụng rất thường xuyên và một số gần như bị lãng quên. Trong hướng dẫn TestNG này, tôi sẽ trình bày các trình nghe TestNG phổ biến nhất bằng các ví dụ, nhưng trước đó, hãy để tôi lướt nhanh qua các trình nghe TestNG khác nhau trong Selenium WebDriver.
- ITestListener
- IAnnotationTransformer
- IInvokedMethodListener
- ISuiteListener
- IReporter
- IConfigurable
- IExecutionListener
- IHookable
- IMethodInterceptor
- IConfigurationListener
Trình nghe TestNG thường được sử dụng với các ví dụ
Bây giờ, trong hướng dẫn TestNG này, trước tiên chúng ta hãy xem xét các trình nghe TestNG phổ biến và được sử dụng rộng rãi nhất với các ví dụ.
1. ITestListener
ITestListener là trình nghe TestNG được chấp nhận nhiều nhất trong Selenium WebDriver. Nó cung cấp cho bạn một giao diện dễ triển khai thông qua một lớp Java bình thường, nơi lớp này ghi đè mọi phương thức được khai báo bên trong ITestListener. Bằng cách sử dụng trình nghe TestNG này trong Selenium WebDriver, bạn có thể thay đổi hành vi mặc định của thử nghiệm bằng cách thêm các sự kiện khác nhau vào các phương thức. Nó cũng xác định một cách ghi nhật ký hoặc báo cáo mới.
Sau đây là một số phương pháp được cung cấp bởi giao diện này:
onStart: Phương thức này được gọi trước khi bất kỳ phương thức kiểm tra nào được thực thi. Điều này có thể được sử dụng để lấy thư mục từ nơi các bài kiểm tra đang chạy.
onFinish: Phương thức này được gọi sau khi tất cả các phương thức kiểm tra được thực thi. Điều này có thể được sử dụng để lưu trữ thông tin của tất cả các bài kiểm tra đã được chạy.
onTestStart: Phương thức này được gọi trước khi bất kỳ phương thức thử nghiệm nào được gọi. Điều này có thể được sử dụng để chỉ ra rằng phương pháp thử cụ thể đã được bắt đầu.
onTestSkipped: Phương thức này được gọi khi mỗi phương thức thử nghiệm bị bỏ qua. Điều này có thể được sử dụng để chỉ ra rằng phương pháp thử cụ thể đã bị bỏ qua.
onTestSuccess: Phương thức này được gọi khi bất kỳ phương pháp thử nghiệm nào thành công. Điều này có thể được sử dụng để chỉ ra rằng phương pháp kiểm tra cụ thể đã hoàn tất quá trình thực thi thành công.
onTestFailure: Phương thức này được gọi khi bất kỳ phương pháp kiểm tra nào không thành công. Điều này có thể được sử dụng để chỉ ra rằng phương pháp thử cụ thể đã không thành công. Bạn có thể tạo một sự kiện để chụp ảnh màn hình, sự kiện này sẽ hiển thị nơi kiểm tra không thành công.
onTestFailedButWithinSuccessPercentage: Phương thức này được gọi mỗi khi phương pháp thử nghiệm không thành công nhưng nằm trong phần trăm thành công được đề cập. Để triển khai phương pháp này, chúng tôi sử dụng hai thuộc tính làm tham số của chú thích kiểm tra trong TestNG, tức là
successPercentage
vàinvocationCount
. CácsuccessPercentage
mất giá trị của tỷ lệ xét nghiệm thành công vàinvocationCount
biểu thị số lần mà một phương pháp thử nghiệm đặc biệt thực thi. Ví dụ:@Test(successPercentage=60, invocationCount=5)
. Trong chú thích này, tỷ lệ phần trăm thành công là 60% và số lần gọi là 5, có nghĩa là trong số 5 lần, nếu phương pháp kiểm tra được thông qua ít nhất 3 lần (() * 100 = 60), nó sẽ được coi là thông qua.
Đối với mọi phương thức ITestListener, chúng tôi thường truyền các đối số sau:
- Giao diện “ITestResult” cùng với thể hiện của nó, “kết quả”, mô tả kết quả của một bài kiểm tra. Lưu ý: Nếu bạn muốn theo dõi ngoại lệ của mình thông qua ITestResult thì bạn cần tránh xử lý thử / bắt.
- Giao diện “ITestContext” cùng với “ngữ cảnh” thể hiện của nó mô tả ngữ cảnh thử nghiệm chứa tất cả thông tin của quá trình chạy thử nghiệm đã cho.
Bây giờ, trong hướng dẫn TestNG cho người nghe này, chúng ta sẽ lấy một đoạn mã ví dụ cơ bản để chạy bài kiểm tra ở cấp độ lớp học. Nhật ký sẽ được tạo trong bảng điều khiển và nó sẽ giúp bạn hiểu bài kiểm tra nào đã vượt qua, không đạt và bị bỏ qua. Lớp đầu tiên (ListentersBlog.java) sẽ chứa tất cả các phương thức được triển khai bởi giao diện ITestListener:
package TestNgListeners;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class ListenersBlog implements ITestListener {
public void onTestStart(ITestResult result) {
System.out.println("New Test Started" + result.getName());
}
public void onTestSuccess(ITestResult result) {
System.out.println("Test Successfully Finished" + result.getName());
}
public void onTestFailure(ITestResult result) {
System.out.println("Test Failed" + result.getName());
}
public void onTestSkipped(ITestResult result) {
System.out.println("Test Skipped" + result.getName());
}
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println("Test Failed but within success percentage" + result.getName());
}
public void onStart(ITestContext context) {
System.out.println("This is onStart method" + context.getOutputDirectory());
}
public void onFinish(ITestContext context) {
System.out.println("This is onFinish method" + context.getPassedTests());
System.out.println("This is onFinish method" + context.getFailedTests());
}
}
Dưới đây là mã bao gồm các phương pháp kiểm tra (TestNGListariesTest.java). Đảm bảo bạn thêm chú thích Người nghe ngay phía trên tên lớp của bạn để triển khai các phương thức đã thêm ở trên. Cú pháp: @Listeners(PackageName.ClassName.class)
package TestNgListeners;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.SkipException;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import junit.framework.Assert;
@Listeners(TestNgListeners.ListenersBlog.class) public class TestNGListenersTest {
@Test //Passing Test public void sampleTest1() throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lenovo-I7\\Desktop\\Selenium\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.apple.com/");
driver.manage().window().maximize();
driver.findElement(By.xpath("//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]")).click();
Thread.sleep(2000);
driver.findElement(By.cssSelector("#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a")).click();
Thread.sleep(2000);
driver.findElement(By.linkText("Why iPad")).click();
Thread.sleep(2000);
driver.quit();
}
@Test //Failing Test public void sampleTest2() throws InterruptedException {
System.out.println("Forcely Failed Test Method");
Assert.assertTrue(false);
}
private int i = 0;
@Test(successPercentage = 60, invocationCount = 5) //Test Failing But Within Success Percentage public void sampleTest3() { i++;
System.out.println("Test Failed But Within Success Percentage Test Method, invocation count: " + i);
if (i == 1 || i == 2) { System.out.println("sampleTest3 Failed"); Assert.assertEquals(i, 6); } }
@Test //Skipping Test public void sampleTest4() { throw new SkipException("Forcely skipping the sampleTest4"); } }
Màn hình đầu ra của bảng điều khiển: Bây giờ, giả sử bạn có nhiều lớp trong dự án của mình, thì việc thêm Trình nghe TestNG trong Selenium WebDriver vào mỗi lớp có thể là một vấn đề khó khăn. Trong những trường hợp như vậy, bạn có thể tạo một bộ thử nghiệm và thêm thẻ Người nghe vào bộ của mình (tệp XML) thay vì thêm Người nghe vào từng lớp. Đây là mã ví dụ (testng.xml) để chạy thử nghiệm ở cấp bộ:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG Listeners Suite" parallel="false">
<listeners>
<listener class-name="TestNgListeners.ListenersBlog" /> </listeners>
<test name="Test">
<classes>
<class name="TestNgListeners.TestNGListenersTest" /> </classes>
</test>
</suite>
2. IAnnotationTransformer
IAnnotationTransformer là một giao diện cung cấp phương thức “biến đổi” được TestNG gọi ra để sửa đổi hành vi của phương thức chú thích thử nghiệm trong lớp thử nghiệm của chúng tôi. Phương thức biến đổi cung cấp các tham số khác nhau:
- chú thích: Chú thích được đọc từ lớp thử nghiệm.
- testClass: Nếu chú thích được tìm thấy trên một lớp, tham số này sẽ đại diện cho cùng một lớp đó.
- testConstructor: Nếu chú thích tìm thấy một hàm tạo, thì tham số này sẽ đại diện cho cùng một hàm tạo đó.
- testMethod: Nếu chú thích tìm thấy một phương thức, thì tham số này sẽ đại diện cho cùng một phương thức đó.
Lưu ý: Ít nhất một trong các tham số sẽ khác rỗng.
Dưới đây là mã mẫu sẽ được thực thi ở cấp bộ. Trong đoạn mã này, chúng tôi đã sử dụng một tham số ( “alwaysRun = true” ) trong chú thích Kiểm tra của chúng tôi cho biết rằng phương pháp thử nghiệm sẽ luôn chạy ngay cả khi các tham số mà phương thức phụ thuộc vào không thành công. Tuy nhiên, chúng tôi sẽ chuyển đổi hành vi này của phương pháp thử nghiệm của mình thông qua IAnnotationTransformer Listener, điều này sẽ không cho phép phương pháp thử nghiệm cụ thể được thực thi.
Tệp lớp người nghe:
package TestNgListeners;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
public class AnnotationTransformers implements IAnnotationTransformer {
public boolean isTestRunning(ITestAnnotation ins) {
if (ins.getAlwaysRun()) {
return true;
}
return false;
}
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
if (isTestRunning(annotation)) {
annotation.setEnabled(false);
}
}
}
Tệp Lớp Kiểm tra:
package TestNgListeners;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
public class AnnotationTransformerTests {
@Test(alwaysRun = true) public void test1() {
System.out.println("This is my first test whose behaviour would get changed while executing");
}
@Test public void test2() {
System.out.println("This is my second test executing");
}
}
Màn hình đầu ra của bảng điều khiển:
3. IInvokedMethodListener
Giao diện này cho phép bạn thực hiện một số hành động trước và sau khi một phương thức được thực thi. Trình nghe này được gọi cho các phương pháp cấu hình và kiểm tra. Trình nghe TestNG này trong Selenium WebDriver hoạt động giống như ITestListerner và ISuiteListerner. Tuy nhiên, có một sự khác biệt mà bạn cần lưu ý và đó là, trong IInvokedMethodListener, nó thực hiện cuộc gọi trước và sau mỗi phương thức.
Có hai phương pháp được thực hiện:
beforeInvocation(): This method is invoked prior every method.
afterInvocation(): This method is invoked post every method.
Đây là mã mẫu cho trình nghe này, được triển khai ở cấp lớp.
InvokedMethodListeners.java(includes listeners implemented methods) package TestNgListeners;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult;
public class InvokedMethodListeners implements IInvokedMethodListener {
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
System.out.println("Before Invocation of: " + method.getTestMethod().getMethodName() + "of Class:" + testResult.getTestClass());
}
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
System.out.println("After Invocation of: " + method.getTestMethod().getMethodName() + "of Class:" + testResult.getTestClass());
}
}
Tên tệp: InvokedMethodListariesTest.java (bao gồm cấu hình và phương pháp thử nghiệm)
package TestNgListeners;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(value = InvokedMethodListeners.class) public class InvokedMethodListenersTest {
@Test public void test1() {
System.out.println("My first test");
}
@Test public void test2() {
System.out.println("My second test");
}
@BeforeClass public void setUp() {
System.out.println("Before Class method");
}
@AfterClass public void cleanUp() {
System.out.println("After Class method");
}
}
Màn hình đầu ra của bảng điều khiển:
4. ISuiteListener
Trình nghe TestNG này trong Selenium WebDriver được triển khai ở cấp bộ có tên ISuiteListener. Nó có hai phương pháp:
onStart: Phương thức này được gọi trước khi thực thi bộ thử nghiệm.
onFinish: Phương thức này được gọi khi thực thi bộ thử nghiệm.
Trình nghe này về cơ bản lắng nghe các sự kiện đã xảy ra trước và sau khi thực thi bộ. Nếu bộ cha chứa thêm các bộ con thì các bộ con được thực thi trước khi chạy bộ mẹ.
Bước 1: Triển khai ISuiteListener với lớp java bình thường và thêm các phương thức chưa hoàn thành.
Lớp: SuiteListists
package TestNgListeners;
import org.testng.ISuite;
import org.testng.ISuiteListener;
public class SuiteListeners implements ISuiteListener {
public void onStart(ISuite suite) {
System.out.println("Suite executed onStart" + suite.getName());
}
public void onFinish(ISuite suite) {
System.out.println("Suite executed onFinish" + suite.getName());
}
}
Bước 2: Tạo hai lớp thử nghiệm để thêm vào hai bộ con khác nhau.
Lớp 1: SuiteListariesTests1
package TestNgListeners;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
public class SuiteListenersTests1 {
@BeforeSuite public void test1() {
System.out.println("BeforeSuite method in Suite1");
}
@Test public void test2() {
System.out.println("Main Test method 1");
}
@AfterSuite public void test3() {
System.out.println("AfterSuite method in Suite1");
}
}
Lớp 2: SuiteListariesTests2
package TestNgListeners;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
public class SuiteListenersTests2 {
@BeforeSuite public void test1() {
System.out.println("BeforeSuite method in Suite2");
}
@Test public void test2() {
System.out.println("Main Test method 2");
}
@AfterSuite public void test3() {
System.out.println("AfterSuite method in Suite2");
}
}
Bước 3: Thêm các lớp thử nghiệm vào các dãy con.
Bộ 1: Bộ thử nghiệm One.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Test Suite One">
<test name="Test Method1">
<classes>
<class name="TestNgListeners.SuiteListenersTests1" />
</classes>
</test>
</suite>
Bộ 2: Bộ thử nghiệm Two.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Test Suite Two">
<test name="Test Method2">
<classes>
<class name="TestNgListeners.SuiteListenersTests2" />
</classes>
</test>
</suite>
Bước 4: Tạo một tệp xml của bộ gốc sẽ kết hợp 2 bộ đã xác định khác cùng với lớp người nghe.
<?xml version="1.0" encoding="UTF-8"?>
<suite name="suiteListener">
<listeners>
<listener class-name="TestNgListeners.SuiteListeners"></listener>
</listeners>
<suite-files>
<suite-file path="./Suite1.xml"></suite-file>
<suite-file path="./Suite2.xml"></suite-file>
</suite-files>
</suite>
Màn hình đầu ra của bảng điều khiển:
5. IReporter
Trình nghe TestNG này trong Selenium WebDriver cung cấp một giao diện giúp bạn tùy chỉnh báo cáo thử nghiệm được tạo bởi TestNG. Nó cung cấp generateReport
phương thức được gọi sau khi thực thi tất cả các bộ. Phương thức này còn chứa ba tham số:
- xmlSuite: nó cung cấp cho bạn danh sách nhiều bộ được trình bày trong tệp xml testng đang được thực thi.
- suites: Đối tượng này đại diện cho rất nhiều thông tin về các lớp, gói, kết quả thực thi thử nghiệm, cùng với tất cả các phương thức thử nghiệm. Về cơ bản, nó đại diện cho thông tin chi tiết xung quanh bộ sau khi thực hiện cuối cùng.
- outputDirectory: chứa đường dẫn thư mục đầu ra nơi tạo báo cáo.
Dưới đây là ví dụ về trình nghe IReporterer ở cấp bộ.
Tên tệp: ReporterListener.java
package TestNgListener;
import java.util.List;
import java.util.Map;
import org.testng.IReporter;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.xml.XmlSuite;
public class ReporterListener implements IReporter {
public void generateReport(List xmlSuites, List suites, String outputDirectory) {
for (ISuite isuite: suites) {
Map & lt;
string, isuiteresult = "" & gt;
suiteResults = isuite.getResults();
String sn = isuite.getName();
for (ISuiteResult obj: suiteResults.values()) {
ITestContext tc = obj.getTestContext();
System.out.println("Passed Tests of" + sn + "=" + tc.getPassedTests().getAllResults().size());
System.out.println("Failed Tests of" + sn + "=" + tc.getFailedTests().getAllResults().size());
System.out.println("Skipped Tests of" + sn + "=" + tc.getSkippedTests().getAllResults().size());
}
}
}
} & lt;
/string,>
Tên tệp: ReporterTest.java
package TestNgListener;
import org.testng.SkipException;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import junit.framework.Assert;
public class ReporterTest {
@Test public void FirstTest() {
System.out.println("The First Test Method");
Assert.assertTrue(true);
}
@Test public void SecondTest() {
System.out.println("The Second Test Method");
Assert.fail("Failing this test case");
}
@Test public void ThirdTest() {
System.out.println("The Third Test Method");
throw new SkipException("Test Skipped");
}
}
Màn hình đầu ra của bảng điều khiển:
Trình nghe testNG không được sử dụng thường xuyên trong Selenium WebDriver
Trong phần này, tôi sẽ nêu bật những người nghe TestNG không được biết đến nhiều như những người nghe đã thảo luận trong phần trước. Tôi đã tránh trình diễn thực tế của những người nghe TestNG này bằng các ví dụ của họ vì chúng hiếm khi được sử dụng. Tuy nhiên, tôi sẽ giúp bạn hiểu mục đích của họ.
6. IConfigurationListener
Trình nghe TestNG này trong Selenium WebDriver được sử dụng để tạo sự kiện chỉ khi phương thức cấu hình được thông qua, không thành công hoặc bị bỏ qua. Dưới đây là các phương pháp chưa thực hiện được cung cấp bởi trình nghe này:
- onConfigurationSuccess: Nó được gọi khi phương thức cấu hình thành công.
- onConfigurationFailure: Nó được gọi khi phương thức cấu hình không thành công.
- onConfigurationSkip: Như tên cho thấy, khi phương thức cấu hình của bạn bị bỏ qua, nó sẽ gọi
onConfigurationSkip
phương thức.
7. IExecutionListener
Trình nghe này được sử dụng để theo dõi thời điểm bắt đầu và kết thúc quá trình chạy thử nghiệm hoặc bộ phần mềm. Nó cung cấp hai phương pháp:
onExecutionStart: Nó được gọi trước khi bộ hoặc thử nghiệm bắt đầu chạy.
onExecutionFinish: Nó được gọi sau khi bộ hoặc thử nghiệm được thực thi.
Lưu ý: Trình nghe này không thể ngăn chặn việc thực thi mà chỉ có thể tạo sự kiện theo một cách nào đó. Ngoài ra, bạn có thể cung cấp nhiều hơn một trình nghe “IExecution” khi bạn định cấu hình TestNG.
8. IHookable
Giao diện này bỏ qua việc gọi các phương thức thử nghiệm và cung cấp một phương thức chạy được gọi thay vì mỗi @Test
phương thức được tìm thấy. Phương thức kiểm tra sau đó được gọi khi callBack()
phương thức của tham số IHookCallBack được gọi.
Trình nghe IHookable được sử dụng khi bạn muốn thực hiện kiểm tra trên các lớp yêu cầu xác thực JAAS. Điều này có thể được sử dụng để đặt quyền, nghĩa là phương pháp thử nghiệm sẽ chạy cho ai và khi nào phương pháp thử nghiệm nên được bỏ qua.
9. IMethodInterceptor
Phương pháp này được sử dụng:
để trả về danh sách IMethodInstance, sau khi thực thi TestNG.
để sắp xếp danh sách các phương pháp kiểm tra.
TestNG thực thi các phương pháp kiểm tra theo cùng một thứ tự được xác định trong giá trị trả về. Giao diện IMethodInterceptor chỉ bao gồm một phương thức để triển khai “intercept”, trả về danh sách các phương pháp kiểm tra đã sửa đổi.
Ví dụ: Một trong những phương pháp kiểm tra SampleTestOne là kiểm tra các bản ghi, vì vậy chúng tôi đã nhóm nó trong “LogCheck”.
Bây giờ, giả sử chúng ta chỉ muốn chạy các bài kiểm tra được nhóm LogCheck chứ không phải các bài kiểm tra khác, vì vậy, chúng ta phải cung cấp trình nghe IMethodInterceptor có thể loại bỏ các bài kiểm tra khác và chỉ trả lại các bài kiểm tra được nhóm LogCheck.
10. IConfigurable
Trình nghe ICongurable hơi giống với trình nghe IHookable. Giao diện này bỏ qua việc gọi các phương thức kiểm tra và cung cấp một phương thức chạy được gọi thay vì mỗi phương thức cấu hình được tìm thấy. Phương thức cấu hình sau đó được gọi khi callBack()
phương thức của tham số IConfigureCallBack được gọi.
Bạn sử dụng trình nghe TestNG nào trong Selenium WebDriver nhiều nhất?
Tôi hy vọng hướng dẫn TestNG này đã giúp bạn nhận ra trình nghe TestNG nào phù hợp nhất cho các yêu cầu của dự án của bạn. Về trình nghe TestNG hiếm khi được sử dụng, nếu có bất kỳ trình nghe TestNG cụ thể nào trong Selenium mà bạn thấy rất hữu ích, hãy chia sẻ chúng trong phần nhận xét bên dưới. Ngoài ra, nếu bạn có bất kỳ câu hỏi nào liên quan đến bài viết, hãy cho tôi biết. Tôi rất mong phản hồi từ bạn. Chúc bạn thử nghiệm vui vẻ!
Có thể bạn quan tâm
