To run pytest with coverage at the terminal, run the following command.
$ py.test --cov
============================= test session starts ==============================
platform darwin -- Python 3.6.1, pytest-3.0.7, py-1.4.33, pluggy-0.4.0
rootdir: /Users/ericmjl/github/tutorials/data-testing-tutorial, inifile:
plugins: cov-2.3.1
collected 3 items
test_datafuncs.py ...
---------- coverage: platform darwin, python 3.6.1-final-0 -----------
Name Stmts Miss Cover
---------------------------------------
datafuncs.py 10 0 100%
test_datafuncs.py 11 0 100%
---------------------------------------
TOTAL 21 0 100%
=========================== 3 passed in 0.07 seconds ===========================
To see how many lines of code are tested, run the following command.
$ py.test --cov-report term-missing --cov
============================= test session starts ==============================
platform darwin -- Python 3.6.1, pytest-3.0.7, py-1.4.33, pluggy-0.4.0
rootdir: /Users/ericmjl/github/tutorials/data-testing-tutorial, inifile:
plugins: cov-2.3.1
collected 3 items
test_datafuncs.py ...
---------- coverage: platform darwin, python 3.6.1-final-0 -----------
Name Stmts Miss Cover Missing
-------------------------------------------------
datafuncs.py 10 0 100%
test_datafuncs.py 11 0 100%
-------------------------------------------------
TOTAL 21 0 100%
=========================== 3 passed in 0.04 seconds ===========================
Let's now take a look at what the output might look like with untested lines of code. Let's implement another data processing function, a function that clips data to be within a particular range.
First off, in contrast to what you've been doing before, first implement the function. It should:
clip(data, lower, upper), where:data is a numpy array-like data structure.lower is the lower-bound value.upper is the upper-bound value.lower to the value of lowerupper to the value of upperNote: This function is available in the numpy library. I would not recommend re-implementing this one, as numpy is generally available as part of the core data science stack. However, for the purposes of practice, we will break the "don't implement existing stuff" rule.
# In datafuncs.py
def clip(data, lower, upper):
data[data < lower] = lower
data[data > upper] = upper
return data
Now, run pytest.
$ py.test --cov-report term-missing --cov
You should see something like the following output.
test_datafuncs_soln.py .........
---------- coverage: platform darwin, python 3.6.1-final-0 -----------
Name Stmts Miss Cover Missing
------------------------------------------------------
datafuncs_soln.py 21 3 86% 38-40
test_datafunc_soln.py 63 0 100%
------------------------------------------------------
TOTAL 84 3 96%
Inside datafuncs.py, lines 38-40 were missing a test. That corresponds exactly to the new clip function we implemented. Now, go write a test for the clip function and check test coverage.
Possible test:
def test_clip():
data = np.arange(10)
arr = dfn.clip(data, 2, 8)
assert arr.min() == 2
assert arr.max() == 8
assert len(arr) == len(data)
Output from py.test:
test_datafuncs_soln.py ..........
---------- coverage: platform darwin, python 3.6.1-final-0 -----------
Name Stmts Miss Cover Missing
------------------------------------------------------
datafuncs_soln.py 21 0 100%
test_datafuncs_soln.py 69 0 100%
------------------------------------------------------
TOTAL 90 0 100%
In [ ]: