Chapter 2. Getting Started

In the Ocaml module 'tests.ml' where your tests will reside, import module OUnit

    open OUnit
  
Define test cases as appropriate
    let test1 = 
      TestCase (fun _ -> 
        assert_equal "x" (unity "x"));; 

    let test2 = 
      TestCase (fun _ -> 
        assert_equal 100 (unity 100));;
  
Name the test cases and group them together::
    let suite = TestLabel ("suite", 
                  TestList [ TestLabel ("test1", test1); 
                             TestLabel ("test2", test2)]);;
  
And compile the module
    $ocamlfind ocamlc -c tests.ml
    File "tests.ml", line 3, characters 48-51:    Unbound value foo
  
Now it is time to program 'foo', create a new module named 'foo.ml', and type
    let unity a = a
  
And compile
    $ocamlc -c foo.ml
  
The 'Foo' module must now also be opened in the 'Tests' module, so we need to add the following line.::
    open Foo
  
Now it is possible to compile test.ml
    $ocamlc -c foo.cmo tests.ml
  
With the ocamlunit toplevel it is possible to run the tests interactively
    $ ./ocamlunit
    #         Objective Caml version 3.04

    # load "tests.cmo";;
    # OUnit.run_test_tt Tests.suite;;
    ..
    Ran: 2 tests in: 0.00 Seconds
    OK
    - : OUnit.counts =
    {OUnit.cases = 2; OUnit.tried = 2; OUnit.errors = 0; OUnit.failures = 0}
    #
  
You can specify the tests even more succinctly using special operators.
    let suite = 
      "suite" >::: ["test1" >:: test1; "test2" >:: test2;];;
  
It is also possible to add the following line to the 'Tests' module.
    let _ = 
      run_test_tt suite
  
When compiled as follows:
    $ocamlfind ocamlc -o tests -package oUnit -linkpkg foo.cmo tests.ml
  
A executable named 'tests' will be created. When run it produces the following output.
    $ ./tests
    ..
    Ran: 2 tests in: 0.00 Seconds
    OK
  
Test Case A test case is the unit of test execution. That is distinct test cases are executed independently. The failure of one is independant of the failure of any other, provided the test case does not rely on side-effects.