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

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.

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

 

II. Class đọc file Excel

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

Trong class có 3 method chính:

  1. setExcelFile: Đọc file và xác định data ở sheet nào trong file excel
  2. findCells: Tìm vị trí các cell có chứa data trong sheet
  3. 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)

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:

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é.

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

  1. Pingback: [Bài 22] Webdriver script không đơn giản thứ nhất | GiangTester Blog

  2. 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 ạ 😀

    • Thanks em!
      Anh đang khá bận nên có thời gian anh sẽ viết thêm. Em có thể gợi ý thêm các chủ đề mà em muốn anh viết.

      • 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.

        • Hi em,
          Write vào excel cũng được nhưng đó không phải là việc của automation test em ạ. Automation có report của riêng nó, nó không update vào bất cứ cái document nào.
          Việc đánh giá pass/fail trong testcase em phải tự làm bằng tay thôi.

  3. Pingback: [Bài 25] Chụp screenshot sau khi run test | GiangTester Blog

  4. 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 ạ

    • Hi em.
      user.dir là cố định, ko cần thay đổi. File.sperator cũng là cố định, không cần thay đổi.

      Ví dụ: File exel ở C:\Users\ngoc\eclipse-workspace\selenium-webdriver\data\data.xlsx
      – System.getProperty(“user.dir”) là trỏ đến cái folder project, chính là “C:\Users\ngoc\eclipse-workspace\selenium-webdriver”
      – File.sperator chính là “\” hoặc “/” tùy vào hệ điều hành, Window là “\”, linux và Mac là “/”. Giả sử khi cái project này được clone về máy Mac, nó được lưu ở vị trí: /Users/user/eclipse-workspace/selenium-webdriver. Nếu ta fixed cái đường dẫn theo window thì test không run được nữa.

      Em có thể đọc thêm ở đây: https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

  5. 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 ạ

    • Hi em, anh chưa hiểu câu hỏi của em lắm, nhưng nếu có 2 case login “thành công” và “không thành công” trong đọc file excel thì anh sẽ làm như sau:
      1. Tách riêng 2 phần data ấy cho 2 test cases riêng biệt.
      2. Run test case login “thành công” –> check điều kiện: URL + title page (trang home, sau khi login)
      3. Run test case login “không thành công” –> check điều kiện: Error message + URL page (vẫn là trang login)

  6. 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

Leave a Reply

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