如何从测试本身获取TCL测试的名称

时间:2018-10-25 18:14:10

标签: tcl tk

我想知道如何从测试本身中找到在tcl中运行的测试的名称?我在Google上找不到此内容。

我正在调用另一个proc,并传递调用它的测试的名称作为参数。因此,我想知道哪个tcl命令可以为我做到这一点。

2 个答案:

答案 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已达到使用寿命。