Chào các bạn đã đến với chủ đề tiếp theo của mình. Để tiếp tục với serries giới thiệu về TestNG Framework, hôm nay, mình sẽ hướng dẫn các bạn cách đọc file CSV cho TestNG. Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
1. Đọc file csv rồi save thành list các object
Mình sử dụng thư viện maven OpenCSV và Projectlombok để thực hiện việc này, nên bạn cần phải add thư viện vào file pom.xml trong project trước:
<!-- https://mvnrepository.com/artifact/com.opencsv/opencsv -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
- Giả sử mình có file csv như sau, nằm ở folder
src/main/resources/test.csv
name,age,address
lucas,10,HN
james,20,HCM
john,30,DN
- Chuẩn bị 1 class để mapping với file csv.
package testngDemo.ReadCSV;
import com.opencsv.bean.CsvBindByName;
import lombok.Data;
@Data
public class DataFile {
@CsvBindByName
private String name;
@CsvBindByName
private String age;
@CsvBindByName
private String address;
}
- 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.
2. Đẩ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
3. 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()
- Kết quả:
4. Lời kết
Đến đây thì mình xin kết thúc bài hôm nay. Các bạn hãy làm lại theo ví dụ trên để hiểu bài hơn nhé. Mình hy vọng bài viết này sẽ hữu ích cho các bạn. Cảm ơn các bạn đã theo dõi bài viết của mình. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn:
Cảm ơn b, làm theo các bước của b mình run đc rồi
nhưng mình gặp 1 issue lúc đọc file field đầu tiên của mình luôn trả về null
b có gặp trường hợp này bao giờ chưa vậy?