Prove It
建立一個狹義的聲明:同一個測試在修復前能捕捉到指定的缺陷行為,並在修復後通過測試。僅有測試套件通過並不能證明這一點。
選擇見證者
檢查修復程式碼與相關測試。識別預期的輸入/輸出或狀態轉換,並選擇確切的一個 pytest 節點。使用兩個已提交的本地 Git 參考;after 參考必須同時包含修復程式碼與測試。未提交的編輯不會被納入。不要為了執行此工具而提交他人的程式碼。
缺陷斷言需要一個特定的訊息,例如:
assert expired(now=10, deadline=10), "PROVEIT:expiry-boundary"
該訊息必須位於所選測試函數中的斷言上。不要將其放在無關的斷言、fixture、應用程式程式碼或 print 語句中。檢查此斷言確實觀察到錯誤描述的行為。如果現有測試需要一個訊息,只能在授權的編輯範圍內添加,並將該測試納入 after 修訂版本中。否則,請解釋缺乏輸入的原因。
執行比較
使用其絕對安裝路徑執行捆綁的腳本。所選的直譯器需要已安裝 pytest 以及專案的相依套件。不會執行相依套件安裝、網路存取、Git checkout、reset、stash 或 commit。
python <skill-directory>/scripts/proveit.py --repo <repository> --before <old-ref> --after <fixed-ref> --test tests/test_expiry.py::test_at_deadline --expect PROVEIT:expiry-boundary --output <new-directory-outside-repository>
執行器會將 after 修訂版本的所選測試檔案覆蓋到兩個快照上,每次嘗試使用全新的副本,預設每個修訂版本執行三次,每次執行超時 10 秒。僅在任務需要時才使用 --python、--repeat 2..5 或 --timeout。如果測試是參數化的,請選擇完整的參數 ID。
快照隔離檔案,而非執行環境。僅執行在當前環境中已被授權執行的程式碼。測試保留使用者的檔案系統、網路和憑證存取權限。不要將暫存目錄解讀為安全沙箱。切勿清理無關的工作樹或目錄。執行器只會移除其自身的暫存快照,並保留證據目錄以供審查。
審查證據
閱讀 report.md、report.json、selected-test.py、fix.diff 以及相關日誌。檢查觀察到的斷言、所選的節點、階段記錄以及變更的路徑。
| 結果 | 解釋 | 退出碼 |
|---|---|---|
supported | 每次舊版本執行都命中宣告的斷言;每次新版本執行都通過。 | 0 |
not_supported | 舊測試也通過,或修復後的修訂版本仍然命中該斷言。 | 1 |
inconclusive | 環境、無關的失敗、超時、跳過、不完整或不穩定的執行。 | 2 |
即使新修訂版本通過,無關的呼叫失敗也屬於 inconclusive。集合、相依套件、語法、setup 和 teardown 的失敗永遠不是見證者。不要將其重新標記為捕捉到的錯誤。在範圍內解決觀察到的原因,並重新執行到一個新的證據目錄中;不要重複執行未變更的失敗設定。
在接受 supported 結果之前,檢查修訂版本特定的 fixtures/configuration,並確認它們不能解釋行為的變化。只有所選的測試檔案會被覆蓋。已安裝的相依套件是共享的,第三方 pytest 外掛程式的自動載入功能已停用,並且專案的 addopts 已被清除。需要外部外掛程式或建置的專案可能需要一個單獨準備的環境;請如實報告不支援的執行情況。
報告測試、參考、結果、證據位置以及重大限制。說明此見證者在這些執行中捕捉到了指定的行為。不要聲明證明了整體正確性、消除了不穩定性、一般測試品質或可衡量的生產力提升。未經審查並獲得適用的發佈授權,請勿發佈包含本機路徑或日誌的報告。