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 anexpected
andactual
value, 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