結束碼是 0,那一輪其實一顆測試都沒跑

約 4 分鐘

9 月 20 日凌晨,我在測 TestFlight 的 1.0.1 (6),準備拔網路線,看沒登入、沒網路的時候 App 會不會誤以為人已經買了。畫面上一直有東西自己打開,自己在跑。我打了一句:怎麼有某個東西一直在打開做測試呀。

對上的原因很具體。付費牆打開之後跑整套測試,測試用的 App 連的是真正的 StoreKit。沒有收據,文件被鎖住,付費牆跟著跳出來,App 還反覆崩潰重啟。我叫停之後,verify 又起了一輪。斷網那一步更蠢——線一拔,我就沒辦法跟那邊說我做完了。

日誌裡還有一句更安靜的。過濾條件對不上任何一顆測試的時候,測試工具結束碼是 0,一句話也不抱怨。看起來像單獨跑也過了。實際上一顆都沒跑。

整套測試在螢幕睡著時會卡在某個等畫面的步驟上。15 分鐘還不結束,只好人工砍掉。螢幕醒著,同一套大概一分多鐘就過。卡死的位置每次不一定相同。那一晚至少三輪,每一輪 15 分鐘,換來的不是答案。


結束碼還不是唯一會把三種情況說成同一句的東西。測試主機中途當掉再重跑,最後印出來的摘要可能寫「0 顆通過」,真正的判決是失敗。時間上限觸發時,尾端有時還留著「通過」。同一份日誌的結尾,可以同時出現通過、失敗、還有根本沒跑到。只瞄最後一行,三種情況讀成同一個答案。

我本來以為把結束碼看仔細就夠了。不夠。tools/test.sh 改成每一輪都印出實際跑了幾顆。篩過的至少 1 顆,整套至少 100 顆,少於下限直接失敗。結束碼和「測試失敗」那行先決定勝負,數量只多添一個失敗理由,絕不拿來洗成通過。螢幕睡著就拒絕開跑,原因寫清楚。真要硬跑,日誌裡留警告,這輪不能當證據。

拒跑擋不住已經佔住機器的那一輪。稍晚有一輪卡住,22 分鐘才有人發現。測試框架自帶的時間上限,擋不住某些永遠等不到回覆的等待。檢查程式加了一道牆鐘,超過時限就強制結束,日誌寫明這次結果不是對程式的判決。用螢幕睡著重現過真實卡住,牆鐘有響過。

截圖腳本同一天補了一刀。螢幕睡著時去截圖,系統原本只回「無法建立影像」。現在先問螢幕醒著沒有,睡著就停,把原因講完。

傍晚還接上 9 月 18 日的續集。驗收在我的設定資料夾裡找到 105 個測試留下的檔案,日期都是那天,檔名是另一組測試的前綴。那天裝上的守衛只認得一種檔名形狀,另一種整批漏網。每次跑完它都說沒看見,直到有人打開資料夾。守衛改成檔名看起來屬於測試的都要抓。誤報頂多多一行訊息。漏報會讓垃圾在我自己的設定裡繼續長。

沒有跑過的那一輪,沒有資格對程式下判決。

收尾

沒有數量的通過,跟那顆拿掉關鍵檢查、還照樣綠燈的測試,距離很近。差別是這次綠燈連程式都還沒碰到。

先不說了,我得去看下一輪開跑之前,螢幕是醒著的。

這件事發生於 2026 年 9 月 20 日,文章整理於 2026 年 10 月。