【问题标题】:How to get name of TCL test from the test itself如何从测试本身获取 TCL 测试的名称
【发布时间】:2018-10-25 18:14:10
【问题描述】:

我想知道您如何从测试本身中找到您在 tcl 中运行的测试的名称?我在谷歌上找不到这个。

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

【问题讨论】:

  • 我不确定我是否理解...您能否提供一些您正在运行的代码以及您希望看到的代码?
  • Im calling a proc from a test case. As an input to the proc, Im 传入一个参数。该参数是调用 proc 的测试用例的名称。那么 TCL 中的哪个命令为您提供了您从中调用 proc 的测试的名称?抱歉,由于隐私,我无法提供代码,但仅此而已。

标签: tcl tk


【解决方案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 版本,因此这是一个合理的限制。

【讨论】:

  • 这也适用于其他样式的tcltest::test 调用;都将测试名称作为第一个参数。
  • 这对我不起作用,它返回整个文件路径,还有其他方法吗?我正在使用 tcl 8.5.4
  • 你不是从内部测试用例调用它。
  • 好的,还有其他方法吗?
  • 这是我得到的输出:源 [pSet 文件] 而不是我的测试名称。你知道问题出在哪里吗?
【解决方案2】:

我阅读了您的 cmets(“源...代替我的测试名称”)如下:您似乎 source 包含测试的 Tcl 脚本文件(以及 Donal 的检测 tcltest),而不是批量运行脚本从命令行: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 已经到了生命周期的尽头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多