# Writing Testable Numerics Code¶

Here's the contents of a file containing numerics code:

In [15]:
!pygmentize norms.py

import numpy as np

def norm_1(ary):
"""Computes the 1-norm of vectors or matrices *ary* passed in as numpy arrays."""

if len(ary.shape) == 1:
return np.sum(np.abs(ary))
elif len(ary.shape) == 2:
return np.max(np.sum(np.abs(ary), axis=1))
else:
raise ValueError("ary must be vector or matrix")


Note:

• Docstring
• Defensive programming
In [16]:
!pygmentize test_norms.py

import numpy as np

def test_norm_1():
from norms import norm_1

for i in range(10):
A = np.random.randn(20, 20)
x = np.random.randn(20)

assert norm_1(A@x) <= norm_1(A) * norm_1(x)

• Now use pytest to run the test.
In [17]:
!python -m pytest

============================= test session starts ==============================
platform linux -- Python 3.7.2+, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: /home/andreas, inifile: pytest.ini
plugins: celery-4.2.1
collected 1 item

test_norms.py .                                                          [100%]

=========================== 1 passed in 0.13 seconds ===========================


A typical use for these tests would be to run them on every commit to a codebase.

Example: https://github.com/inducer/boxtree (click the "Pipeline" button)

In [ ]: