自動化測試 - Repository Pattern 的使用與介紹

自動化測試 - Repository Pattern 的使用與介紹
Photo by motomoto sc / Unsplash

在自動化測試案例中,往往第一步是為這些測試案例準備測試資料。測試資料的來源可能來自於某個檔案、某個資料庫或呼叫某支 API 請求的結果。使用 Repository 設計模式可以將資料的操作抽象化成建立(Create)、讀取(Read)、更新(Update)、刪除(Delete),而不會因為資料來源的實體不同而有不同的操作函式。

User

使用者資料的表示將是一個名為 User 的資料類別,其中包含一些個人資訊,例如電子郵件、使用者名稱。

import dataclasses

@dataclasses.dataclass
class User:
  email: str = ""
  username: str = ""

Generic Repository Design Pattern

Repository 設計模式的概念是將資料存取邏輯隱藏在業務程式碼之外。隱藏細節使程式碼更易於閱讀、維護。對於自動化測試框架,它使您甚至可以輕鬆地更改資料存取技術。通過抽象層,程式碼閱讀者不需要知道測試資料來自何處。閱讀者可以專注於測試案例。Repository 應該支援 CRUD,即建立(Create)、讀取(Read)、更新(Update)、刪除(Delete)。這是每個持久性儲存應支援的四個基本功能。

class UsersRepository:
    def __init__(self):
        self.users = []

    def add(self, user: User):
        """新增使用者"""
        self.users.append(user)

    def get(self, email: str) -> Union[User, None]:
        """根據 email 取得使用者"""
        for user in self.users:
            if user.email == email:
                return user
        return None

    def update(self, email: str, new_user_data: User):
        """根據 email 更新使用者資訊"""
        for index, user in enumerate(self.users):
            if user.email == email:
                self.users[index] = new_user_data
                return True
        return False

    def delete(self, email: str):
        """根據 email 刪除使用者"""
        for index, user in enumerate(self.users):
            if user.email == email:
                del self.users[index]
                return True
        return False

該類別創建一個列表來儲存使用者資料。它提供 CRUD 操作,將幫助我們將一批測試使用者建立到記憶體中。

UserFactory

通常會搭配使用 Factory 將資料物件建立出來,下面的範例示範了一個呼叫者會怎麼是使用 Factory 將使用者物件產生出來。

class UserFactory:
  def __init__(self, repo: UsersRepository):
    self.repository = repo
  
  def generate_users(self, count: int) -> List[User]:
    active_users = self.repository.all_users()

UserFactory Usage

範例中一次產生 5000 個使用者資料,通常會在效能測試準備測試資料的時候,呼叫下列的程式碼。

user_factory = UserFactory(UsersRepository())
user_factory.generate_users(count=5000)

結論

通過 Repository 設計模式,我們可以輕鬆地準備測試資料,閱讀程式碼時,並不需要知道實作細節,只需要使用 CRUD 的函式,就可以對資料作操作,使測試過程更有簡單和易於閱讀。

如果你對於自動化測試有興趣,請訂閱我的部落格,可以獲得最新的文章。