這句出自電影《功夫》的台詞。意思是,世上再強的武功都有破解之道,但是只有「速度」是沒有破綻的。當修煉到一個極致,只要快,就能有更多的餘力,去化解堅固的防禦,想出擊破強大的力量的方法。在鐵人賽 30 天文章內,我希望帶著大家讓 AI Agent 能夠學習測試的內功基礎後,再搭配自動化測試常使用招式,最後用一個 RESTFul Service 的範例,讓 AI 一起協同撰寫測試案例,包含單元測試、整合測試、E2E 測試,幫助我們提升測試效率。
測試案例是軟體測試中用來驗證系統功能的最小測試單元,通常內容會描述要測什麼、怎麼測、會發生什麼結果。所以一個完整的測試案例通常會包含:測試案例名稱、測試目的、前置條件、測試步驟、測試資料、預期結果、實際結果(失敗或通過)。這樣的架構是確保每個需求都有被測試涵蓋到,並且讓每個人執行時,都能夠維持一樣的步驟與結果,並且能夠被追蹤與報告。這也是自動化測試的基礎。
Playwright 是由 Microsoft 開發的現代化 E2E 測試框架,而E2E (End-to-End) 測試是一種從使用者視角出發,驗證整個系統流程是否正確的驗證方式,非常適合用來自動化測試案例。雖然 Playwright 出現時間比 Selenium 與 Cypress 晚,但因為針對 E2E 測試常見的痛點進行改進,再加上 Microsoft 的推廣,讓它成為非常適合入門的工具。
首先,測試案例通常會包含行動(Action)和預期結果(Result),我們來看看 Playwright 官網提供的第一個範例。
import { test, expect } from '@playwright/test';
test('has title', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Expect a title "to contain" a substring.
await expect(page).toHaveTitle(/Playwright/);
});
page.goto('https://playwright.dev/')
指的是行動(Action),而 expect(page).toHaveTitle(...) 則是檢查預期結果(Result)。
test('get started link', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Click the get started link.
await page.getByRole('link', { name: 'Get started' }).click();
// Expects page to have a heading with the name of Installation.
await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
});
在第二個範例中,await page.goto('https://playwright.dev/');
則是前置條件,指的是接下來的動作前必須先滿足的條件,而接下來的 getByRole 則就是尋找網頁上面名稱是 Get started
的連結,並且按下連結的動作(Action),最後標題會出現 Installation
則是我們預期出現的結果。
在自動化測試中,我們常用 AAA 架構來撰寫測試案例:
在每一個測試案例中,應包含以下內容:
**測試案例 X.Y:[清楚且具描述性的標題]**
- **優先順序**:[高/中/低]
- **分類**:[功能/介面]
- **前置條件**:[需要的環境或設定]
- **測試步驟**:
1. [逐步、詳細的操作說明]
2. [每一步預期結果]
- **預期結果**:[整體測試後的最終結果]
- **驗收標準**:[通過/失敗的判斷依據]
1. 使用上述產生的測試案例,使用 AAA 撰寫自動化測試案例