1

我有类似的代码用于编写单元测试,我需要检查变量的值。

#first.tcl
proc test {a} {
   if {$a < 10} {
      set sig 0
   } else {
      set sig 1
   }
} 
#second.tcl unit testing script
source "first.tcl"
test 10
expect 1 equal to $sig
test 5
expect 0 equal to $sig

有什么办法可以访问变量“sig”的值,因为我无法更改第一个脚本。

4

1 回答 1

3

你有问题。问题在于,在第一个脚本中,sig是一个局部变量,在调用test终止时消失。事后你不能检查它。碰巧,结果test是分配给sig; 我不知道您是否可以将其用于测试目的。如果这足够了,您可以这样做(假设您有 Tcl 8.5;对于 8.4,您需要一个辅助过程而不是apply术语):

source first.tcl
trace add execution test leave {apply {{cmd code result op} {
    # Copy the result of [test] to the global sig variable
    global sig
    set sig $result
}}}

这会拦截(就像面向方面的编程一样)结果test并将其保存到全局 sig变量中。它没有做的事情对于测试代码中的问题是正确的:分配给一个变量,然后立即消失。


如果您要进行大量测试,请考虑使用 tcltest 来完成这项工作。这是用于测试 Tcl 本身的包,它可以让您非常轻松地编写执行脚本结果的测试:

# Setup of test harness
package require tcltest
source first.tcl

# The tests
tcltest::test test-1.1 {check if larger} -body {
    test 10
} -result 1
tcltest::test test-1.2 {check if smaller} -body {
    test 5
} -result 0

# Produce the final report
tcltest::cleanupTests
于 2012-09-05T08:59:54.727 回答