package bisect_ppx
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=d314648f84d74cdb333455dd7c8446c3ac6601dd54dae6e2fb46d78ea29bda8e
md5=1e87162003525cd853631dae5b4aea66
doc/README.html
Bisect_ppx

Bisect_ppx is a code coverage tool for OCaml and Reason. It helps you test thoroughly by showing what's not tested.
You can browse the report seen above online here.
Table of contents
- Sending to Coveralls
- Controlling coverage with
[@coverage off] - Other topics
- Bisect_ppx users
- Contributing
Usage
Dune
Refer to aantron/bisect-starter-dune, which produces this report.
Depend on Bisect_ppx in your
opamfile:depends: [ "bisect_ppx" {dev & >= "2.5.0"} "dune" {>= "2.7.0"} ]Mark the code under test for preprocessing by
bisect_ppxin yourdunefile:(library (public_name my_lib) (instrumentation (backend bisect_ppx)))Build and run your test binary. In addition to testing your code, when exiting, it will write one or more files with names like
bisect0123456789.coverage:find . -name '*.coverage' | xargs rm -f dune runtest --instrument-with bisect_ppx --forceThe
--forceflag forces all your tests to run, which is needed for an accurate coverage report.To run tests without coverage, do
dune runtestGenerate the coverage report in
_coverage/index.html:bisect-ppx-report htmlYou can also generate a short summary in the terminal:
bisect-ppx-report summary
esy
Refer to aantron/bisect-starter-esy, which produces this report.
The instructions are the same as for regular Dune usage, but...
Depend on Bisect_ppx in
package.json, instead of in anopamfile:"devDependencies": { "@opam/bisect_ppx": "^2.5.0" }, "dependencies": { "@opam/dune": "^2.7.0" }Use the
esycommand for the build and for running binaries:esy install esy dune runtest --instrument-with bisect_ppx --force esy bisect-ppx-report html
ReScript
Refer to aantron/bisect-starter-bsb, which produces this report.
Depend on Bisect_ppx in
package.json, and install it:"devDependencies": { "bisect_ppx": "^2.0.0" }, "dependencies": { "bs-platform": "*" }npm installIf you are using Yarn, you need to run an extra command because of yarnpkg/pkg#3421:
yarn add bisect_ppx yarn --check-filesIf pre-built binaries aren't available for your system, the build will automatically fall back to building Bisect_ppx from source using esy, which will take a few minutes the first time. If this happens, you may need to install esy, if it is not already installed:
npm install -g esy npm installAdd Bisect_ppx to your
bsconfig.json:"bs-dependencies": [ "bisect_ppx" ], "ppx-flags": [ "bisect_ppx/ppx" ]If you are using Jest, add this to your
package.json:"jest": { "setupFilesAfterEnv": [ "bisect_ppx/lib/js/src/runtime/bucklescript/jest.js" ] }Or, if you have enabled the
package-specs.in-sourceflag inbsconfig.json, replace the path by"bisect_ppx/src/runtime/bucklescript/jest.js"You can exclude your test cases from the coverage report by adding this to
bsconfig.json:"ppx-flags": [ ["bisect_ppx/ppx", "--exclude-files", ".*_test\\.res$$"] ]Usage with Jest requires Bisect_ppx version 2.4.0 or higher. See the aantron/bisect-starter-jest for a complete minimal example project. The repo produces this report.
If the tests will be running in the browser, at the end of testing, call
Bisect.Runtime.get_coverage_data();This returns binary coverage data in a
string option, which you should upload or otherwise get out of the browser, and write into a.coveragefile.Build in development with
BISECT_ENABLE=yes, run tests, and generate the coverage report in_coverage/index.html:BISECT_ENABLE=yes npm run build npm run test npx bisect-ppx-report.exe htmlTo exclude your test files from the report, change your PPX flags like so:
"ppx-flags": [ ["bisect_ppx/ppx", "--exclude-files", ".*test\\.re"] ]The last argument is a regular expression in the syntax of OCaml's
Strmodule. Note that backslashes need to be escaped both inside the regular expression, and again because they are inside a JSON string.Multiple
--exclude-filesoption can be specified if you want to provide multiple patterns.If your project uses both ReScript and native Dune, native Dune will start picking up OCaml files that are part of the ReScript
bisect_ppxpackage. To prevent this, add adunewith the following contents to the root of your project:(data_only_dirs node_modules)
Js_of_ocaml
Refer to aantron/bisect-starter-jsoo, which produces this report.
Follow the Dune instructions above, except that the final test script must be linked with
bisect_ppx.runtime(but not instrumented):(executable (name my_tester) (modes js) (libraries bisect_ppx.runtime))If the tests will run on Node, call this function at the end of testing to write
bisect0123456789.coverage:Bisect.Runtime.write_coverage_data ()If the tests will run in the browser, call
Bisect.Runtime.get_coverage_data ()to get binary coverage data in a string option. Upload this string or otherwise extract it from the browser to create a
.coveragefile.Build the usual Js_of_ocaml target, including the instrumented code under test, then run the reporter to generate the coverage report in
_coverage/index.html:dune build my_tester.bc.js --instrument-with bisect_ppx node _build/default/my_tester.bc.js # or in the browser bisect-ppx-report html
Ocamlfind, Ocamlbuild, and OASIS
- Ocamlbuild and OASIS instructions can be found at aantron/bisect_ppx-ocamlbuild.
With Ocamlfind, you must have your build script issue the right commands, to instrument the code under test, but not the tester:
ocamlfind opt -package bisect_ppx -c src/source.ml ocamlfind opt -c test/test.ml ocamlfind opt -linkpkg -package bisect_ppx src/source.cmx test/test.cmxRunning the tester will then produce
bisect0123456789.coveragefiles, which you can process withbisect-ppx-report.
Sending to Coveralls
bisect-ppx-report can send reports to Coveralls and Codecov directly from Travis, CircleCI, and GitHub Actions. To do this, run
bisect-ppx-report send-to Coverallsor
bisect-ppx-report send-to CodecovWhen sending specifically from GitHub Actions to Coveralls, use
- run: bisect-ppx-report send-to Coveralls
env:
COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_NUMBER: ${{ github.event.number }}Put these commands in your CI script in the same place you would run bisect-ppx-report html locally. See bisect-ci-integration-megatest for example CI scripts and current status of these integrations.
If you'd like Bisect_ppx to support other CI and/or coverage services, please send a pull request!
As a workaround for missing CI/coverage integrations, and for development, bisect-ppx-report can also generate a JSON report in Coveralls format, which can be uploaded to a service of your choice using a separate command. For example, to send manually from Travis to Coveralls:
bisect-ppx-report \
coveralls coverage.json \
--service-name travis-ci \
--service-job-id $TRAVIS_JOB_ID
curl -L -F json_file=@./coverage.json https://coveralls.io/api/v1/jobsFor other CI services, replace --service-name and --service-job-id as follows:
CI service |
|
|
|---|---|---|
Travis |
|
|
CircleCI |
|
|
Semaphore |
|
|
Jenkins |
|
|
Codeship |
|
|
GitHub Actions |
|
|
Note that Coveralls-style reports are less precise than the HTML reports generated by Bisect_ppx, because Coveralls considers entire lines as visited or not visited. There can be many expressions on a single line, and the HTML report separately considers each expression as visited or not visited.
Controlling coverage with [@coverage off]
You can tag expressions with [@coverage off], and neither they, nor their subexpressions, will be instrumented by Bisect_ppx.
Likewise, you can tag module-level let-declarations with [@@coverage off], and they won't be instrumented.
You can also turn off instrumentation for blocks of declarations inside a module with [@@@coverage off] and [@@@coverage on].
Finally, you can exclude an entire file by putting [@@@coverage exclude_file] into its top-level module. However, whenever possible, it is recommended to exclude files by not preprocessing with Bisect_ppx to begin with.
Other topics
See advanced usage for:
- Exhaustiveness checking.
- Excluding generated files from coverage.
- Environment variables.
Bisect_ppx users
A small sample of projects using Bisect_ppx:
Core tools
Libraries
Applications
Contributing
Bug reports and pull requests are warmly welcome. Bisect_ppx is developed on GitHub, so please open an issue.
Bisect_ppx is developed mainly using opam. To get the latest development version, run
opam source --dev-repo --pin bisect_ppxYou will now have a bisect_ppx subdirectory to work in. Try these Makefile targets:
make testfor unit tests.make usagefor build system integration tests, except ReScript.make -C test/bucklescript full-testfor ReScript. This requires npm and esy.
