Page Object Pattern/Page Object Model trong automation test.

Page Object Pattern là gì? Page Object Pattern hay còn được gọi là POM (Page object model). Ở đây chúng ta gọi nó là Page Object Pattern bởi vì POM có trùng với một từ khóa khác ở trong maven cũng là POM (Project Object Model) vì vậy trong bài viết này mình sẽ đề

Page Object Pattern là gì?

Page Object Pattern hay còn được gọi là POM (Page object model). Ở đây chúng ta gọi nó là Page Object Pattern bởi vì POM có trùng với một từ khóa khác ở trong maven cũng là POM (Project Object Model) vì vậy trong bài viết này mình sẽ đề cập đến nó dưới keyword POP.

Page Object Pattern(POP) là 1 design pattern hỗ trợ trong mảng automation testing. Trong Selenium POP đóng vai trò tạo ra 1 kho lưu trữ tất cả element của trang web, POP hữu ích trong việc giảm trùng lặp code và cải thiện khả năng bảo trì(maintain) đối với test case.
Trong POP, hãy coi mỗi trang web của một ứng dụng là 1 class file. Mỗi class file sẽ chỉ chứa các elements của trang web tương ứng. Sử dụng các yếu tố này, Tester có thể thực hiện các thao tác trên trang web được test.

image.png

Ngoài ra chúng ta sẽ có những framework khác sẽ tìm hiểu trong bài sau là: Singleton Pattern, Strategy Pattern, Factory Pattern.

Ưu điểm của Page Object Pattern.

Giảm thiểu việc trùng lặp code:

  • Với Selenium API chúng ta sẽ code như sau:
    *WebElement element = driver.findElement(By.xxx(""))
    *element.sendKeys()/click()/getText()image.png
    Việc sử dụng trực tiếp Selenium API gây ra sự trùng lặp code và rất khó khăn khi bảo trì(maintain) bởi vì khi có thay đổi ở 1 element sẽ phải đi tìm từng dòng chứa element đó để sửa chữa.
  • Với Page Object Pattern Chúng ta sẽ tối ưu nhược điểm trên bằng cách tạo ra các Hàm có thể sử dụng cho nhiều Test Case khác nhau.
    Untitled Diagram.drawio.pngChỉ cần truyền vào các tham số là tạo ra được những test case khác nhau.image.png

Dễ dàng cho việc bảo trì, mở rộng code về sau:

* UI thay đổi **chỉ cần update ở pageUIs**
* Logic thay đổi **chỉ cần update ở pageObjects**
* Data Test thay đổi **chỉ cần update ở tần testcases**
* Thư viện Selenium thay đổi (đổi cách dùng hoặc đổi version mới) **thì chỉ cần update ở class AbtractPage** (Selenium Wrapper/ Function). Không sửa ở tầng testcase/pageObject

Testcase ngắn, dễ đọc, các method tương ứng với các hành động manual trên từng page.

Nhược điểm của Page Object Pattern.

Yếu tố con người rất quan trọng:

  • Cần Kỹ năng code, technical, backgroud về automation testing.
  • Không phù hợp với người/ team không biết code, không biết technical.
  • Biết viết common function
  • Biết chia page
  • Biết định nghĩa locator và tối ưu hóa locator
  • Biết contructor là gì
  • Biết biến toàn cục/ biến cục bộ
  • Biết khi nào khởi tạo page/ khởi tạo ở vị trí nào/ page này gọi qua page kia
  • Biết cách kế thừa class/ phạm vi truy cập
  • Biết sắp xếp testcase đi đúng luồng

Mất nhiều thời gian để xây dựng framework

  • Với người có kinh nghiệm thì mất khoảng 3 ngày đẻ clone + viết 5 – 10 testcase
  • Build từ đầu tầm 1 tuần – 10 ngày – 1 tháng tùy level

Số lượng action của từng page quá nhiều khi testcase và chức năng tăng lên.

  • Khai báo và implement rất nhiều hàm cho các fields
  • Khai báo rất nhiều locator cho các fields
    screenshot-tiemchungcovid19.gov.vn-2022.09.03-10_55_33.png

Giải Pháp

Sử dụng dynamic để xử lý (Page/ Action/ Component)

  • Sử dụng [Framework] Page Element Component để design lại page object, page UI – Viết hàm theo dạng component không viết theo action
    image.png

Lưu ý

  • Tầng testcase không nên có API code (TestNG, Webdriver API) hoặc code như if else/ do/ while… chỉ nên nằm trong tầng page object
  • Tầng page object không nên có các hame Assert và Verify => chỉ dùng ở tầng testcase
    • Tầng action có trả về thì nên trả về các giá trị để cho tầng testcase verify.
      2.png
  • Mỗi page object chỉ viết action của chính page đó.
  • Làm đến đâu viết action/UI đến đó không viết tất cả action/UI của 1 page.
    image.png

  • Từ 1 page A khi chuyển qua page B cần phải khởi tạo page B đó lên rồi mới thao tác tiếp các step của page B nếu không sẽ dẫn đến lỗi NullPointerException.
  • Để đảm bảo đi đúng luồng như manual test thì khi đi đến page nào nên return lại page đó.
  • Nắm rõ vòng đời, cách tương tác, chuyển driver giữa các page
    • **Driver => AbtractTest => TestCase => Page Object => AbtractPage **

Trong bài viết lần sau, mình sẽ trình bày tiếp về Singleton Pattern. Thanks!

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ