App 自動化測試:用 pytest + Page Object Model 打造可維護的框架

  1. 為什麼 App 自動化比 Web 難 — 公司要導入 App 自動化,我從零開始,第一支測試寫登入,接著是一段一直 flaky、進度追不上的日子。追到最後,root cause 大多不在腳本,而在 App 本身。這篇從這段經驗講 App 自動化難在哪,以及為什麼我後來把目標改成「先
  2. Appium 怎麼運作:架構、capabilities 與最小起步 — 在寫測試前,先搞懂 Appium 在做什麼。這篇講 client-server 架構、capabilities 怎麼決定要驅動 Android 還是 iOS,用最少的程式碼起一個 session,也整理我在 UiAutomator2 和 W
  3. 寫出第一個 pytest + Appium 測試 — 把架構知識變成一個能跑的測試。這篇用 pytest 的結構寫第一個端到端 App 測試:driver 用 fixture 取得、動作後用 assert 驗證。我的第一支測試也是登入,後面會講這支看起來最簡單的測試,後來長成什麼樣子。
  4. 元件定位策略:accessibility id 優先、少用 XPath — 定位是 App 自動化 flaky 的最大源頭。這篇講定位策略的優先序、為什麼 XPath 又慢又脆、Android/iOS locator 怎麼分開管理,也攤開我專案裡 locator 的實際組成,以及開發排不出時間加 id 時,我怎麼撐
  5. 處理 WebView 與 hybrid app:context 切換 — Hybrid app 一半是原生、一半是網頁,測試卡在「找不到網頁裡的元件」幾乎都是 context 沒切。這篇講 NATIVE_APP 與 WEBVIEW 兩種 context 怎麼切、Android 與 iOS 的差異,以及我專案裡 W
  6. 為什麼要 POM:把「測什麼」和「怎麼操作」分開 — 沒有 POM 的測試,UI 一改就崩一片——因為 locator 和操作散落在每個測試裡。Page Object Model 把 UI 細節封裝起來,測試只呼叫語意化的方法。這篇講為什麼這個分離值得。
  7. 設計一個 Page 物件:元素、動作、回傳下一頁 — 一個好的 page 物件包含三樣東西:元素 locator、語意化的動作方法、動作後回傳下一個 page。這篇用一個登入頁示範怎麼設計,並守住「斷言不進 page」的原則。
  8. BasePage 與共用行為:把重複收進一個地方 — 每個 page 都要等待、捲動、切 context,這些不該複製貼上。把共用行為收進 BasePage,各 page 繼承它。這篇示範 BasePage 怎麼設計,讓維護點集中。也講集中的另一面:我的 BasePage 曾經大到沒人讀得完,
  9. POM 進階:Component 物件、流程串接、避免 god object — page 物件寫久了會變肥:一個 page 塞滿整個畫面的所有操作。這篇講怎麼用 Component 物件拆出重複區塊、用流程物件串多頁,並認得「page 太肥」這個壞味道。最後講我自己那個肥到不行的首頁物件:知道該拆,為什麼我還是決定不主
  10. fixture 與 conftest:管好 driver 的生命週期 — driver 怎麼開、怎麼關、要不要每個測試都重開,是 App 自動化速度與穩定的關鍵。這篇講 conftest 共用 fixture、function scope 與 session scope 的取捨,以及怎麼保證 session 一定
  11. 測試資料與參數化:一份腳本跑多組資料 — 同一個流程要測十組輸入,不該複製十次測試。這篇講用 pytest parametrize 把資料和腳本分開、把測試資料外部化,以及用帳號池避免併發時帳號互相干擾。最後老實說:在我的 App 專案裡,parametrize 其實很少用,原因也
  12. 等待策略:為什麼 sleep 是壞味道 — time.sleep 是 App 自動化最常見、也最該戒掉的壞習慣:它要嘛太短不穩、要嘛太長浪費。這篇講顯式等待怎麼取代 sleep、隱式等待的陷阱,以及怎麼把等待收進 BasePage。後半段講我專案裡的真實情況:sleep 沒辦法完全戒
  13. 對抗 flaky:穩定 locator、狀態清理、retry 與 quarantine — flaky 測試比沒有測試更糟,因為它讓團隊不再相信紅燈。這篇講 flaky 的成因、怎麼用穩定 locator 和狀態清理治本,以及 retry 與 quarantine 該怎麼用而不是拿來遮蓋問題。我自己就被 retry 騙過:報表全綠
  14. 測試報告:接進 ReportPortal,把結果變團隊看得到的儀表板 — 終端機的 pass/fail 只有你看得到。接進 ReportPortal,測試結果變成即時儀表板:歷史趨勢、失敗自動分類、附截圖與 log。這篇講 pytest 怎麼接 ReportPortal、失敗時自動附截圖,以及我怎麼讓失敗自動分類
  15. 雲端真機:設備農場能幫什麼、我最後怎麼用它 — 自己維護一櫃真機很快會失控:充電、更新、連線、機型不夠。雲端設備農場用 capabilities 就能換到上百種機型。這篇講本機和雲端的取捨、同一套 POM 怎麼兩邊都能跑,也老實說我自己最後沒拿它跑自動化,而是拿來補手動測試的機型。
  16. 接進 CI:讓 App 自動化變回歸防線 — 自動化測試的價值,在能擋住合併前的回歸。這篇講把 pytest+Appium 接進 GitHub Actions 的策略,包括 Android emulator 與 iOS self-hosted runner 的差異。也老實交代我自己的