0

是否有可用于 Tcl 的自动测试用例生成?类似于 quickcheck 或 scala 检查?互联网搜索没有发现任何图书馆。

4

1 回答 1

2

tl; dr:我不知道,但是您可以很容易地在 tcltest 之上对其进行编码。


我查看了一些 QuickCheck 和 ScalaCheck 教程。有趣,但他们有一个问题是不能保证找到问题。这些例子都很好地展示了事情是如何工作的,当发现输入问题时,但使用随机输入模型(我怀疑泊松分布?)我真的认为找到上限或特定值的机会不大除非您确实提供了大量数据,否则失败。

还有一个问题是 Tcl 代码通常是有状态的。当你有状态时进行测试需要更复杂的方法。基本上,您通常需要一段额外的代码将系统置于您想要测试的状态,而另一段代码将系统该状态中取出并返回到静止状态。好的测试框架有这种东西,所以它实际上不是一个真正的问题。只是您需要注意的并发症。

但是我们可以利用 Tcl 几乎是一种特定于领域的语言这一事实​​来制作我们自己的小模糊测试器。(upvaranduplevel命令对于这类事情非常有用。)

package require tcltest 2

proc fuzzInteger {var from to count test} {
    upvar 1 $var v
    for {set i 0} {$i < $count} {incr i} {
        set v [expr {$from+int(rand()*($to-$from))}]
        uplevel 1 $test
    }
}
proc fuzzList {var P language count test} {
    upvar 1 $var v
    for {set i 0} {$i < $count} {incr i} {
        set v {}
        while {rand() <= $P} {
            lappend v [lindex $language [expr {int(rand() * [llength $language])}]]
        }
        uplevel 1 $test
    }
}

# Demonstrate by throwing random crap into 'lindex'; it should never produce an error
fuzzList abcList 0.5 {a b c} 500 {
    fuzzInteger foobar 0 20 500 {
        tcltest::test lindex-fuzztest-[incr count] "fuzzed: lindex {$abcList} $foobar" -body {
            lindex $abcList $foobar
        } -match glob -result *
    }
}
# Print the final report
tcltest::cleanupTests

在这种情况下,不需要状态设置/清理;这些将由 . 的-setupand-cleanup子句处理tcltest::test。另请注意,记录测试标题中使用了哪些模糊值在正文中进行替换是一个非常好的主意(顺便说一句,第二个更难;我上面的示例显示了第一个)。

于 2013-04-24T09:12:56.137 回答