開發 Windows 系統工具與桌面應用時,如何在 GitHub Actions CI 管道中確保品質?本系列以真實開源專案為骨幹,揭密無桌面環境下的 E2E 測試挑戰。涵蓋輸入法(IME)狀態攔截、跨架構虛擬化驗證、自動關閉 OOBE 彈窗,到產出操作影片與視窗差異報告,手把手建立 Windows GUI 軟體整合測試管線。
第三章開始。今天的問題聽起來很蠢:在 Windows 上模擬一次按鍵,有幾種方法? 答案是至少三種,而選錯的話,你的測試會在中文環境下整組失效。 三條路 Se...
今天這一篇跟桌面測試沒有直接關係,但適用範圍比這個系列裡任何一篇都廣:在 ctypes.windll 上設定 argtypes,改到的是同一個處理程序裡每一個...
今天這一篇是一個「以為合成輸入壞了,結果是作業系統在認真工作」的故事。 這也是整個系列裡,最能說明「環境隱含假設」代價的一篇。 靈異現象:在 CI 上全綠,在...
昨天確認了注音輸入法會攔截實體掃描碼。今天的問題很自然: 那我能不能在測試裡先問一下「現在有沒有輸入法在運作」,或者乾脆把它換掉? 這一篇的結論我改過兩次,兩次...
第三章的最後一天。今天不談 Win32,談一個測試策略問題。 這個領域的先天困境 桌面 UI 自動化的測試有個尷尬的性質:幾乎每一件事都需要真的開一個視窗。...
第四章開始。這一章講的都是同一件事的不同面向:你在自己機器上調出來的參數,在 CI 上是錯的。 那個 80 倍的數字 同一份測試程式碼、同樣啟動記事本(Not...
昨天的問題是「等不夠久」。今天的問題更奇怪:等再久也沒有用,因為那個視窗永遠不會出現。 症狀 before = WindowCensus.capture()...
今天講一個最自然的做法,以及它在跨環境時會遇到什麼。 最直覺的第一行 入門範例通常長這樣,我自己一開始也是這樣寫的: window = find_window...
一台 CI runner 在你的測試開始之前,並不是空的。今天講怎麼清,以及為了清它,我做了一個關於相依套件的決定。 runner 上有什麼 windows-...
第四章的最後一天。前面幾天講的問題有一個共通點:它們只在 ARM64 的 CI runner 上發生。 而只在 CI 上發生的問題,是最難修的一種——每改一行就...