# Continuous integration in Python, 5: report test coverage using Coveralls

Travis runs whatever commands you tell it to run in your .travis.yml file. Normally, that's just installing your program and its requirements, and running your tests. If you wanted instead to launch some nuclear missiles, you could do that. (Assuming you were happy to put the launch keys in a public git repository... =P)

The Coveralls service, once again free for open-source repositories, takes advantage of this: you just need to install an extra piece of software from PyPI, and run it after your tests have passed. Do so by adding the line pip install coveralls to your before_install section, and just the coveralls command to a new after_success section:

language: python
python:
- "2.7"
- "3.4"
before_install:
- pip install pytest pytest-cov
- pip install coveralls
script:
- py.test
after_success:
- coveralls


This will push your coverage report to Coveralls every time Travis is run, i.e., every time you push to your GitHub repository. You will need to turn on the service by:

• going to coveralls.io and signing in with your GitHub credentials
• clicking on "Repositories", and "Add Repo" (and perhaps on "Sync GitHub Repos", top right)
• switching your repository's switch to "On"

That's it! With just two small changes to your .travis.yml and the flick of a switch, you will get continuous monitoring of your test coverage with each push, and also with each pull request. By default, Coveralls will even comment on your pull requests, so that you instantly know whether someone is not testing their submitted code!

Plus, you get a swanky web dashboard to monitor your coverage!

Tune in tomorrow for the final chapter in continuous integration in Python: showing off! No, it's not a blog post about blogging about it. =P

(Addendum: the above .travis.yml will run Coveralls twice, once per Python version, so it will also comment twice for your PRs, notify you twice, etc. If you want to test more Python versions, the problem multiplies. Therefore, you can choose to call Coveralls only for a specific Python version, like so:

after_success:
- if [[ \$ENV == python=3.4* ]]; then
coveralls;
fi


This is the approach taken by the scikit-image project.)