[Bài 6] Đọc file CSV cho TestNG

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.

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ào UserProfile.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 qua name
  • (2) Vì method @DataProvider return Iterator<UserProfile> nên ở chỗ method @Test, bạn chỉ cần khai báo parameter UserProfile userProfile
  • (3) Khi có object, bạn có thể lấy các value thông qua getter, ví dụ getName(), getAge(), getAddress()
Cái error trong ảnh là lỗi của plugin TestNG trong Intellij, không phải lỗi code nha.
Mỗi object sẽ tương ứng với 1 lần run test.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *