Batteries uses a lot of tests, and we couldn't live without them.
In particularly, they make maintainer's life much easier (it's easier to make the decision to integrate code when, besides being nice to read, it is also well-tested), and that is key in a project with many small contributions, so a lot of integration work. It is mandatory for new functions proposed for inclusions to come with unit tests, which means that new code has more tests than old code (inherited from Extlib, with no tests). I would say that it is the most noticeable impact of tests: smoothing the code contribution and reviewing workflow.
I suspect the benefits of testing may be easier to reap for library-style projects (adapted to unit-testing) rather than final-executable-project (with more complex specification and more integration testing to do). But, in any case, all projects have a library part.
# Batteries' example: qtest/iTeml
As you can see, the tests are placed inside the modules, close to the implementation. The tool we use for that was initially created by Ilmari Heikkinen (for his Prelude.ml), lived inside Batteries for a long time, and was extracted as a separate project by Vincent Hugo, it is now called iTeML and found at
https://github.com/vincent-hugot/iTeML(It is completely independent from Batteries and everyone is encouraged to have a look.)
# Test extraction tools, and testing libraries
Other projects have their own preprocessing tools to manipulate tests. I don't have exhaustive knowledge of what is out there, but there is Jun Furuse's ppx_test (on top of the oUnit library). there is pa_ounit (
https://github.com/janestreet/pa_ounit ), and Janestreet also has pa_test and a PPX successor (also named ppx-test, I would guess). pa_ounit is the best documented of these projects, as it describes the execution model.