An Example of OUnit
The following example shows you how to create an OUnit test suite. There are some things in the example that might at first seem mysterious; they are discussed in the next section.
Create a file named sum.ml
, and put the following code into it:
let rec sum = function
| [] -> 0
| x::xs -> x + sum xs
Now create a second file named sum_test.ml
, and put this code into it:
open OUnit2
open Sum
let tests = "test suite for sum" >::: [
"empty" >:: (fun _ -> assert_equal 0 (sum []));
"one" >:: (fun _ -> assert_equal 1 (sum [1]));
"onetwo" >:: (fun _ -> assert_equal 3 (sum [1; 2]));
]
let _ = run_test_tt_main tests
(Depending on what editor you are using, you might now see
some errors about OUnit2 and Sum. Ignore those for the moment:
your code is correct, but your editor doesn't understand it yet.
We'll fix that later by creating a .merlin
file.)
Finally, run these commands:
$ ocamlbuild -pkgs oUnit sum_test.byte
$ ./sum_test.byte
You will get a response something like this:
...
Ran: 3 tests in: 0.12 seconds.
OK
Now suppose we modify sum.ml
to introduce a bug by changing the code
in it to the following:
let rec sum = function
| [] -> 1 (* bug *)
| x::xs -> x + sum xs
If rebuild and re-execute sum_test.byte
, all test cases now fail.
The output tells us the names of the failing cases. Here's the
beginning of the output, in which we've replaced some strings
that will be dependent on your own local computer with ...
:
FFF
==============================================================================
Error: test suite for sum:2:onetwo.
File ".../_build/oUnit-test suite for sum-...#01.log", line 8, characters 1-1:
Error: test suite for sum:2:onetwo (in the log).
Called from unknown location
not equal
------------------------------------------------------------------------------
The first line of that output
FFF
tells us that OUnit ran three test cases and all three failed.
The next interesting line
Error: test suite for sum:2:onetwo.
tells us that in the test suite named test suite for sum
the test case
at index 2 named onetwo
failed. The rest of the output for
that test case is not particularly interesting; let's ignore it for now.