Jonathan
Jonathan

Reputation: 16349

Setting up coverage.py with flask

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

Answers (2)

Jonathan
Jonathan

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

Matteo Pacini
Matteo Pacini

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

Related Questions