我正在開發一個 TCL 專案,該專案的版本控制基于 Git。因此,為了生成高質量的代碼,我在 pre-commit 鉤子中設定了測驗的執行。
但是,即使它們被執行(跟蹤顯示在命令列中),并且其中一個測驗失敗,Git 也會執行提交。于是我手動啟動了鉤子檢查錯誤代碼,發現是null,解釋為什么Git不停止:
$ .git/hooks/pre-commit
FlattenResult-test PASSED
(...)
==== CheckF69F70 FAILED
==== Content of test case:
(...)
==== CheckF69F70 FAILED
$ echo $?
0
(啟動與測驗腳本,tclsh也導致$?是0。)
所以我的問題是關于最后一行:當 tcl 測驗之一失敗時,為什么$?等于0?我怎樣才能實作一個簡單的預提交鉤子,在失敗時停止?
我閱讀并重新閱讀了tcltest 檔案,但沒有看到有關此錯誤代碼的設定或資訊。而且我真的不想決議 tcl 測驗輸出,以檢查是否存在 ERROR 或 FAILED ...
uj5u.com熱心網友回復:
這取決于您如何運行測驗套件。通常你運行一個名為 tests/all.tcl 的檔案,它可能看起來像這樣:
package require Tcl 8.6
package require tcltest 2.5
namespace import tcltest::*
configure -testdir [file dirname [file normalize [info script]]] {*}$argv
runAllTests
最后runAllTests回傳一個布林值,指示成功 (0) 或失敗 (1)。您可以通過將最后一行更改為以下內容來使用它來生成退出代碼:
exit [runAllTests]
uj5u.com熱心網友回復:
我在我的一些測驗腳本中使用了這個重新定義:
# Exit non-zero if any tests fail.
# tcltest's `cleanupTests` resets the numTests array, so capture it first.
proc cleanupTests {} {
set failed [expr {$::tcltest::numTests(Failed) > 0}]
uplevel 1 ::tcltest::cleanupTests
if {$failed} then {exit 1}
}
uj5u.com熱心網友回復:
經過一些研究,我可以讓它發揮作用,盡管有幾個因素對我不利:
- 我不得不使用舊版本的TCL(8.5)與
tcltest版本2.3.4,其中runAllTests沒有回傳值; - 我忘了寫
cleanupTests在測驗腳本的最后,因為檔案并不清楚它的用法。(現在還不清楚。我只是發現如果你想讓你的測驗運行runAllTests,它是必需的,這真的不明顯)。
這是我的解決方案,主要基于Hai 的 DevBits 博客文章:
all.tcl
package require tcltest
::tcltest::configure (...)
proc ::tcltest::cleanupTestsHook {} {
variable numTests
set ::exitCode [expr {$numTests(Total) == 0 || $numTests(Failed) > 0}]
}
::tcltest::runAllTests
exit $exitCode
關于它的一些想法:
- 我添加
$numTests(Total) == 0了一個失敗條件:這意味著沒有找到測驗,這顯然是一個錯誤條件; - 這不會捕獲測驗配置中的例外,例如
source指向不存在檔案的命令,揭示測驗腳手架中的某些失敗。這會像error在其他測驗框架中一樣被捕獲(啊pytest,我想念你!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/345887.html
