是否为Tcl生成了自动测试用例?类似于quickcheck或scala检查?互联网搜索没有透露任何图书馆。
答案 0 :(得分:2)
tl; dr:我没有注意到任何事情,但你可以在tcltest之上轻松编写代码。
我查看了一些QuickCheck和ScalaCheck教程。有趣,但他们有不保证找到问题的问题。这些例子很好地展示了当事情能够发挥作用,当发现短输入时出现问题时,但是使用了随机输入模型(我怀疑的泊松分布?)我真的不认为找到的机会很多上限或特定值失败,除非您确实输入了大量数据。
还有一个问题是Tcl代码通常是有状态的;当你掌握状态时进行测试需要更复杂的方法。基本上,你一般需要一段额外的代码才能将系统置于你想要测试的状态,而另一段代码则需要系统 out 该州的状态并将其恢复到静止状态。好的测试框架有这样的东西,所以它实际上不是一个真正的问题。只是一个你需要注意的复杂功能。
但是我们可以使用这样一个事实:Tcl几乎是所有特定于域的语言来制作我们自己的小模糊测试器。 (upvar
和uplevel
命令对于这类事情非常有用。)
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
在这种情况下,不需要进行状态设置/清理;这些将由-setup
和-cleanup
条款处理tcltest::test
。另请注意,通过在正文中进行替换来记录测试或标题中使用的模糊值是一个非常好的主意(第二个更难,BTW;上面的示例显示了第一个)