Since today morning, Scheme Power Tools includes out-of-the-box support for unit tests. This article serves as a short introduction to the testing framework. If you are only looking for the documentation, you can find it at http://mpacula.com/scheme-tools/docs/unit-testing.html.
Writing Tests
The testing framework was designed to be simple and hassle-free. It exposes two primary constructs: unit-test and test-suite. The unit-test macro takes a name and a sequence of expressions, and constructs a new unit test. For example:
(unit-test "example test" (assert-equal 5 (+ 2 3)) (assert-equal-fp 0 1e-14 1e-13) (assert (even? 3) "Expected the number to be even")
Multiple unit-test‘s can be combined using a test-suite. For instance:
(test-suite "Example Suite"
(unit-test "example test"
(assert-equal 5 (+ 2 3))
(assert-equal-fp 0 1e-14 1e-13)
(assert (even? 3) "Expected 3 to be even"))
(test-suite "My Embedded Suite"
(unit-test "test1"
(assert-equal 4 (* 2 2))
(assert-equal 4 (+ 2 2)))
(unit-test "test2"
(assert-equal 10 (* 3 3))
(assert-equal 6 (+ 3 3)))))
The code above defines a test suite “Example Suite“, with one unit test called “example test“, and an embedded test suite “My Embedded Suite“.
Running Unit Tests
Tests are run by calling enable-unit-tests first, and then invoking run-suite on the test suite of interest. The need to explicitly call enable-unit-tests allows tests to be embedded directly in the source files whose functionality they are testing, without them being executed every time the files are loaded.
When running a test, all errors are automatically handled and printed on the screen. Summaries with the number of passed and failed tests are also printed on a per-suite basis. For instance, when running the “Example Suite” defined earlier, the output should look like the following:
* Running "Example Suite"...
* Running "example test"... FAILED:
Expected the number to be even
* Running "My Embedded Suite"...
* Running "test1"... OK
* Running "test2"... FAILED:
Assertion failed. Expected: 10 but got: 9
-------------------------------------
SUITE SUMMARY (My Embedded Suite)
1/2 tests passed.
There was 1 failure.
-------------------------------------
-------------------------------------
SUITE SUMMARY (Example Suite)
1/3 tests passed.
There were 2 failures.
-------------------------------------
Asserts
The framework supports the following assert functions:
assert: the most generic of all asserts. Takes a value and an optional error message, and fails if the value is#f.assert-not: the inverse ofassert– fails if the supplied value is not #f.assert-equal: takes anexpectedandactualvalue, and verifies that the two are equal (usingequal?).assert-equal-fp: likeassert-equal, but for floating point numbers. Takes an optional third parameterprecision(default value1e-9), which specifies the maximum amount by which the two numbers can differ.
As always, your feedback is greatly appreciated. Happy coding!
Trackbacks