HIện nay có rất nhiều loại repport được sử dụng với Selenium như Allure Report, TestNG Report… Trong bài này, tôi sẽ giới thiệu với các bạn cách để tạo report sử dụng Extend Reports với TestNG trong Selenium.
Chúng ta sẽ sử dụng TestNG listeners và IRetryAnalyzer interface, Extent Reports 5 classes để tạo ra các report rõ ràng, đẹp và hữu ích.
Trước khi bắt đầu bài này, tôi đề xuất các bạn nên xem qua bài “PageObjectModel with JAVA” trước. Trong bài đó, tôi đã hướng dẫn cách tạo Automation test sử dụng Selenium WebDriver như sau:
- Java Maven Project
- Page Object Model design pattern
- TestNG Test Automation Framework
Ok, chúng ta bắt đầu làm từng bước nhé!
Sơ lược về TestNG listeners, IRetryAnalyze và Extend Report
Listener trong TestNG là gì?
Listener trong TestNG là một interface cho phép chỉnh sửa những hành vi mặc định của TestNG. Nó lắng nghe (listen) các sự kiện được xác định trong Selenium Script hàng xử theo. Nó cho phép tùy chỉnh các report hoặc các bản ghi log. Có nhiều loại Listeners có sẵn mà cho phép chúng ta ta thay đổi hành vi là:
- IAnnotationTransformer ,
- IAnnotationTransformer2 ,
- IConfigurable ,
- IConfigurationListener ,
- IExecutionListener,
- IHookable ,
- IInvokedMethodListener ,
- IInvokedMethodListener2 ,
- IMethodInterceptor ,
- IReporter,
- ISuiteListener,
- ITestListener
- IRetryAnalyze
TestNG IRetryAnalyze
TestNG IRetryAnalyze là một giải pháp giúp cho việc chạy lại (rerun) các kiểm thử không thành công (Test failed) trong một khoản thời gian nhất định trước khi gửi kết quả kiểm thử.
Cấu trúc của Extent Reports Project
Chúng ta sẽ thêm 2 packages extentreports và listener packages vào “Utils package”
Trong extentreports package sẽ tạo 2 lớp (class) Extent Reports custom như sau:
- ExtentManager
- ExtentTestManager
Trong listener package sẽ tạo 3 lớp (class) như sau:
- AnnotationTransformer
- Retry
- TestListener
Step-1: Thêm Extent Reports Maven Dependency
Thêm Extent Report dependency vào pom.xml file. (Tôi đã sử dụng latest version 5.0.9 khi viết bài này, Bạn có thể tìm latest version tại đây nhé https://mvnrepository.com/artifact/com.aventstack/extentreports )
<!-- https://mvnrepository.com/artifact/com.aventstack/extentreports --> <dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>5.0.9</version> </dependency> <dependency> <groupId>tech.grasshopper</groupId> <artifactId>htmlextentreporter</artifactId> <version>1.0.0</version> </dependency>
Step 2- ExtentReports Classes
ExtentManager Class:
Trong lớp này, chúng ta sẽ tạo object ExtentReports và nó sẽ được truy cập thông qua method createExtentReports()
- Để setup các thông số của report, chúng ta có thể sử dụng method setSystemInfo();
- Bạn cũng cần lưu ý setup tên report và nơi sẽ chứa Extent Report vừa được tạo ra.
ExtentSparkReporter reporter = new ExtentSparkReporter("./extent-reports/extent-report.html");
- Để setup các thông số của report, chúng ta có thể sử dụng method setSystemInfo();
package Utils.extentreports; import com.aventstack.extentreports.ExtentReports; import com.aventstack.extentreports.reporter.ExtentSparkReporter; public class ExtentManager { public static final ExtentReports extentReports = new ExtentReports(); public synchronized static ExtentReports createExtentReports() { ExtentSparkReporter reporter = new ExtentSparkReporter("./extent-reports/extent-report.html"); reporter.config().setReportName("Extent Report"); extentReports.attachReporter(reporter); extentReports.setSystemInfo("Project", "Selenium Automation Test"); extentReports.setSystemInfo("Author", "Huyen Tran"); return extentReports; } }
ExtentTestManager Class:
- Khởi tạo extentTestMap map để chứa thông tin của thread ids và ExtentTest instances.
- ExtentReport instance được tạo bằng cách gọi method createExtentReports() từ class ExtentManager.
- Method startTest() trả về instance ExtentTest mới tạo ra và lưu vào extentTestMap với thead id hiện tại.
- Method getTest() trả về instance ExtentTest trong extentTestMap của thead id hiện tại.
package Utils.extentreports; import com.aventstack.extentreports.ExtentReports; import com.aventstack.extentreports.ExtentTest; import java.util.HashMap; import java.util.Map; public class ExtentTestManager { static Map<Integer, ExtentTest> extentTestMap = new HashMap<>(); static ExtentReports extent = ExtentManager.createExtentReports(); public static synchronized ExtentTest getTest() { return extentTestMap.get((int) Thread.currentThread().getId()); } public static synchronized ExtentTest startTest(String testName, String desc) { ExtentTest test = extent.createTest(testName, desc); extentTestMap.put((int) Thread.currentThread().getId(), test); return test; } }
Step 3- Listener class
Để listen được các sự kiện test xảy ra như kiểm thử thành công (Test passed), kiểm thử không thành công (Test failed) hay bị bỏ qua (skipped) …, chúng ta cần phải thêm class TestListener.
Đối với trường hợp kiểm thử không thành công, cần cho chạy lại, chúng ta sẽ thêm class AnnotationTransformer, Retry