iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

Windows 桌面軟體 CI 實戰:從系統工具開發到 Zero-RDP 自動化測試錄影 系列

開發 Windows 系統工具與桌面應用時,如何在 GitHub Actions CI 管道中確保品質?本系列以真實開源專案為骨幹,揭密無桌面環境下的 E2E 測試挑戰。涵蓋輸入法(IME)狀態攔截、跨架構虛擬化驗證、自動關閉 OOBE 彈窗,到產出操作影片與視窗差異報告,手把手建立 Windows GUI 軟體整合測試管線。

參賽天數 26 天 | 共 26 篇文章 | 0 人訂閱 訂閱系列文 RSS系列文
DAY 11

Day 11:「按一個鍵」有三種做法,而它們送到不同的地方

第三章開始。今天的問題聽起來很蠢:在 Windows 上模擬一次按鍵,有幾種方法? 答案是至少三種,而選錯的話,你的測試會在中文環境下整組失效。 三條路 Se...

2026-09-10 ‧ 由 mangokingTW 分享
DAY 12

Day 12:從 ctypes.windll 到私有 Handle:避免全域污染的 Win32 API 呼叫守則

今天這一篇跟桌面測試沒有直接關係,但適用範圍比這個系列裡任何一篇都廣:在 ctypes.windll 上設定 argtypes,改到的是同一個處理程序裡每一個...

2026-09-11 ‧ 由 mangokingTW 分享
DAY 13

Day 13:在 CI 全綠,到中文環境全滅——實體按鍵與組字緩衝區

今天這一篇是一個「以為合成輸入壞了,結果是作業系統在認真工作」的故事。 這也是整個系列裡,最能說明「環境隱含假設」代價的一篇。 靈異現象:在 CI 上全綠,在...

2026-09-12 ‧ 由 mangokingTW 分享
DAY 14

Day 14:為什麼切換鍵盤佈局永遠失敗?——跨處理程序的輸入法控制

昨天確認了注音輸入法會攔截實體掃描碼。今天的問題很自然: 那我能不能在測試裡先問一下「現在有沒有輸入法在運作」,或者乾脆把它換掉? 這一篇的結論我改過兩次,兩次...

2026-09-13 ‧ 由 mangokingTW 分享
DAY 15

Day 15:在一個「全都是整合測試」的領域裡,把純函式挖出來

第三章的最後一天。今天不談 Win32,談一個測試策略問題。 這個領域的先天困境 桌面 UI 自動化的測試有個尷尬的性質:幾乎每一件事都需要真的開一個視窗。...

2026-09-14 ‧ 由 mangokingTW 分享
DAY 16

Day 16:0.10 秒 vs 7.84 秒——冷啟動比任何人的預算都久

第四章開始。這一章講的都是同一件事的不同面向:你在自己機器上調出來的參數,在 CI 上是錯的。 那個 80 倍的數字 同一份測試程式碼、同樣啟動記事本(Not...

2026-09-15 ‧ 由 mangokingTW 分享
DAY 17

Day 17:啟動了,但沒有新視窗——單例應用與幽靈視窗

昨天的問題是「等不夠久」。今天的問題更奇怪:等再久也沒有用,因為那個視窗永遠不會出現。 症狀 before = WindowCensus.capture()...

2026-09-16 ‧ 由 mangokingTW 分享
DAY 18

Day 18:不要用視窗標題找視窗

今天講一個最自然的做法,以及它在跨環境時會遇到什麼。 最直覺的第一行 入門範例通常長這樣,我自己一開始也是這樣寫的: window = find_window...

2026-09-17 ‧ 由 mangokingTW 分享
DAY 19

Day 19:開跑前先清場——以及一個函式庫的相依預算

一台 CI runner 在你的測試開始之前,並不是空的。今天講怎麼清,以及為了清它,我做了一個關於相依套件的決定。 runner 上有什麼 windows-...

2026-09-18 ‧ 由 mangokingTW 分享
DAY 20

Day 20:在 MacBook 上開一台 Windows 11 ARM64 來重現 CI

第四章的最後一天。前面幾天講的問題有一個共通點:它們只在 ARM64 的 CI runner 上發生。 而只在 CI 上發生的問題,是最難修的一種——每改一行就...

2026-09-19 ‧ 由 mangokingTW 分享