盲測套件
此套件是從合約中衍生出的獨立證據,而非符合性的定義;因此,測試失敗表示實作或測試有誤,而非合約有誤。
test-writer 決定每個測試的形式,而 test-oracle-reviewer 則決定什麼構成獨立值;此技能即是圍繞它們的隔離機制。
作者所見
合約檔案、其所依據的介面(合約 crate 或模組、其型別與文件),以及已發布的來源:規格文件、供應商提供的向量、網路封包擷取。 不包含實作、先前的實作,或用於產生合約的 pull request,因為這些都承載著對合約的解讀,而套件只會確認這種解讀而非加以測試。 當實作存在時,作者是在一個不含該實作的 commit 上建立的新工作目錄;一份禁止閱讀清單輔助此機制,但無法取代它,因為看過實作的上下文無法抹去記憶。
預期值
來自測試中引用的已發布來源、合約陳述的屬性,或由合約或引用的標準固定的推導方法,其結果記錄在向量旁,以便審查者可以重新推導;絕非來自僅能由合約實作進行的計算,因為檢查這樣的值等同於重新實作合約。 一個推導出的向量必須考慮到變更所觸及的所有耦合欄位 - 長度、校驗和、簽名 - 否則其結果就不符合推導所聲稱的內容。 當不存在已發布的答案時,跨實作比較輸出;差異檢查從不單獨存在,因為兩者共有的錯誤會使它通過。 手工編寫的負面輸入僅在目標維度上與獨立有效的控制項不同,因此測試只會因其所指稱的原因而失敗;一條指稱被拒絕輸入的規則會獲得一個這樣的輸入,因為只透過接受來測試的規則,接受一切輸入也能滿足。 供應商來源記錄了來源、版本和校驗和,整體採用或在其自身章節邊界處截取,且從不編輯,因為經過編輯或裁剪的向量會失去使其成為預言機的來源證明。 在套件旁保留一份覆蓋率記錄:哪個測試檢查哪一條款、哪些條款僅透過審查驗證,以及故意不檢查的邊界,這樣沉默就不會被誤認為覆蓋。
審查與合併
審查者執行 test-reviewer,並從兩個方向檢查合約與覆蓋率記錄:每條條款都有測試或記錄的缺口,每個測試都引用其條款。
在實作之前撰寫套件;一旦有實作通過測試,就將其合併,這樣在測試綁定所有後續實作之前,就會發現沒有符合規格的實作能通過的測試。
實作期間唯讀
實作的 pull request 從不編輯套件或合約。 看似錯誤的測試,或沒有測試的條款,會連同向量或條款、預期值和觀測值,以及引用的來源一起上報。 修正會導向擁有該套件的 pull request — 若該 pull request 處於開啟狀態則透過其負責人,若已合併則建立一個新的 — 由具有相同輸入的新作者執行,該作者接收決策而非實作的輸出,以保持套件為盲測。