自動化測試 - Screenplay Pattern 的介紹與應用

自動化測試 - Screenplay Pattern 的介紹與應用
Photo by Pereanu Sebastian / Unsplash

Screenplay Pattern 是一種設計模式,用來描述使用者和系統之間的互動。在這個模式中,使用者視為 Actor,動作則是為 (Task),透過將這些場景 (Scenario) 的動作抽象化成「任務」和「角色」,可以讓你的自動化測試的腳本更具有可讀性和維護性。

定義 Actor 類別

角色 (Actors) 是測試的核心,用來執行特定的動作來完成測試的目的。

# actors.py
from playwright.sync_api import Page

class Actor:
    def __init__(self, name: str, page: Page):
        self.name = name
        self.page = page

    def attempts_to(self, task):
        task.perform_as(self)

定義 Task

任務 (Task) 則是角色執行的動作,而每個任務都應該做出 perform_as 函式。

# tasks.py
from actors import Actor

class OpenPage:
    def __init__(self, url: str):
        self.url = url

    def perform_as(self, actor: Actor):
        actor.page.goto(self.url)

class SeeElement:
    def __init__(self, selector: str):
        self.selector = selector

    def perform_as(self, actor: Actor):
        actor.page.wait_for_selector(self.selector)

現在我們可以使用 Actor 和 Task 將測試案例撰寫出來。

# test_example.py
import pytest
from playwright.sync_api import sync_playwright
from actors import Actor
from tasks import OpenPage, SeeElement

@pytest.fixture
def browser_context():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        yield context
        context.close()
        browser.close()

def test_user_can_see_element(browser_context):
    page = browser_context.new_page()
    actor = Actor(name="Tester", page=page)
    
    # 使用角色執行任務
    actor.attempts_to(OpenPage("https://example.com"))
    actor.attempts_to(SeeElement("#element-id"))

在這個例子裡,我們創建了一個 Actor,然後讓這個角色執行打開網頁和檢查某個 Element 是否存在。透過這樣的方式,閱讀測試案例的人,可以快速了解測試案例的角色和動作,使得測試腳本更有可讀性。

Screenplay Pattern 適用場景

  • 測試複雜的使用者行為,例如:購物網站上的購物車操作、結帳流程。通常這些操作都會非常複雜且繁瑣,使用 Screenplay Pattern 可以將使用者行為切分成更小的動作,並且易於管理這些行為。
  • 大規模的測試套件 (Test Suite),當測試套件有包含大量的測試案例,通常也意味者有相同的行為或是動作,使用 Screenplay Pattern 將這些動作抽象成任務的形式,可以有效的組織和重複使用程式碼,減少重複並且提高測試的可讀性。
  • 多角色多場景測試:當待測試系統 (SUT) 中有許多不同的使用者角色,例如:一般使用者、管理者、編輯者等不同場景下進行操作,Screenplay Pattern 可以幫助你清楚定義每個角色的行為和使用場景,並且讓你的程式碼更易於理解。

電子商務平台:使用者登入、瀏覽商品、新增商品到購物車並且進行結帳和付款等一系列的操作。

銀行系統:不同角色的登入,例如:一般帳戶使用者、信用卡使用者、銀行職員和系統管理員的操作,例如:查詢帳戶餘額、進行轉帳或是產生信用卡消費報表。

結論

使用 Screenplay 目的是可以提高測試程式碼的可讀性、重複使用性和有良好的程式碼結構,當你遇到上面提到的情景,可以考慮使用 Screenplay Pattern 將會是非常有幫助的。

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