Testo is a test framework for OCaml that takes inspiration from its predecessor Alcotest and from pytest. Features include:
support for explicit XFAIL tests i.e. tests that are expected to fail, indicating that they should be fixed eventually;
support for test snapshots i.e. persistent storage of captured stdout or stderr;
reviewing and approving tests without re-running them;
nested test suites;
various ways to select tests;
parallel execution (using multiprocessing);
supports OCaml >= 4.08.
Like with Alcotest, a test executable is generated from a list of tests written in OCaml. The function to interpret the command line and run things is Testo.interpret_argv. The core subcommands supported by a test executable are:
run: run tests
status: check the status of the tests without re-running them
approve: approve test output and make it the new reference
A test is fundamentally a name and test function of type unit -> unit. A test is considered successful if the test function returns normally and is considered failed if it raises an exception. A test is created with Testo.create which takes a variety of options in addition to the name and the test function.
Testo doesn't provide a library for writing assertions. Using the Alcotest module for this is recommended. For example, checking that some test result res equals an expected value of 42 is written as:
Alcotest.(check int) "equal" 42 res;
This raises an exception that is turned into a nice error message.