RHS Tcltest is an amazing little package for writing simple unit type tests. However, there are a lot of things that tcltest makes it very hard to do. There are other things that aren't hard to do, but make the tests that do them hard to read. I'd like to put together a list of desired functionality for a new test package, in hopes of eventually writing such a beast (or, someone else coming along and writing it). The things I'm looking for are:
test myComplexTest-1.1 { A sample of a complex test, with comments } -setup { set data {a 1 b 2 c 3} set filename [extrapackage::makeFile $data myComplexTestFile-1.1] catch {unset myArray} catch {unset expectArray} ; array set expectArray $data } -body { set code [readFileToArray $filename myArray] assertEquals -nofail 1 $code "The read failed, don't bother with other assertions" assertEquals -nofail 1 [info exists myArray] "The array did not get created" assertArrayEquals expectArray myArray "The array results were incorrect" }
I'm sure I can come up with other requirements. More importantly, though, is... what would other folks want in a testing package?
RHS 20August2004 It occurs to me that it would be useful to have a -description element also. This would be different from the short description that is the 2nd argument to the test, in that it would be a clear explanation of what functionality/requirement is being proven by this test. The idea is that one could ask the test suite for a summary of all the tests, and it would print out the test names along with thier longer description.... which could be used as a way to document what the current requirements for the project are.
On the other hand, perhaps I should just be using the provided description arguement to better use. I tend to keep that arguement as short and direct as possible. Perhaps I should be adding more detail there. I do, however, like the idea of being able to do something like:
test myproc-2.1 { Throw an typed error if class is out of range } -description { The 'class' parameter can have a value from 0 to 6. If the provided value is outside that range, throw a typed error. } -body { foreach class {-1 7} { set code [catch {myproc $class} result] assertEquals -nofail 1 $code "Proc call did not throw an error" assertEquals {CALLER {INVALID PARAMETER VALUE}} $::errorCode assertEquals \ "Invalid value '$class' for input class. Must be between 0 and 6, inclusive" \ $result "Error message was incorrect" } }
And then be able to automatically get a summary like
When one gets the summary for the entire test suite(s) for a project, it should be a complete summary of all the requirements for the project.