NỘI DUNG BÀI HỌC
✅ Xây dựng class xử lý Excel file (đọc/ghi)
✅ Đọc data test từ Excel file cho test cases
✅ DataProvider trong TestNG Framework
✅ Data-driven Testing với DataProvider và Excel file
✅ Thêm thư viện hỗ trợ xử lý Excel file trong Maven project
Bản cập nhật mới nhất đến ngày 06/04/2025.
✅ Xây dựng class xử lý Excel file (đọc/ghi)
Chúng ta tạo class ExcelHelpers
trong package helpers như sau:
1. setExcelFile(String excelPath, String sheetName)
-
Mục đích: Thiết lập đường dẫn và chọn sheet trong tập tin Excel cần làm việc.
-
Hoạt động:
-
Kiểm tra xem tập tin Excel và sheet đã tồn tại chưa.
-
Đọc và load nội dung của sheet vào
Workbook
vàSheet
. -
Tạo một bản đồ (
Map
) các cột dựa vào hàng đầu tiên (header) của sheet, giúp truy cập dữ liệu dễ dàng hơn bằng tên cột.
-
2. getRowData(int rowNum)
-
Mục đích: Lấy dữ liệu của một hàng cụ thể.
-
Hoạt động: Trả về đối tượng
Row
tại vị trí được truyền vào (rowNum
).
3. getExcelData(String excelPath, String sheetName)
-
Mục đích: Trả về toàn bộ dữ liệu trong sheet dưới dạng mảng 2 chiều (
Object[][]
). -
Hoạt động:
-
Load workbook và sheet.
-
Đếm số dòng và cột dữ liệu.
-
Duyệt từng ô để lấy dữ liệu, chuyển đổi kiểu dữ liệu sang
String
hoặc các kiểu tương ứng, rồi đưa vào mảng 2 chiều.
-
4. getDataHashTable(String excelPath, String sheetName, int startRow, int endRow)
-
Mục đích: Lấy dữ liệu từ một phạm vi các dòng cụ thể và trả về dưới dạng mảng 2 chiều chứa
Hashtable
(cặp key-value). -
Hoạt động:
-
Duyệt từ
startRow
đếnendRow
, mỗi dòng dữ liệu được lưu vào mộtHashtable
. -
Key trong
Hashtable
là tên cột, giá trị là dữ liệu từ từng ô tương ứng trong hàng đó.
-
5. getRowContains(String sTestCaseName, int colNum)
-
Mục đích: Tìm vị trí dòng đầu tiên có chứa giá trị xác định trong một cột nhất định.
-
Hoạt động:
-
Duyệt tất cả các dòng, kiểm tra giá trị của ô tại cột (
colNum
) so sánh với chuỗi cần tìm. -
Trả về vị trí của dòng chứa chuỗi đó.
-
6. getRows()
-
Mục đích: Trả về tổng số dòng hiện có trong sheet.
-
Hoạt động: Gọi phương thức
getLastRowNum()
từ đối tượngSheet
.
7. getColumns()
-
Mục đích: Trả về tổng số cột hiện có trong hàng đầu tiên của sheet.
-
Hoạt động: Dựa vào hàng đầu tiên (
getRow(0)
) và gọigetLastCellNum()
để lấy số cột.
8. getCellData(int rowNum, int colNum)
-
Mục đích: Lấy dữ liệu từ ô cụ thể theo vị trí dòng và cột.
-
Hoạt động:
-
Xác định kiểu dữ liệu của ô (
STRING
,NUMERIC
,BOOLEAN
,DATE
,BLANK
). -
Chuyển đổi sang kiểu chuỗi và trả về giá trị.
-
9. getCellData(int rowNum, String columnName)
& getCellData(String columnName, int rowNum)
-
Mục đích: Lấy dữ liệu từ ô cụ thể theo tên cột và số dòng, tiện lợi khi thao tác với bảng dữ liệu có header.
-
Hoạt động:
-
Xác định số cột từ tên cột bằng
Map columns
. -
Gọi lại hàm
getCellData(int rowNum, int colNum)
để lấy giá trị.
-
10. setCellData(String text, int rowNumber, int colNumber)
-
Mục đích: Ghi dữ liệu vào một ô cụ thể trong Excel, định dạng ô tùy theo nội dung.
-
Hoạt động:
-
Tạo dòng và ô mới nếu chưa tồn tại.
-
Ghi dữ liệu vào ô.
-
Định dạng ô dựa theo nội dung (
pass
,fail
) với màu sắc tương ứng. -
Lưu lại nội dung vào file Excel.
-
11. setCellData(String text, int rowNumber, String columnName)
-
Mục đích: Ghi dữ liệu vào ô Excel dựa trên số dòng và tên cột.
-
Hoạt động:
-
Chuyển tên cột sang chỉ số cột nhờ
columns
. -
Thực hiện tương tự hàm
setCellData
theo số dòng và cột.
-
✅ Đọc data test từ Excel file cho test cases
Tạo file data excel lưu vào src/test/resources/test_data/data.xlsx
🚩 1. Đặt tên file và sheet rõ ràng, dễ hiểu
-
Đặt tên file Excel và tên sheet ngắn gọn, rõ ràng, phản ánh đúng mục đích dữ liệu.
-
Ví dụ:
-
Tên file:
LoginData.xlsx, data.xlsx, product.xlsx,...
-
Tên sheet:
UserCredentials, Login, Product, Table,...
-
🚩 2. Sử dụng đúng định dạng file
-
Apache POI: Hỗ trợ tốt nhất cho định dạng
.xlsx
. -
Luôn ưu tiên file Excel dạng
.xlsx
.
🚩 3. Đặt header (tiêu đề cột) rõ ràng
-
Dòng đầu tiên luôn là tiêu đề cột (Header).
-
Tiêu đề cột phải dễ đọc, ngắn gọn, tránh ký tự đặc biệt. Nên viết in hoa tất cả.
🚩 4. Tránh các ô merge (gộp ô)
-
Không dùng Merge Cells vì Apache POI và Selenium sẽ khó đọc hoặc phát sinh lỗi.
-
Mỗi ô chỉ nên chứa một giá trị duy nhất.
🚩 5. Định dạng dữ liệu đúng cách
-
Kiểu chuỗi (text):
Định dạng cell là text, tránh các khoảng trắng thừa. -
Kiểu số (numeric):
Định dạng rõ ràng, không chèn ký tự thừa như dấu phẩy, khoảng trắng. -
Ngày tháng:
Dùng định dạng thống nhất:
Ví dụ:yyyy-MM-dd
🚩 6. Tránh các ký tự đặc biệt trong dữ liệu
-
Tránh sử dụng ký tự đặc biệt không cần thiết như:
- Nếu bắt buộc, cần xử lý escape phù hợp khi đọc dữ liệu.
🚩 7. Không để dòng hoặc cột trống ở giữa dữ liệu
- Đảm bảo dữ liệu luôn liền mạch, không có khoảng trống dòng/cột ngẫu nhiên.
- Nên delete vài dòng dư phía bên dưới và vài cột dư phía bên phải cho chắc chắn.
🚩 8. Đóng file Excel trước khi chạy test
-
Luôn đóng file Excel trước khi chạy script test để tránh lỗi do file đang mở và bị lock.
🚩 9. Sắp xếp dữ liệu hợp lý
-
Các test case chính xác và ổn định hơn khi dữ liệu được tổ chức logic.
-
Đưa các dữ liệu liên quan gần nhau, nhóm theo từng test scenario.
🚩 10. Giới hạn dữ liệu hợp lý
-
Không đưa quá nhiều dữ liệu không cần thiết vào một sheet.
-
Dữ liệu quá lớn sẽ làm chậm tốc độ đọc ghi và chạy test.
🚩 11. Kiểm tra encoding (mã hóa ký tự)
-
Luôn đảm bảo file Excel lưu với định dạng chuẩn UTF-8 để tránh lỗi đọc ghi ký tự đặc biệt.
📌 Ví dụ mẫu về cấu trúc Excel chuẩn trong một sheet
USERNAME | PASSWORD | EXPECTED_RESULT |
---|---|---|
admin | admin123 | Success |
admin | pass456 | Fail |
admin123 | admin | Success |
🔆 Đọc data từ file Excel
🔆 Đọc data từ file Excel cho test cases
🔆 Ghi data vào file Excel
📌 Lưu ý: khi set data vào file thì cần đóng file Excel trước khi ghi, nguyên tắc trong Window là như thế, nếu không nó sẽ bị chiếm tiến trình không thể ghi giá trị vào được.
⭐️ Thay các đường dẫn file Excel thành biến toàn cục đặt trong Properties file và ConfigData class
✅ DataProvider trong TestNG Framework
🟢 DataProvider trong TestNG là gì?
-
DataProvider là một tính năng rất mạnh của TestNG cho phép thực hiện Data-Driven Testing (kiểm thử dựa trên dữ liệu).
-
Nó cung cấp dữ liệu đầu vào cho một test method, cho phép test method được chạy nhiều lần với các dữ liệu đầu vào khác nhau.
📌 Tại sao nên dùng DataProvider?
-
Thay vì phải viết nhiều test case giống nhau chỉ khác dữ liệu, em chỉ cần viết một test method duy nhất, rồi cung cấp các bộ dữ liệu khác nhau từ DataProvider.
-
Tăng khả năng tái sử dụng mã nguồn.
-
Dễ dàng quản lý và mở rộng dữ liệu test.
📌 Cách khai báo và sử dụng DataProvider trong TestNG:
✔️ Bước 1: Tạo DataProvider
-
DataProvider trả về dữ liệu dưới dạng mảng 2 chiều (
Object[][]
). -
Mỗi dòng trong mảng là một bộ dữ liệu test riêng biệt.
- Các bộ data cách nhau bởi dấu phẩy và các bộ data phải có cùng tham số và kiểu dữ liệu.
Theo ví dụ trên là 3 bộ data khác nhau. Mỗi bộ data có 2 tham số.
✔️ Bước 2: Liên kết DataProvider với Test method
- Tham số truyền vào test method chính là giá trị của từng bộ dữ liệu mà DataProvider cung cấp.
- Chú ý số lượng tham số phải tương ứng, kiểu dữ liệu tương ứng trong DataProvider. (tên tham số tuỳ ý)

Có 3 bộ data nên kết quả chạy 3 lần, mỗi lần bộ data khác nhau.
📌 Trường hợp sử dụng DataProvider từ một class khác:
Giờ chúng ta xây dựng một class chứa DataProvider riêng biệt, ví dụ DataProviderFactory:
Để sử dụng trong test class khác, chúng ta khai báo như sau:


✅ Data-driven Testing với DataProvider và Excel file
🔆 Đọc hết data trong một Sheet từ Excel
Chúng ta gọi hàm getExcelData() để xử lý trường hợp đọc hết data trong một Sheet, sau đó truyền vào DataProvider tại class DataProviderFactory.
Tiếp theo chúng ta khai báo test cases để tiếp nhận data từ DataProvider tên "login_from_excel"
🔆 Đọc data theo vị trí dòng chỉ định trong một Sheet từ Excel
Chúng ta gọi hàm getDataHashTable() để xử lý trường hợp đọc data theo vị trí dòng bắt đầu và dòng kết thúc được chỉ định trong một Sheet, sau đó cũng truyền vào DataProvider tại class DataProviderFactory.
Tiếp theo chúng ta khai báo test cases để tiếp nhận data từ DataProvider tên "login_from_excel_hashtable". Lúc này hơi khác với trước giờ theo kiểu truyền tham số. Cách này buộc truyền tham số là đối tượng HashTable<String, String>.
🔆 Đọc data theo từng vị trí dòng cụ thể trong một Sheet từ Excel
Chúng ta gọi hàm getDataFromSpecificRows() hoặc getDataHashTableFromSpecificRows() để xử lý trường hợp đọc data theo từng vị trí cụ thể được chỉ định trong một Sheet, sau đó cũng truyền vào DataProvider tại class DataProviderFactory.
Gọi sử dụng trong test cases class
🔆 Truyền tham số từ suite XML file vào DataProvider
Chúng ta có thể xây dựng thêm các hàm tuỳ biến có thể truyền tham số từ Class hoặc XML file vào DataProvider để tiện get data linh hoạt hơn.
Bổ sung 2 hàm sau vào DataProviderFactory để có thể truyền tham số từ XML file:
Gọi DataProvider sang test cases
Tạo file suite XML truyền tham số là các dòng Excel cụ thể, phân cách bởi dấu phẩy.
Nếu không nhận được tham số từ XML thì hàm trong DataProvider sẽ lấy giá trị default được khai báo trong hàm.