自動化測試 - Screenplay Pattern 的介紹與應用
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 將會是非常有幫助的。
如果你對於自動化測試有興趣,請訂閱我的部落格,可以獲得最新的文章。
Comments ()