Trong bài này chúng ta sẽ cùng nhau tìm hiểu cách sử dụng Singleton design pattern trong automation test. Chúng ta sẽ sử dụng Java và selenium WebDriver để làm ví dụ nhé. Tuy nhiên bạn cũng có thể ứng dụng tương tự với ngôn ngữ khác hoặc Automation Test framework khác.
Để bắt đầu, bạn cần biết những kiến thức sau:
- Design pattern là gì? Bạn có thể tìm hiểu tại đây.
- Singleton design pattern là gì?
Singleton Design Pattern
Singleton là một trong 5 design pattern thuộc nhóm Creational patterns.
Định nghĩa:
Đảm bảo một class chỉ có duy nhất một instance, đồng thời cung cấp một điểm truy cập toàn cục cho instance này.
- Instance control – Ngăn các đối tượng khác khởi tạo các bản sao của đối tượng Singleton của riêng chúng, đảm bảo các đối tượng đều truy cập vào một phiên bản duy nhất
- Flexibility – Vì đây là lớp kiểm soát quá trình khởi tạo, nên lớp có tính linh hoạt để thay đổi quá trình khởi tạo
- Lazy initialization – Nó trì hoãn việc tạo đối tượng cho đến khi nó được sử dụng lần đầu tiên
Singleton design pattern có ích và được dùng trong trường hợp nào?
Nó rất hữu ích trong trường hợp chúng ta cần sử dụng cùng một đối tượng (object) trên toàn bộ framework. Môt singleton class trả về cùng một instance mỗi khi chúng ta khởi tạo một instance của lớp đó và hãy nghĩ về việc cung cấp quyền truy cập toàn cục cho đối tượng.
Singleton pattern được dùng trong các trường hợp:
- Quản lý window
- Kết nối cơ sở dữ liệu
- Quản lý file
- Cấp phát tài nguyên và bộ đệm
Một số ưu điểm khi dùng Singleton Design Pattern
- Kiểm soát truy cập: lớp Singleton kiểm soát cách thức và thời điểm các clients có thể sử dụng phiên bản duy nhất của nó bằng cách sử dụng đóng gói (encapsulation).
- Quản lý bộ nhớ tốt hơn: Singleton pattern không cho tạo các class instance mới, giúp giảm yêu cầu bộ nhớ.
Cách tạo một Singleton class như sau
- Khởi tạo một private static instance của class Singleton.
- Khởi tạo một private constructor của Singleton class để ngăn các đối tượng khác sử dụng toán tử new với class Singleton
- Khởi tạo một public static method cho phép truy cập vào đối tượng Singleton. Về cơ bản, phương thức này gọi hàm tạo riêng để tạo một đối tượng và lưu nó trong một trường tĩnh. Tất cả các lệnh gọi phương thức này sau đây đều trả về đối tượng được lưu trong bộ nhớ cache.
Ví dụ
package com.example.singletondesignpattern; public class Singleton { private static Singleton singleton=null; private Singleton(){ System.out.println("Object created."); } public static Singleton getInstance() { if(singleton==null) singleton = new Singleton(); return singleton; } }
package com.example.singletondesignpattern; public class InstaltiateSingletonExample { public static void main (String[] args){ // First thread Singleton first = Singleton.getInstance(); Singleton second = Singleton.getInstance(); Singleton third = Singleton.getInstance(); //Print each object System.out.println(first); System.out.println(second); System.out.println(third); } }
Khi bạn chạy đoạn chương trình trên, kết quả sẽ trả về duy nhất một “Object created.” dù bạn đã khởi tạo 3 lần, và hashcode của cả 3 object là như nhau.
Singleton pattern trong Test Automation
Chúng ta đã tìm hiểu Single design pattern rồi, vậy đối với Automation Test (ở đây là Selenium WebDriver) thì nó được áp dụng như thế nào?
Thật ra bất cứ khi nào bạn thấy bạn nên có một phiên bản duy nhất của lớp nào đó thì bạn nên sử dụng Singleton design pattern.
Ví dụ như các trường hợp sau:
- Theo dõi cùng một driver instance trong suốt quá trình thực thi.
- Kết nối cơ sở dữ liệu.
- Tải các tệp tin (file) bên ngoài như properties file, excel, v.v. thay vì tải đi tải lại
- Logger
Ok, chúng ta sẽ cùng thực hiện sử dụng Singleton design pattern trong việc theo dõi trình điều khiển driver nhé.
SingletonDriver.java
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class SingletonDriver { private WebDriver driver; // 1. Define instance of singleton class private static SingletonDriver instanceOfSingletonDriver= null; // 2. Define Constructor private SingletonDriver(){ System.setProperty("webdriver.chrome.driver","./src/main/resources/chromedriver.exe"); driver= new ChromeDriver(); }; // 3. Define method to create instance of class public static SingletonDriver getInstance(){ if(instanceOfSingletonDriver==null){ instanceOfSingletonDriver = new SingletonDriver(); } return instanceOfSingletonDriver; } // 4. Define method to get driver public WebDriver getDriver() { return driver; } }
LoadWebpage.java
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class LoadWebPage { public static void main (String[] args){ SingletonDriver sDriver1 = SingletonDriver.getInstance(); WebDriver driver1 = sDriver1.getDriver(); driver1.get("https://devopsify.co/"); SingletonDriver sDriver2 = SingletonDriver.getInstance(); WebDriver driver2 = sDriver2.getDriver(); driver2.get("https://www.google.com"); WebDriver driver3; System.setProperty("webdriver.chrome.driver","./src/main/resources/chromedriver.exe"); driver3= new ChromeDriver(); driver3.get("https://devopsify.co/"); System.out.println(driver1); System.out.println(driver2); System.out.println(driver3); } }
Khi bạn chạy LoadWebPage.java, bạn sẽ thấy kết quả chạy:
- Chrome browser thứ 1 được bật lên và trang https://devopsify.co/ được mở tiếp sau đó là trang web https://www.google.com được mở trên cùng một tab của browser đó. Chúng ta đã khởi tạo 2 instance của class SingletonDriver, nhưng cho chúng cùng một instance của driver.
- Chrome browser thứ 2 được bật lên và trang https://devopsify.co/ được mở vì driver3 không cùng một instance với driver1 và driver2
Console
ChromeDriver: chrome on WINDOWS (32c91ef49aeb7eeeff411dcfd343ecd2) ChromeDriver: chrome on WINDOWS (32c91ef49aeb7eeeff411dcfd343ecd2) ChromeDriver: chrome on WINDOWS (08a46a5a8550c9395b22b82fb1f81b8f) Process finished with exit code 0
Với ví dụ sử dụng singleton design pattern ở trên, chúng ta chỉ có duy nhất một driver instance, như các bạn biết việc chỉ có một driver instance sẽ không thể thực thi việc chạy test song song. Vậy thì phải làm sao đây?
Các bạn xem bài viết ở đây nhé.
Cheers! 🙂