[Bài 23] Đọc dữ liệu từ file Excel

Note: Mình đã update cách đọc file excel mới ở đây.

I. Mở đầu

Mình ít khi sử dụng đến cách làm này, nên cóp nhặt trên mạng đoạn code này, bạn nào dùng có thể copy thẳng vào trong project.

NOTE: Cái cách này mình ko khuyến khích nhé. Hãy dùng chức năng đọc csv của Junit5 thay thế.

Yêu cầu:

Giải nén và add các tất cả các file jar vào project ngoại trừ log4j. 

Lưu ý là phải add cả những file jar ở trong folder /lib/ và  /ooxml-lib/

Bạn nào nếu sử dụng Maven project thì add 2 cái này vào file pom.xml

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.0.0</version>
</dependency>

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.0.0</version>
</dependency>

II. Class đọc file Excel

Mình đặt cái class này ở trong package utilities.

package utilities;

import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadFile {

	private static XSSFWorkbook ExcelWBook;
	private static XSSFSheet ExcelWSheet;

	public static void setExcelFile(String path, String sheetName) throws Exception {
		try {
			// Open the Excel file
			FileInputStream ExcelFile = new FileInputStream(path);

			// Access the excel data sheet
			ExcelWBook = new XSSFWorkbook(ExcelFile);
			ExcelWSheet = ExcelWBook.getSheet(sheetName);
		} catch (Exception e) {
			throw (e);
		}
	}

	public static String[][] getTestData(String tableName) {
		String[][] testData = null;

		try {
			// Handle numbers and strings
			DataFormatter formatter = new DataFormatter();
			XSSFCell[] boundaryCells = findCells(tableName);
			XSSFCell startCell = boundaryCells[0];

			XSSFCell endCell = boundaryCells[1];

			int startRow = startCell.getRowIndex() + 1;
			int endRow = endCell.getRowIndex() - 1;
			int startCol = startCell.getColumnIndex() + 1;
			int endCol = endCell.getColumnIndex() - 1;

			testData = new String[endRow - startRow + 1][endCol - startCol + 1];

			for (int i = startRow; i < endRow + 1; i++) {
				for (int j = startCol; j < endCol + 1; j++) {
					Cell cell = ExcelWSheet.getRow(i).getCell(j);
					testData[i - startRow][j - startCol] = formatter.formatCellValue(cell);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return testData;
	}

	public static XSSFCell[] findCells(String tableName) {
		DataFormatter formatter = new DataFormatter();
		String pos = "begin";
		XSSFCell[] cells = new XSSFCell[2];

		for (Row row : ExcelWSheet) {
			for (Cell cell : row) {
				if (tableName.equals(formatter.formatCellValue(cell))) {
					if (pos.equalsIgnoreCase("begin")) {
						cells[0] = (XSSFCell) cell;
						pos = "end";
					} else {
						cells[1] = (XSSFCell) cell;
					}
				}
			}
		}
		return cells;
	}

}

Trong class có 3 method chính:

  • setExcelFile: Đọc file và xác định data ở sheet nào trong file excel
  • findCells: Tìm vị trí các cell có chứa data trong sheet
  • getTestData: Lấy data và lưu vào các array

III. Cách inject data vào trong các test method

1. Cấu trúc file Excel

File Excel phù hợp với Class trên có dạng như sau:

Nó sẽ được đánh dấu ở 2 góc bằng 1 từ hoặc 1 dãy ký tự nào đó (chính là method findCells ở trên). Trong ví dụ này mình sử dụng từ invalid

2. Cách lấy đường dẫn đến file linh hoạt

File data nên được đặt trong project luôn, đừng để ở vị trí nào đó ở trên máy ngoài project vì nếu có ai đó làm chung với bạn thì đường dẫn đến file sẽ bị sai. Tất nhiên là đường dẫn đến project ở mỗi máy lại khác nhau nên chúng ta phải có cách để dynamic cái đường dẫn đó để lúc nào cũng đúng dù ở bất kỳ máy nào.

Như ở trong hình: file sẽ nằm ở trong folder “data” và file có tên là “data.xlsx”. Do cái đường dẫn là cố định, không đổi nên mình sẽ đặt nó ở trong class Links (Xem lại bài 16)

public class Links {
	
	....
	public static final String PATH_TO_EXCEL = System.getProperty("user.dir") + File.separator + "data" + File.separator + "data.xlsx";
}

Cái File.separator chính là cái ký tự “\” hoặc “/”, sẽ tùy vào hệ điều hành để hiển thị.

3. Thực hiện việc đọc file excel vào lúc nào?

Tùy vào mục đích sử dụng để xác định thời điểm đọc file Excel:

  • Đọc file 1 lần và sẽ run trước tất cả các test
  • Test nào cần data thì chỉ đọc file ở test đó.

Trong hướng dẫn lần này, mình dùng cách thứ 2 vì dễ làm :)))) Ai muốn làm cách 1 thì tự nhét cái read file vào BeforeSuite hoặc BeforeTest, tùy bạn.

Class test Login sẽ như sau:

public class LoginTest extends BaseTest {
	LoginPage loginPg;
	
	@Test(dataProvider="loginData")
	public void loginFail(String userName, String password) {
		loginPg = new LoginPage(driver);
		loginPg.login(userName, password);
		Assert.assertTrue(loginPg.isDisplayed());
	}
	
	
	@DataProvider(name = "loginData")
	public Object[][] dataProvider() throws Exception {
		ReadFile.setExcelFile(Links.PATH_TO_EXCEL, "LoginTest");
		Object[][] testData = ReadFile.getTestData("invalid");
		return testData;
	}

}

Trong đó: sử dụng annotation DataProdiver của TestNG để làm việc inject data vào trong method test.

Một số điểm lưu ý:

  • Nếu cái dataProdiver method mà bạn đặt ở Class khác thì trên chỗ method Test bạn cần phải khai báo cái class chứa method DataProvider.
  • Bắt buộc cái method Test phải có parameter trùng với số cột được định nghĩa trong file excel (ko tính 2 cái từ ở góc dùng để đánh dấu). Giả sử cái file data có thêm 1 cột nữa là email thì ở trong Method Test cũng phải có thêm parameter Email
  • Không nên định nghĩa pass/fail ở trong file data vì 2 TH pass và fail sẽ có cách check kết quả khác nhau
  • Càng không nên lưu pass/fail ra file excel vì bạn đã có 1 cái report của TestNG rồi, giờ còn phải mò mẫm vào file excel để xem kết quả pass fail thì quá khổ.

Và đây là kết quả sau khi run test, mình chỉ làm demo nên giá trị đầu vào nó ko đúng với tiêu chí test lắm.

IV. Tổng kết

Nhiều bạn yêu cầu bài này quá, nay mình mới cố gắng sắp xếp thời gian viết được, mong rằng đáp ứng được nhu cầu của mọi người. Nếu có thắc mắc gì thì hãy đặt lại comment nhé.

0 0 votes
Article Rating
Subscribe
Notify of
guest
25 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] [Bài 23] Đọc dữ liệu từ file Excel […]

Tiêu Tiêu
Tiêu Tiêu
5 years ago

Rất mong anh có thể thât nhanh ra sớm các bài viết nữa ạ. Em đang học và làm đến nó nên bài viết của anh thật sự rất hữu ích và cần thiết. :D. Xin chân thành cảm ơn ạ 😀

Tiêu Tiêu
Tiêu Tiêu
5 years ago
Reply to  Giang Nguyen

Em có viết testscript theo từng testcase trong file excel, và sau khi run test thì sẽ ghi PASS/FAIL vào dòng tương ứng của testcase đó trong file excel. anh viết bài hướng dẫn về cái này được không ạ . :D. Xênh kiu anh ạ
p/s: hiện tại em đang nhập tay :D.

Em còn một số trường hợp sẽ tổng hợp lại rùi nhờ anh tư vấn or có thể viết bài hướng dẫn càng tốt ạ . hi.

Tiêu Tiêu
Tiêu Tiêu
5 years ago
Reply to  Giang Nguyen

Hì, vâng ạ.

trackback

[…] là nơi để lưu file ảnh, chỗ này mình làm giống với bài 23, đọc file excel. Các bạn có thể xem […]

BNgoc
BNgoc
5 years ago

Anh cho e hỏi đoạn này với ạ e chưa rõ
“public static final String PATH_TO_EXCEL = System.getProperty(“user.dir”) + File.separator + “data” + File.separator + “data.xlsx”;”
user.dir là cố định ạ hay là file nào ạ ?
File.separator khi chạy thì e thay bằng “\” đúng k ạ

chu tham
chu tham
4 years ago

a oi cho e hỏi khi đọc dữ liệu exel mình có thể test 2 trường hợp đăng nhập thành công và không thành công thì trường hợp đăng nhập thành công mà mình điền các dữ liệu hợp lệ thì nó sẽ thông báo thành công thì làm thế nào để test NG nó thông báo là trường hợp pass ạ

Bá Trung
Bá Trung
4 years ago

a Giang ơi khi em run loginFail thì báo “Test ignored” 🙁 a giải thích phần này cho e được k ạ. em cảm ơn

Bá Trung
Bá Trung
4 years ago
Reply to  Giang Nguyen

Vâng là thông báo từ console ạ 🙁 em đã sửa được rồi 😀
nguyên nhân đúng là do setup dataProvider k đúng ạ

Vũ
4 years ago

Anh cho em hỏi với ạ:
Em có 1 file excel với 20 account khác nhau
Khi e chạy script để login vào google, thì mỗi lần login xong 1 account
thì browser sẽ đóng và mở lên một browser mới cho mỗi account
Giờ làm thế nào để có thể login 20 account mà k cần phải mở browser mới vậy ạ?

Vũ
4 years ago
Reply to  Giang Nguyen

Dạ e ví dụ thôi ạ, chứ e làm là tạo account là login account ở dự án e đang làm ạ
E chạy file excel như ví dụ của anh á, mỗi lần e chạy xong 1 account là 1 tab mới hiện lên ạ.

Vũ
4 years ago
Reply to  Giang Nguyen

Dạ e cảm ơn anh ạ, e sẽ đợi bài mới của a <3

trackback

[…] đọc file excel như bài https://giangtester.com/bai-23-doc-du-lieu-tu-file-excel/ thì quá lằng nhằng, nặng nề, không linh […]

Nguyen Thuy
Nguyen Thuy
4 years ago

Anh Giang ơi, có cách nào dùng Auto Test để check Mapping tỉnh/ thành phố, quận/ huyện, phường/ xã khi Dev insert vào CSDL không ạ?

Hải Yến
Hải Yến
3 years ago

A Giang ơi, a có mở lớp ở Hà Nội k ạ, nếu có thì mở khu vực nào…chi phí của 1 khóa auto là khoảng bn ạ, e biết java cơ bản thôi, cũng có khái niệm về lập trình… đang có nhu cầu muốn học, a tư vấn thêm cho e vs