Reputation: 16349
I am struggling to get coverage.py to work with my Flask application.
I am trying to set it up via the subprocess instructions: http://nedbatchelder.com/code/coverage/subprocess.html
In my create_app()
function (which is an application factory) I have the following:
if settings.FLASK_ENV == 'TEST':
coverage.process_startup()
In my test suite I have the following:
# Need to add the 'COVERAGE_PROCESS_START' environment variable for subprocesses
if os.getenv('COVERAGE'):
test_env['COVERAGE_PROCESS_START'] = 'tests/.coveragerc'
test_env['FLASK_ENV'] = 'TEST'
test_process = subprocess.Popen(["gunicorn", "run_server:app", '--log-level=warning', '-w 1', '-b {host}:{port}'.format(host='127.0.0.1',port=port())],
env=test_env)
And at the conclusion of my tests I do ...
coverage.save()
coverage.combine()
percent_covered = coverage.html_report(directory='covhtml')
print "Percent Covered: {}".format(percent_covered)
coverage.stop()
But alas .. the coverage reports does not seem to be be combining
Note: Before combine is called if I ls -alt
the directory I see a listing like so ...
-rw-r--r-- .coverage.Jonathans-MacBook-Pro-3.local.49352.501916
-rw-r--r-- .coverage.Jonathans-MacBook-Pro-3.local.49352.931352
For completeness, my .coveragerc is simply:
[run]
parallel = True
Would love a point in the right direction -- thanks!
Upvotes: 6
Views: 5114
Reputation: 16349
Got it working -- thanks to some guidance from @NedBat.
The issue was the gunicorn was spawning off additional subprocesses -- and those where not being monitored.
To solve this I needed to leverage the site module's sitepackage.py feature. Which in total fairness was documented http://nedbatchelder.com/code/coverage/subprocess.html -- but I was just doing it wrong.
You need to create that sitepackage.py
file and place it in your site-packages
folder. And then any process (or subprocess) that runs in the environment will execute that file before starting the process.
Upvotes: 2
Reputation: 22846
If you use nose for testing, then it's pretty trivial. Just run:
nosetests --with-coverage --cover-package=yourpackagename--cover-html --cover-erase
Upvotes: 0