Thấy có bạn comment muốn đọc file csv cho testng. Ok, chơi thôi.
NOTE: Bạn ***tester nào đó vui lòng đừng copy về blog của bạn.
Nội dung bài viết
I. Đọc file csv rồi save thành list các object.
Mình sử dụng thư viện OpenCSV để thực hiện việc này, nên bạn cần phải add thư viện vào trong project trước:
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.4</version> </dependency>
a. Giả sử mình có file csv như sau, nằm ở folder
src/test/resources/test.csv
name,age,address lucas,10,HN james,20,HCM john,30,DN
b. Chuẩn bị 1 class để mapping với file csv.
package com.giangtester.stackoverflow; import com.opencsv.bean.CsvBindByName; import lombok.Data; @Data public class UserProfile { @CsvBindByName private String name; @CsvBindByName private String age; @CsvBindByName private String address; }
c. Viết function để chuyển từ CSV thành Object.
private <T> List<T> getDataAsObject(String pathToFile, Class<T> type) { List<T> tList = new ArrayList<>(); (1) try (Reader reader = new FileReader(pathToFile)){ tList = new CsvToBeanBuilder<T>(reader) .withType(type) .build().parse(); (2) } catch (IOException e) { e.printStackTrace(); } return tList; (3) }
- (1) Tạo ra 1 List các object có Type Parameter là
<T>
. Cái này thuộc về phần java generics. - (2) Convert CSV file thành List object
<T>
- (3) Return lại List object.
II. Đẩy List object này vào @DataProvider của TestNG
@DataProvider(name = "create") public Iterator<UserProfile> createData() { List<UserProfile> data = getDataAsObject("src/test/resources/test.csv", UserProfile.class); (1) return data.iterator(); (2) }
- (1) Mình muốn convert file csv mình có thành List các object
<UserProfile>
, nên mình truyền vàoUserProfile.class
- (2) Vì TestNG quy định method nào mà là
@DataProvide
thì chỉ có thể return 1 trong 4 kiểu sau:- Object[][]
- Iterator<Object[]>
- Object[]
- Iterator<Object> (đây là cái mình chọn vì dễ nhất)
Từ List chuyển thành Iterator, bạn chỉ cần gọi method .iterator()
, nên khá đơn giản
III. Sử dụng trong method @Test
@Test(dataProvider = "create") (1) public void test(UserProfile userProfile) { (2) System.out.println("name=" + userProfile.getName()); (3) System.out.println("age=" + userProfile.getAge()); System.out.println("address=" + userProfile.getAddress()); }
- (1) bạn cần phải kết nối method
@Test
với method@DataProvider
thông quaname
- (2) Vì method
@DataProvider
returnIterator<UserProfile>
nên ở chỗ method@Test
, bạn chỉ cần khai báo parameterUserProfile userProfile
- (3) Khi có object, bạn có thể lấy các value thông qua getter, ví dụ
getName()
,getAge()
,getAddress()
IV. Tổng kết
Trên đây, mình nghĩ là cách dễ nhất nếu bạn muốn làm data-driven testing với TestNG và csv file. Nếu bạn muốn hiểu tường tận Java generics, Iterator thì bạn có thể search google, hoặc đăng ký khóa học Java Intermediate của mình.