我想知道如何从测试本身中找到在tcl中运行的测试的名称?我在Google上找不到此内容。
我正在调用另一个proc,并传递调用它的测试的名称作为参数。因此,我想知道哪个tcl命令可以为我做到这一点。
答案 0 :(得分:1)
这不是鼓励的用例…但是如果直接在测试中使用它,则可以使用info frame 1
来获取信息。
proc example {contextTest} {
puts "Called from $contextTest"
return ok
}
tcltest::test foo-1.1 {testing the foo} {
example [lindex [dict get [info frame 1] cmd] 1]
} ok
这假定您使用的是Tcl 8.5或更高版本,但是Tcl 8.5是当前支持的最早的Tcl版本,因此这是一个合理的限制。
答案 1 :(得分:1)
我按如下方式阅读了您的评论(“源...测试名称”):您似乎source
包含测试(和Donal的tcltest)的Tcl脚本文件,而不是批量运行在命令行中输入以下脚本:tclsh /path/to/your/file.tcl
在此设置中,将有一个额外的(“ eval”)堆栈帧,该堆栈帧会扭曲内省。
要使Donal的工具更可靠,我建议实际上走Tcl堆栈并注意有效的tcltest框架。可能如下所示:
package req tcltest
proc example {} {
for {set i 1} {$i<=[info frame]} {incr i} {
set frameInfo [info frame $i]
set frameType [dict get $frameInfo type]
set cmd [dict get $frameInfo cmd]
if {$frameType eq "source" && [lindex $cmd 0] eq "tcltest::test"} {
puts "Called from [lindex $cmd 1]"
return ok
}
}
return notok
}
tcltest::test foo-1.1 {testing the foo} {
example
} ok
这将同时以以下方式返回“从foo-1.1调用”:
$ tclsh test.tcl
Called from foo-1.1
和
$ tclsh
% source test.tcl
Called from foo-1.1
% exit
使用的Tcl版本(8.5、8.6)不相关。但是,建议您升级到8.6,8.5已达到使用寿命。