I want to write some tests for my first OCaml project…
Alcotest seems popular(?), I am open to using Ounit or another library instead. I don’t want to do inline tests for now.
I’ve seen Dune provides a dune runtest
command which I’d like to use: Writing and running tests — dune documentation
…however I’m having trouble relating the high-level overview in the docs to a concrete scenario.
I have a directory structure like:
lib/
dune
mymodule.ml
tests/
mymodule.ml
I think I need a dune
file in tests/
too… I am unclear what it should contain though.
The docs for dune and alcotest show things like dune exec tests/mytests.exe
so I guess it needs to define an executable
. I have added one that looks like:
(executable
(name mymodule)
(modules mymodule)
(libraries alcotest))
it seems like I should have a (tests (names ???))
stanza in there too, but I can’t find a combination of incantations that works.
I would also like to be able to have multiple files under tests/
and be able to run them all or individually.
Can anyone recommend a complete end-to-end tutorial for setting up tests and running them with Dune?
3 Likes
Hi @anentropic,
I think you’re close to having a full set-up already, so I’ll try to respond to your questions directly:
-
the dune test
/ tests
stanzas are all that’s necessary for setting up test binaries. It’s not necessary to explicitly define these as executable
s – Dune does this for you. The difference is that binaries specified as test
s are attached to the @runtest
alias: this means that they’re hooked into dune runtest
/ dune test
.
-
define one test
for each test binary you want (or a single tests
stanza if you have multiple of them in the same folder). Then you can do:
-
dune test
, to run all test binaries.
-
dune build @path/to/test/dir/runtest
, to run all test binaries under “path/to/test/dir
”.
-
dune exec path/to/test/foo.exe
to run the test with name “foo
” in the folder “path/to/test
”.
Alcotest’s documentation is lacking w.r.t. explaining how to plumb the library into Dune. I’ll try to add something constructive soon.
2 Likes
Update…
with:
tests/
dune
one.ml
two.ml
I put this in my tests/dune
file:
(tests
(names one two)
(libraries
alcotest
mylib))
dune runtest
then ran the alcotest tests from both one
and two
… great!
But dune runtest one
gives:
Error: Don’t know about directory one specified on the command line!
Thank you @CraigFe for your reply, after reading that I see I can do:
dune exec tests/one.exe
to run just one file
However after doing that, when I go back and do dune runtest
nothing happens
1 Like
Have you tried dune runtest --force
? Dune will cache test outputs if it thinks nothing has changed. My go-to command is something like:
; dune runtest --force --watch --terminal-persistence=clear-on-rebuild
which re-runs the tests automatically while I’m working on the code.
(Perhaps worth adding that none of the above is specific to Alcotest: the process would be the same when using Ounit or any other unit-testing library, with the exception of those that work via inline_tests
or PPX. This is probably why the Alcotest docs don’t explain this properly – although that’s not a good excuse )
1 Like
Yeah, it’s maybe more on the Dune side it could use a more comprehensive example.
There is one snippet there like:
(tests (names test1 test2))
…but it’s not clear at all what that means, that it’s a top-level stanza, or how it fits with the other stanzas discussed and how it relates back to the files in the dir.