正確性預言(Correctness Oracles)
選擇一個能夠反駁承諾行為的觀察。具體說明成功檢查留下的未測試部分:計數比較、結構檢查與依賴見證者會觀察到不同的屬性(NoREC 實作、SQLite 完整性檢查、Elle §4.3)。
從實際邊界推導檢查
閱讀目標的啟用配置、公開生產者與治理合約。識別合法的起始狀態、操作前提、允許的錯誤與承諾的邊界:一次操作、陳述式、交易、復原或觀察到的歷史。在 SQLite 中,ABORT 會復原一條陳述式,而延遲外部鍵「直到交易嘗試 COMMIT 時才會被檢查」(SQLite ABORT、延遲外部鍵)。盡可能查詢有效設定;例如 SQLite 的外部鍵設定「在交易內是空操作」(SQLite foreign_keys)。
在擴展搜索之前,撰寫一個具體的候選觀察:
- 承諾: 明確禁止的結果或效果,附帶合約引用。
- 觀察: 實際回傳的內容、狀態或見證者,能區分該違規與允許行為。
- 前提與盲點: 支援的配置、有效狀態、遺漏的資訊與無法區分的執行。
- 重現證據: 輸入與初始狀態、操作順序、有效配置與原始觀察。
這是一個精簡的設計慣例,而非必要的架構。其目的是揭露提議檢查所遺失的資訊;Elle 的觀察模型說明為何僅靠生成更多歷史無法恢復隱藏的依賴:盲目暫存器寫入會「破壞歷史」(Elle §§3–4.3)。閱讀合約範例以了解已處理的邊界。
在 JavaScript 中,process exit 碼、測試執行器狀態或乾淨的 console 就是這樣的觀察:其意義取決於有效模式、已安裝的監聽器、執行器配置與建構。在安裝了 uncaughtException 處理程式的情況下,Node 的 process「將以 0 退出」,除非該處理程式設定了 process.exitCode(Node process, uncaughtException)。閱讀 JavaScript 觀察通道 以了解關於 Node、測試執行器、React 與 Playwright 的通道。
保持觀察獨立於可疑行為
追蹤預期值或不變量是如何取得的。識別可能讓目標與檢查者同意相同錯誤答案的共享程式碼與假設。偏好有根據的抽象模型、獨立指定的不變量或有效的關係,而非複製的生產演算法。第二個實作是一種選項:SQLite 的 SQL Logic Test 會在多個引擎上執行陳述式,並檢查「它們是否都得到相同的答案」。相同引擎的關係則是另一種:SQLite 使用停用最佳化的方式重新執行測試套件,而 SQLancer 的 NoREC 則比較最佳化查詢與未最佳化查詢(SQLite 測試 §2、§9、NoREC 實作)。
測量實際比較的資訊。相等的列數並不能建立列的同一性;健康的 integrity_check 並不能建立參考完整性,因為它「不會發現 FOREIGN KEY 錯誤」。保留有效的部分檢查,且僅在目標保證需要時才添加互補的觀察(NoREC 實作、SQLite 完整性檢查)。在選擇參考、正規化或見證者時,閱讀部分觀察。
檢查允許的錯誤及其影響
獨立於回傳狀態推導允許的後續狀態。SQLite 的 ABORT 與 FAIL 都會回傳約束錯誤,但 ABORT 會復原失敗的陳述式,而 FAIL「不會復原失敗 SQL 陳述式中先前的變更」。僅以錯誤為基礎的斷言可能會遺漏錯誤的影響;全面的回滾斷言則可能拒絕合法的行為(SQLite 衝突策略)。
為實際承諾選擇一個觀察者,並具有有效的前提。對於 SQLite 參考性檢查,使用適用的外部鍵觀察、有效的強制設定與合法的 NULL 語義;不要替換為通用的完整性結果(SQLite 外部鍵、foreign_key_check)。這些是已處理的合約,而非任意 API 的預設值。
保留檢查的結果與限制
每當該差異影響結論時,區分已評估的屬性與被拒絕的輸入、預期錯誤、跳過的檢查與不足的觀察。NoREC 在任一計數為其 -1 哨兵值(例如,在預期查詢錯誤後)時跳過比較,而不是將其計為相等,並將意外的錯誤報告為失敗。Elle 的完整性取決於記錄的資訊,且「觀察很少是完整的」(NoREC 實作、Elle §4.3)。
使用 harness-sensitivity 來建立觀察能夠到達並拒絕一個具有代表性且獨立正當的違規。保留原始見證者以進行 evidence-based-triage:Elle 本身的文件建議「手動檢查報告的異常」,而不是將標籤視為最終權威(Elle README)。一般的搜索分配應屬於 bugfinding-campaign。
將所選的專業推理路由到 semantic-differential-testing、metamorphic-testing、linearizability-checking、transactional-history-testing、numerical-oracles、resource-complexity-testing 或 liveness-testing;此技能擁有合約到觀察的決策權。閱讀常見錯誤以了解誤導性的捷徑。
回傳可用的預言
回傳生產者、引用的保證、有效的前提、可執行的觀察與結果解讀,並附帶已處理的允許/禁止區分。說明哪些是不可觀察的,以及哪些證據必須在重現時保持完整。一個有見證的矛盾僅支持實際檢查的保證與假設(Elle §§4.3 與 9)。